getView
メソッドはCommentsAdapter
クラスにあり、基本的にユーザーはupvoteカウントを表示しながらコメントセクションでコメントをupvoteまたはdownvoteできます。対応するUIの変更(upvotedの場合は青いボタン、upvotedの場合はオレンジ)を使ってupvote(upvoteを元に戻す)することができます。Androidでリフレッシュするためにスワイプした後にUIを変更する方法
しかし、一度画面を更新すると、アップボートされたかどうかに関係なく、ボタンは常に青色に戻り、投票数は元のカウントに戻ります。私はデータベースをチェックし、正しいupvoteカウントとアクションが記録されました。任意のヒント?
public class CommentsAdapter extends ArrayAdapter<Post> {
private int layout;
private Context context;
private ArrayList<Post> postList = new ArrayList<>();
public CommentAdapter(@NonNull Context cont, @LayoutRes int textViewResourceId, @NonNull ArrayList<Post> objects) {
super(cont, textViewResourceId, objects);
layout = textViewResourceId;
context = cont;
postList = objects;
}
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final ViewHolder v;
final Post comment = postList.get(position);
final String mimeType = "text/html";
final String encoding = "UTF-8";
final SharedPreferences prefs = context.getSharedPreferences("user_session", MODE_PRIVATE);
final String sessionKey = prefs.getString("session_key", "");
String htmlData = "<link rel=\"stylesheet\" type=\"text/css\" href=\"comments.css\" />" + comment.content;
if (convertView == null) {
v = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(layout, parent, false);
v.upvotedIcon = convertView.findViewById(R.id.navbar_upvoted_icon);
v.upvoteIcon = convertView.findViewById(R.id.navbar_upvote_icon);
v.upvotedText = convertView.findViewById(R.id.navbar_upvoted_text);
v.upvoteText = convertView.findViewById(R.id.navbar_upvote_text);
v.upvoteButton = convertView.findViewById(R.id.navbar_upvote_button);
v.upvotedButton = convertView.findViewById(R.id.navbar_upvoted_button);
v.upvotedIcon.setTypeface(fontAwesome);
v.upvoteIcon.setTypeface(fontAwesome);
v.upvotedText.setTypeface(opensans);
v.upvoteText.setTypeface(opensans);
convertView.setTag(v);
} else {
v = (ViewHolder) convertView.getTag();
}
v.upvoteText.setText(String.format(Locale.ENGLISH, "%d", comment.stats.upvotes));
v.upvotedText.setText(String.format(Locale.ENGLISH, "%d", comment.stats.upvotes + 1));
if (comment.hasReacted) {
v.upvoteButton.setVisibility(View.GONE);
v.upvotedButton.setVisibility(View.VISIBLE);
} else {
v.upvotedButton.setVisibility(View.GONE);
v.upvoteButton.setVisibility(View.VISIBLE);
}
v.upvoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setButtonState(true, comment, v);
Call<JsonObject> call = MyApi.endpoint().upVotePost(sessionKey, comment.id);
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
if(response.code() != 200) {
// show upvote icon
setButtonState(false, comment, v);
Toast.makeText(context, "Cannot upvote for the moment, try again later.", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
// show upvote icon
setButtonState(false, comment, v);
Toast.makeText(context, "Cannot connect to the server, try again later.", Toast.LENGTH_SHORT).show();
}
});
}
});
v.upvotedButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// show upvote icon
setButtonState(false, comment, v);
Call<JsonObject> call = MyApi.endpoint().downVotePost(sessionKey, comment.id);
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
if(response.code() != 200) {
// show upvoted icon
setButtonState(true, comment, v);
Toast.makeText(context, "Cannot undo your upvote for the moment, try again later.", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
// show upvoted icon
setButtonState(true, comment, v);
Toast.makeText(context, "Cannot connect to the server, try again later.", Toast.LENGTH_SHORT).show();
}
});
}
});
return convertView;
}
}
コードで 'notifyDataSetChanged();'を使用できますか? – KeLiuyue
@KeLiuyueどのように私はこのクラスのために行うことができますか? 'CommentsAdapter'は' ArrayAdapter'を拡張します。 – Bargain23
'postList'でアダプタをどのように初期化したのでしょうか? –