效果實(shí)現(xiàn)為需要展示一個(gè)列表并進(jìn)行數(shù)據(jù)刷新,之前因?yàn)橄胫褂肔istView,在BaseAdapter中添加自定義的addList方法后直接進(jìn)行notifysetdatachanged,但是因?yàn)閿?shù)據(jù)刷新的頻率太高,導(dǎo)致條目的點(diǎn)擊事件無法執(zhí)行...
所以改用可靠的RecycleView,自定義條目點(diǎn)擊事件,并重寫方法onBindViewHolder方法
使用下面的方法進(jìn)行條目的內(nèi)容刷新,不影響條目點(diǎn)擊事件
notifyItemChanged(position,1);
參數(shù)1傳入刷洗條目的position
參數(shù)2為Object類型的payload,payload不為null更新條目上的內(nèi)容,為null則調(diào)用兩個(gè)函數(shù)的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;
}
//設(shè)置控件信息
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
// 點(diǎn)擊事件一般都寫在綁定數(shù)據(jù)這里,當(dāng)然寫到上邊的創(chuàng)建布局時(shí)候也是可以的
if (mItemClickListener != null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 這里利用回調(diào)來給RecyclerView設(shè)置點(diǎn)擊事件
mItemClickListener.onItemClick(position);
}
});
}
/**
* 下面這部分代碼根據(jù)實(shí)際需求進(jìn)行邏輯判斷設(shè)置,只是大致舉個(gè)例子
*/
//獲取你的列表集合中的數(shù)據(jù)進(jìn)行添加設(shè)置,顯示再item上
String string = arrayList.get(position);
//拿到你的ViewHolder上的控件進(jìn)行設(shè)置
holder.name.setText(string);
}
/**
* 重寫的onBindViewHolder方法,通過payloads是否為null判斷需不需要調(diào)用兩個(gè)參數(shù)的onBindViewHolder(holder, position);方法
* @param holder
* @param position
* @param payloads
*/
@Override
public void onBindViewHolder(MyViewHolder holder, final int position, List<Object> payloads) {
// 點(diǎn)擊事件一般都寫在綁定數(shù)據(jù)這里,當(dāng)然寫到上邊的創(chuàng)建布局時(shí)候也是可以的
if (mItemClickListener != null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 這里利用回調(diào)來給RecyclerView設(shè)置點(diǎn)擊事件
mItemClickListener.onItemClick(position);
}
});
}
//payloads為null的情況,此時(shí)進(jìn)行條目刷新
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();
}
/**
* 這個(gè)就是根據(jù)邏輯進(jìn)行頻繁調(diào)用的addList方法
* 按照目前的邏輯是不停給list添加string,你可以根據(jù)需要去傳入對(duì)象或者int值啥的
* @param string
*/
public void addList(String string) {
arrayList.add(string);
/**
* 這里其實(shí)不需要更新,因?yàn)樘砑右粋€(gè)新的item本身就是更新,只是進(jìn)行舉例?。?!
* position:這里會(huì)根據(jù)第一個(gè)參數(shù)的position去確定更新的條目可以根據(jù)實(shí)際業(yè)務(wù)進(jìn)行判斷傳入什么
* payload:這是個(gè)object類型的,只需要傳入作為一個(gè)標(biāo)識(shí)即可,這樣在調(diào)用時(shí)就會(huì)走三個(gè)參數(shù)的onBindViewHolder方法
*/
notifyItemChanged(arrayList.size()-1,1);
}
}
//清空list集合,看你的實(shí)際業(yè)務(wù)需求用不用
public void clear() {
arrayList.clear();
}
/**
* 利用接口 -> 給RecyclerView設(shè)置點(diǎn)擊事件
*/
private ItemClickListener mItemClickListener ;
public interface ItemClickListener{
public void onItemClick(int position) ;
}
public void setOnItemClickListener(ItemClickListener itemClickListener){
this.mItemClickListener = itemClickListener ;
}
}
/**
* 自定義的ViewHolder,持有每個(gè)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) {
//點(diǎn)擊條目后進(jìn)行相應(yīng)的操作
}
});