RecyclerView模板

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,可以解决闪烁的问题

猜你喜欢

转载自blog.csdn.net/weixin_43724742/article/details/84578768