【问题标题】:notifyDataSetChanged not working on when adapter change适配器更改时 notifyDataSetChanged 不起作用
【发布时间】:2017-11-18 15:24:08
【问题描述】:

我正在从服务器获取数据,然后对其进行解析并将其存储在列表中。我将此列表用于 RecyclerView 的适配器。我正在使用片段。

我扩展了

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);
        }
    }
}

在片段活动中,我使用此代码将适配器加载到 recyclerview

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();
}

在我的自定义适配器中,我有 3 个变量让我们调用 id、name、checked,一切正常,在第一次加载时,我将 0 设置为 checked 的默认值,在我的场景中,用户可以通过点击recycleview的行来更改checked的值。

我的问题是,当用户点击愿望行时,选中的行将从 0 变为 1 并显示到 recycelview,我已经使用 notifydatasetchange() 但无法正常工作。

请帮忙。 谢谢

【问题讨论】:

    标签: android android-fragments android-recyclerview adapter notifydatasetchanged


    【解决方案1】:

    尝试删除mAdapterGrid.notifyDataSetChanged(); 并在您的 adpater 中修改此功能:

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

    【讨论】:

    • 在调用 notifyItemChanged(position) 之前,您是否检查过 ProductModellist 是否已更新? ?
    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 2015-02-27
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多