2017-09-05 7 views
0

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; 
    } 
} 
+1

コードで 'notifyDataSetChanged();'を使用できますか? – KeLiuyue

+0

@KeLiuyueどのように私はこのクラスのために行うことができますか? 'CommentsAdapter'は' ArrayAdapter'を拡張します。 – Bargain23

+1

'postList'でアダプタをどのように初期化したのでしょうか? –

答えて

2

あなたは等「upvoted」、「downvoted」のような値を持つ状態、または{}空の文字列であるあなたのモデルにプロパティを追加する必要があります。あなたのデータが有効になったら、それに応じてステータスを設定します。その後、データがリロードされると、モデルにそのステータスがあるかどうかチェックし、ステータスごとに適切なアイコンを使用して表示します。 (私は単にステータス値のために文字列を使用していますが、もっとエレガントなことをすることもできます)。

編集:複数のユーザーが指摘したように

、あなたはあなたのデータベースの値を変更した後notifyDataSetChangedを呼び出していることを確認してください。また、リモートサーバーからデータを取得する場合は、リロードする前にupvote/downvoteの値を更新してください(または、少なくともリモートデータをローカルデータと適切にマージする)。

+1

これは質問に答えますか?私は本当にわからない。 –

+1

彼の問題は、データアーキテクチャの問題であるコードの問題ではありません。私は言及したステータスに基づいてビューを表示するコードを追加することができますが、それはかなり簡単です。問題は、Bargain23がUI以外のボタン状態の記録を保持していないため、UIが再描画をトリガするときに、彼はアクションを失います。 – Jlange

+1

はい、それは私が話していたことです。コードにもいくつか問題があります。 –

関連する問題