0

サーバからデータを取得して解析し、リストに格納しています。私はこのリストをRecyclerViewのアダプターに使用しています。私は断片を使用しています。アダプタの変更時にnotifyDataSetChangedが機能しない

私は

RecyclerView.Adapter<RecyclerView.ViewHolder> 

この私の完全なアダプタクラス

public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> { 
    private List<ProductModel> list; 
    ItemClickListener itemClickListener; 

    public GridAdapter(List<ProductModel> list, ItemClickListener itemClickListener) { 
     this.list    = list; 
     this.itemClickListener = itemClickListener; 
    } 

    public void update(int position,ProductModel pm){ 
     Log.v("update adapter",position+""); 
     list.set(position,pm); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     final ProductModel cp = list.get(position); 

     holder.tvName.setText(cp.name); 
     holder.tvPrice.setText(cp.price); 
     holder.ratingBar.setRating(cp.rate); 

     Log.v("grid",cp.id + "=="+ cp.checked); 
     if(cp.checked==1){ 
      holder.imgCheck.setVisibility(View.VISIBLE); 
     }else{ 
      holder.imgCheck.setVisibility(View.GONE); 
     } 

     LayerDrawable stars = (LayerDrawable) holder.ratingBar.getProgressDrawable(); 
     stars.getDrawable(2).setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_ATOP); 

     holder.lnrItem.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       itemClickListener.onItemClick(cp,position); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     TextView tvName, tvPrice; 
     ImageView imgMenu, imgCheck; 
     LinearLayout lnrItem; 
     RatingBar ratingBar; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      lnrItem = itemView.findViewById(R.id.lnrItem); 
      imgMenu = itemView.findViewById(R.id.imgMenu); 
      imgCheck = itemView.findViewById(R.id.imgCheck); 
      tvName = itemView.findViewById(R.id.tvName); 
      ratingBar = itemView.findViewById(R.id.ratingBar); 
      tvPrice = itemView.findViewById(R.id.tvPrice); 
     } 
    } 
} 

とフラグメントの活動に私は私のカスタムアダプタのIで

public void fillListProduct(List<ProductModel> mItems) { //method for load adapter for the first time 
     mAdapterGrid = new GridAdapter(mItems,this); 
     recGrid.setAdapter(mAdapterGrid); 
    } 

void update(){ //method to change checked value 
mAdapterGrid.update(cp.row,cp); 
         mAdapterGrid.notifyDataSetChanged(); 
} 

をrecyclerviewするアダプタをロードするには、このコードを使用して拡張3変数を持つid、name、チェック、すべて正常に動作します。最初のロードでをデフォルト値checkedに設定します。シナリオのユーザーはcheckedの値をrecycleviewの行をタップして変更できます。

私の質問は、ユーザーのタップ希望の行が0から1に変わり、それをrecycelviewに表示すると、私はすでにnotifydatasetchange()を使用していますが、動作しません。

助けてください。 mAdapterGrid.notifyDataSetChanged(); を削除し、特殊なアダプタでこの機能を変更する おかげ

答えて

0

試してみてください。

public void update(int position,ProductModel pm){ 
     Log.v("update adapter",position+""); 
     list.set(position,pm); 
     notifyItemChanged(position); 
    } 
+0

はまだ – ltvie

+0

uは** ** ** ProductModelが更新されたの**リストかどうかを確認しました動作しませんでしたかnotifyItemChanged(position)を呼び出す前にいいえ。 ? –