#java #android #listview #parse-platform
#java #Android #listview #синтаксический анализ-платформа
Вопрос:
В моей основной деятельности есть хэш-карта, которая получает данные с сервера синтаксического анализа для передачи в пользовательский класс адаптера представления списка.
Когда я нажимаю кнопку в строке моего представления списка, я хочу, чтобы текст менялся при каждом нажатии на него. Однако текст в строке изменяется только при однократном нажатии кнопки. Если я нажму на это снова, ничего не произойдет. Я предполагаю, что это как-то связано с тем, что мой notifyDataSetChanged()
неправильно вызван.
Кнопка и textview настроены в классе адаптера пользовательского представления списка. Должен ли я вызывать notifyDataSetChanged()
в своей основной деятельности или в своем классе адаптера пользовательского представления списка?
customFeedListViewAdapter.notifyDataSetChanged();
В моем MainActivity позволяет мне успешно изменять текст при однократном нажатии кнопки. Однако, когда я снова нажимаю кнопку, ничего не происходит.
Основное действие:
customFeedListViewAdapter = new CustomFeedListViewAdapter(this, arrayFeedList);
feedList = (ListView) findViewById(R.id.feedListView);
feedList.setAdapter(customFeedListViewAdapter);
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("FeedItem");
ParseUser.getCurrentUser().getUsername());
query.addDescendingOrder("createdAt");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if(e == null){
for(ParseObject object: objects){
HashMap<String, String> data = new HashMap<String, String>();
data.put("user", (object.getString("username")));
data.put("feed", (object.getString("textItem")));
data.put("likes", String.valueOf(object.getInt("likes")));
data.put("replies",String.valueOf(object.getInt("comments")));
object.saveInBackground();
arrayFeedList.add(data);
customFeedListViewAdapter.notifyDataSetChanged();
}
customFeedListViewAdapter = new CustomFeedListViewAdapter(getApplicationContext(), arrayFeedList);
feedList.setAdapter(customFeedListViewAdapter);
}
}
});
Пользовательский адаптер ListView:
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
position = i;
final int likes[] = new int[feed.size()];
final ViewHolder holder;
if (view == null) {
view = inflater.inflate(R.layout.feed_list_row, viewGroup, false);
holder = new ViewHolder();
holder.feedProfilePic = (ImageView) view.findViewById(R.id.feedProfilePic);
holder.feedUsername = (TextView) view.findViewById(R.id.feedUsernameId);
holder.feedNumOfLikes = (TextView) view.findViewById(R.id.feedNumofLikes);
holder.feedFeedItem = (TextView) view.findViewById(R.id.feedTextId);
holder.feedDate = (TextView) view.findViewById(R.id.feedDate);
holder.feedNumofReplies = (TextView) view.findViewById(R.id.feedRepliesNumId);
holder.feedUpVoteButton = (Button) view.findViewById(R.id.feedUpVoteButton);
holder.feedDownVoteButton = (Button) view.findViewById(R.id.feedDownVoteButton);
holder.feedCommentButton = (Button) view.findViewById(R.id.feedCommentButton);
holder.feedListView = (ListView) view.findViewById(R.id.feedListView);
view.setTag(holder);
HashMap<String, String> mFeed = new HashMap<>();
mFeed = feed.get(i);
holder.feedUsername.setText(mFeed.get("user"));
holder.feedFeedItem.setText(mFeed.get("feed"));
holder.feedDate.setText(mFeed.get("date"));
holder.feedNumOfLikes.setText(mFeed.get("likes"));
likesString = mFeed.get("likes");
mLikes = Integer.valueOf(likesString);
holder.feedNumofReplies.setText(mFeed.get("replies"));
position = i;
}
else{
position = i;
holder = (ViewHolder) view.getTag();
}
holder.feedUpVoteButton.setTag(position);
holder.feedDownVoteButton.setTag(position);
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("FeedItem");
query.addDescendingOrder("createdAt");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(final List<ParseObject> objects, ParseException e) {
if(e == null){
for (final ParseObject object : objects) {
holder.feedUpVoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = (Integer) v.getTag();
parseObFeed = objects.get(pos);
likes[pos] = mLikes;
Log.i("yo","Check1: Get Likes from Parse: " String.valueOf(likes[pos]));
likes[pos] = 1;
Log.i("yo","Check2: add 1: " String.valueOf(likes[pos]));
parseObFeed.put("likes", likes[pos]);
Log.i("yo","Check3: Put Likes in Parse: " String.valueOf(likes[pos]));
parseObFeed.put("upClicked", true);
parseObFeed.saveInBackground();
holder.feedNumOfLikes.setText(String.valueOf(parseObFeed.getInt("likes")
));
Log.i("yo","Check4: Get Likes in Set Text: " String.valueOf(likes[pos]));
}
}
}
});
return view;
}
private class ViewHolder {
ImageView feedProfilePic;
TextView feedUsername;
TextView feedNumOfLikes;
TextView feedFeedItem;
TextView feedDate;
TextView feedNumofReplies;
Button feedUpVoteButton;
Button feedDownVoteButton;
Button feedCommentButton;
ListView feedListView;
}
Комментарии:
1. вызовите notifyDataSetChanged() внутри нажатия кнопки
2. я сделал список массивов глобальным и в конце моего нажатия кнопки.. Я удалил индекс, затем добавил пользовательский интерфейс и вызвал
notifyDataSetChanged();
, я все еще отлаживаю, но, похоже, это сработает.