我已经设置了一个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;
}
在适配器类中