RecyclerView使用:
RecyclerAdapter adapter = new RecyclerAdapter();
recyclerView = (RecyclerView) findViewById(R.id.list);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
//设置分割线
DividerItemDecoration divider = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
divider.setDrawable(ContextCompat.getDrawable(this,R.drawable.divider));
recyclerView.addItemDecoration(divider);
Adapter模板:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemViewHolder> {
private List<Item> dataList = new ArrayList<>();
public void update(List<Item> items) {
DiffUtil.DiffResult result = getDiffResult(items);
dataList.clear();
dataList.addAll(items);
result.dispatchUpdatesTo(this);
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
ItemViewHolder holder = new ItemViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
String text = dataList.get(position).getName();
holder.textView.setText(text);
holder.textView.setOnClickListener(null);
}
@Override
//此方法为配合DiffUtil.Callback中的getChangePayload方法使用
public void onBindViewHolder(ItemViewHolder holder, int position, List<Object> payloads) {
if (payloads == null || payload.size() == 0) {
onBindViewHolder(holder, position);
} else {
Bundle payload = (Bundle) payloads.get(0);
Item item = dataList.get(position);
for (String key : payload.keySet()) {
switch (key) {
case "name":
holder.textView.setText(item.getName());
break;
default:
break;
}
}
}
}
@Override
public int getItemCount() {
return dataList.size();
}
private DiffUtil.DiffResult getDiffResult(final List<Item> newList) {
return DiffUtil.calculateDiff(new DiffUtil.Callback() {
@Override
public int getOldListSize() {
return dataList.size();
}
@Override
public int getNewListSize() {
return newList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
Item oldItem = dataList.get(oldItemPosition);
Item newItem = newList.get(newItemPosition);
return oldItem.getId().equals(newItem.getId());
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
Item oldItem = dataList.get(oldItemPosition);
Item newItem = newList.get(newItemPosition);
return oldItem.getName().equals(newItem.getName());
}
@Nullable
@Override
//payload表示数据项变化了的部分用于一个Item的部分字段更新
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
Item oldItem = dataList.get(oldItemPosition);
Item newItem = newList.get(newItemPosition);
Bundle payload = new Bundle();
if (!oldItem.getName().equals(newItem.getName())) {
payload.putString("name", newItem.getName());
}
return payload.size() == 0 ? null : payload;
}
});
}
class ItemViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ItemViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.name);
}
}
}
parent就是RecyclerView,此方法只执行一次
parent设为null时item_layout的layout_width,layout_height属性将会失效;attatchToParent也会失效
attatchToParent = false时,LayoutInflater.inflate()返回的view的类型是item_layout最外层布局的类型
attatchToParent = true时,LayoutInflater.inflate()返回的view为parent
attatchToParent 默认为true;
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
ItemViewHolder holder = new ItemViewHolder(view);
return holder;
}
可能导致RecyclerView闪烁的原因:
现象:
数据显示情况为为无,有,无,有,并伴随布局小幅度上下跳跃,期望效果为列表数据从无到有,
原因:
RecyclerView可见性的控制方式有误:
当数据列表为空时将RecyclerView的可见状态改为Gone,
当数据列表刷新不为空时将RecyclerView的可见状态改为Visible,
应该修改为:
此时需要将列表为空时RecyclerView的状态改为Invisible,可以解决闪烁的问题