回收器视图中的寻道栏变为"linked"。更改一个值,更改另一个



我已经设置了一个RecyclerView,并在向每一行添加Seekbar或"视图";。我也尝试过使用ListView,也得到了同样的效果。因此,当我更改第一个项目上的搜索栏时,它会将列表中第七个项目上搜索栏的值更改为完全相同的值。他们似乎正在获得";链接的";以某种方式目前,layout_height比列表小,所以它是可滚动的,我不能同时看到所有项目,这就是我注意到问题的时候。但是,当layout_height最大值为match_parent,并且整个列表适合屏幕时,就不会发生这种情况。我真的很粗略地猜测,这与视图是如何被夸大的,以及ID是如何被混淆或类似的事情有关。下面列出了我的RecyclerView适配器代码。这是我第一次使用StackOverflow,如果我没有在正确的区域发布或在格式上犯了任何错误,我深表歉意。如果我能在这里做得更好,请告诉我。

谢谢你的帮助!!

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
    private ArrayList<HashMap<String, String>> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    private LinearLayoutManager linearLayoutManager;
    // data is passed into the constructor
    MyRecyclerViewAdapter(Context context, ArrayList<HashMap<String, String>> data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }
    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_row, parent, false);
        return new ViewHolder(view);
    }
    // binds the data to the TextView in each row
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
       // System.out.println(mData);
        ArrayList<HashMap<String, String>> test = mData;
        //entry.get("id").toString()
        holder.Foods_Text.setText(mData.get(position).get("Food"));
        holder.Prices_Text.setText(mData.get(position).get("Price"));
        holder.Weights_Text.setText(mData.get(position).get("Weight"));

        holder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            public void onStopTrackingTouch(SeekBar bar) {
            }
            public void onStartTrackingTouch(SeekBar bar) {
            }
            public void onProgressChanged(SeekBar bar, int paramInt, boolean paramBoolean) {
                int value = bar.getProgress();
                // stList.get(position).setNoOfquestions(value);
                System.out.println(value);
                //update textview while dragging seekbar
                //  viewHolder.tvValues.setText("" + paramInt); // here in textView the percent will be shown
            }
        });
        
    }
    // total number of rows
    @Override
    public int getItemCount() {
        return mData.size();
    }

    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView Foods_Text;
        TextView Prices_Text;
        TextView Weights_Text;
        SeekBar seekBar;
        ViewHolder(View itemView) {
            super(itemView);
            Foods_Text = itemView.findViewById(R.id.Foods);
            Prices_Text = itemView.findViewById(R.id.Prices);
            Weights_Text = itemView.findViewById(R.id.Weights);
            seekBar = itemView.findViewById(R.id.seekBar_Food);
            seekBar.setMax(20);
            itemView.setOnClickListener(this);
           
        }
        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }

    }
    // convenience method for getting data at click position
    String getItem(int id) {
        return mData.get(id).toString();
    }
    // allows clicks events to be caught
    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }
    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

您的onBindViewHolder()方法没有任何内容来设置SeekBar的值(progress(。这意味着,当视图被回收时,SeekBar将只重复使用它绑定到的上一个项目的位置。

想象一下,您可以同时在屏幕上放置五行。所有的SeekBar最初被设置为0。将第一个拖动到100

现在滚动列表。最终,第一行将滚动出视图,其ViewHolder将被回收用于进入视图的某一行(可能是第七行或第八行;缓存一些"额外"的ViewHolder(。当这一行被回收时,由于没有设置SeekBar的位置,它仍将显示为100

您必须更新onBindViewHolder(),以确保每次都正确设置了SeekBar的进度。

添加覆盖方法

 @Override
 public int getItemViewType(int position) {
     return position;
 } 

在适配器类中

相关内容

最新更新