在Recyclerview中滚动后,以前的数据正在更新

时间:2019-02-13 07:00:49

标签: java android android-recyclerview recycler-adapter

我正在使用Recyclerview适配器,我的Recyclerview项具有1个textView和1个按钮,

如果我单击Button,则TextView值为 Hi ,它应该在Recyclerview项上更改为 Hello 。 在按钮上单击TextView值正确更改。(即,从 Hi 更改为 Hello ))

问题是我滚动recyclerview时,滚动后它再次显示Previous value(即再次显示 Hi )。

我知道在堆栈溢出时会问很多类似的问题,我已经尝试了其中的大多数,但是对于我来说似乎没有任何作用。

我的问题已解决,添加了工作代码。(添加到下面的行中)

listNet.set(position,new NetData(VALUE));

notifyItemChanged(position);

public class NetAdapter extends RecyclerView.Adapter<NetAdapter.MyViewHolder> {

    Context context;
    List<NetData> listNet;

    public NetAdapter(Context context, ArrayList<NetData> listNet){
        this.context = context;
        this.listNet = listNet;
    }

    @SuppressLint("ResourceAsColor")
    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position){

        final NetData netData=listNet.get(position);

        holder.tv.setText(netData.dnetqty);
        holder.btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v){
                String VALUE = "Hello"
                holder.tv.setText(VALUE); //Changing Text from Hi to Hello
                //Edited Answer
                listNet.set(position, new NetData(VALUE));
                notifyItemChanged(position);              
            }
        });
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        Button btn;
        TextView tv;
        public MyViewHolder(View itemView){

            super(itemView);
            btn=itemView.findViewById(R.id.btn);
            tv=itemView.findViewById(R.id.tv);
        }
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){

        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.item_recyclerview, parent, false);

        return new MyViewHolder(view);
    }

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

}

我想要的是,在更改TextView值之后,该值应为常数,并且在滚动后不应更改。.

谢谢..

2 个答案:

答案 0 :(得分:1)

仅将文本设置为textview是不够的,因为recyclerview会回收视图。

您需要将更改的文本保存在数据集中,并将这些更改通知视图。只有这样,您的更改才会继续。

答案 1 :(得分:1)

您必须将更改保存到 ArrayList listNet 的更改位置,如下所示,代码抱歉,没有得到您的代码,因此在此处进行了注释。

holder.btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v){
            holder.tv.setText("Hello"); //Changing Text from Hi to Hello

            //here save Hello to your *listNet.get(position)*'s dnetqty property
        }
    });