RecyclerView 相信越来越多的人已经开始使用了,在使用recyclerView过程中发现当列表很长的时候点击第一个radiobutton后下面的也会被点击,这就是recyclerView重复选中问题,当时可是纠结了好一会才弄好,在这里和大家分享一下解决方法。
方法一:
MainActivity.class:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MainActivityAdapter adapter;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
list=new ArrayList<String>();
for (int i = 0; i < 100; i++) {
list.add("this is" + i);
}
adapter = new MainActivityAdapter(list, this);
adapter.onItemClickListener(new OnChildItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.e("tag", list.get(position));
}
});
DividerItemDecoration decoration=new DividerItemDecoration(this,LinearLayoutManager.VERTICAL);
recyclerView.addItemDecoration(decoration);
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
recyclerView.setAdapter(adapter);
}
}
注解:最基本的recyclerView用法,这里就不详细解释了,有不懂得自行上网学习下。
因为有点击事件所以新建一个OnChildItemClickListener 接口:
import android.view.View;
public interface OnChildItemClickListener {
void onItemClick(View view, int position);
}
重要操作在MainActivityAdapter.class中实现:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioButton;
import java.util.List;
public class MainActivityAdapter extends RecyclerView.Adapter<MainActivityAdapter.ViewHolder> {
private List<String> list;
private Context context;
private LayoutInflater inflater;
private int layoutPosition; //记录当前点击位置
private OnChildItemClickListener listener;
public MainActivityAdapter(List<String> list, Context context) {
this.list = list;
inflater = LayoutInflater.from(context);
}
public void onItemClickListener(OnChildItemClickListener listener) {
this.listener = listener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.layout_ite, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.radioButton.setText(list.get(position));
holder.itemView.setTag(position);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//获取当前点击的位置
layoutPosition = holder.getLayoutPosition();
notifyDataSetChanged();
listener.onItemClick(holder.itemView, (int) holder.itemView.getTag());
}
});
//更改状态
if (position == layoutPosition) {
holder.radioButton.setChecked(true);
} else {
holder.radioButton.setChecked(false);
}
}
@Override
public int getItemCount() {
return list.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private RadioButton radioButton;
public ViewHolder(View itemView) {
super(itemView);
radioButton = (RadioButton) itemView.findViewById(R.id.num);
}
}
}
注解:通过 holder.getLayoutPosition()来获取点击的位置并记录下来,然后判断当前的位置是否为点击的位置。如果是,则更改radiobutton为点击状态,否则为未点击状态
如此简单就解决了RecyclerView重复选中问题哈!
方法二:
当我们通过用户交互改变recyclerview中的某个item的显示状态后,向下滑动会发现每间隔9个item就会出现同样的显示状态,但是我们明明没有对这个item进行操作,为什么会自动显示操作后的状态呢?
其实原因很简单,因为缓存问题
只要在相应的activity或者fragment添加下面一行代码
mRecyclerview.setItemViewCacheSize(500);
其中500是想要缓存的item数量,可以根据自己的需要进行调整。
方法二是懒人方法,暂未发现问题可以试试哈!
尊重作者劳动成果:
https://blog.csdn.net/shma1022/article/details/53338054