效果实现为需要展示一个列表并进行数据刷新,之前因为想着使用ListView,在BaseAdapter中添加自定义的addList方法后直接进行notifysetdatachanged,但是因为数据刷新的频率太高,导致条目的点击事件无法执行...
所以改用可靠的RecycleView,自定义条目点击事件,并重写方法onBindViewHolder方法
使用下面的方法进行条目的内容刷新,不影响条目点击事件
notifyItemChanged(position,1);
参数1传入刷洗条目的position
参数2为Object类型的payload,payload不为null更新条目上的内容,为null则调用两个函数的onBindViewHolder方法
RecyclerView.Adapter代码如下
public class MyListAdapter extends RecyclerView.Adapter<MyViewHolder>{
//recycleView展示的集合列表
private ArrayList<String> arrayList;
public MyListAdapter() {
super();
arrayList = new ArrayList<>();
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//传入你的Item布局
View view = View.inflate(parent.getContext(),R.layout.XXXXX,null);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
//设置控件信息
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
// 点击事件一般都写在绑定数据这里,当然写到上边的创建布局时候也是可以的
if (mItemClickListener != null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 这里利用回调来给RecyclerView设置点击事件
mItemClickListener.onItemClick(position);
}
});
}
/**
* 下面这部分代码根据实际需求进行逻辑判断设置,只是大致举个例子
*/
//获取你的列表集合中的数据进行添加设置,显示再item上
String string = arrayList.get(position);
//拿到你的ViewHolder上的控件进行设置
holder.name.setText(string);
}
/**
* 重写的onBindViewHolder方法,通过payloads是否为null判断需不需要调用两个参数的onBindViewHolder(holder, position);方法
* @param holder
* @param position
* @param payloads
*/
@Override
public void onBindViewHolder(MyViewHolder holder, final int position, List<Object> payloads) {
// 点击事件一般都写在绑定数据这里,当然写到上边的创建布局时候也是可以的
if (mItemClickListener != null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 这里利用回调来给RecyclerView设置点击事件
mItemClickListener.onItemClick(position);
}
});
}
//payloads为null的情况,此时进行条目刷新
if (payloads.isEmpty()) {
onBindViewHolder(holder, position);
}
//payloads不为null的情况
else {
final String string = arrayList.get(position);
if (string != null) {
holder.name.setText(string);
}
}
}
@Override
public int getItemCount() {
return arrayList.size();
}
/**
* 这个就是根据逻辑进行频繁调用的addList方法
* 按照目前的逻辑是不停给list添加string,你可以根据需要去传入对象或者int值啥的
* @param string
*/
public void addList(String string) {
arrayList.add(string);
/**
* 这里其实不需要更新,因为添加一个新的item本身就是更新,只是进行举例!!!
* position:这里会根据第一个参数的position去确定更新的条目可以根据实际业务进行判断传入什么
* payload:这是个object类型的,只需要传入作为一个标识即可,这样在调用时就会走三个参数的onBindViewHolder方法
*/
notifyItemChanged(arrayList.size()-1,1);
}
}
//清空list集合,看你的实际业务需求用不用
public void clear() {
arrayList.clear();
}
/**
* 利用接口 -> 给RecyclerView设置点击事件
*/
private ItemClickListener mItemClickListener ;
public interface ItemClickListener{
public void onItemClick(int position) ;
}
public void setOnItemClickListener(ItemClickListener itemClickListener){
this.mItemClickListener = itemClickListener ;
}
}
/**
* 自定义的ViewHolder,持有每个Item的的所有界面元素
*/
public class MyViewHolder extends RecyclerView.ViewHolder {
private final TextView name;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
}
}
MyListAdapter myListAdapter = new MyListAdapter();
myListAdapter.setOnItemClickListener(new XXX(你的adapter所在的类).MyListAdapter.ItemClickListener() {
@Override
public void onItemClick(int position) {
//点击条目后进行相应的操作
}
});