Android中RecyclerView加载不同子布局(记录)

经常看到新闻之类的列表里有好几种不同的布局样式,很简单,动手写了一下,做个记录。

效果图如下:

主要思路:就是通过判断接收的子项的布局样式的不同,来加载不同的布局。

相应的Adapter适配器的代码如下:

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context mContext;
    private List<Integer> typeList;

    private static final int ITEM_TYPE_ONE = 1;
    private static final int ITEM_TYPE_TWO = 2;
    private static final int ITEM_TYPE_THREE = 3;

    public MyRecyclerViewAdapter(Context mContext, List<Integer> typeList) {
        this.mContext = mContext;
        this.typeList = typeList;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == ITEM_TYPE_ONE) {
            View convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_rview_type_one, parent, false);
            ViewHolderOne viewHolderOne = new ViewHolderOne(convertView);
            return viewHolderOne;
        } else if (viewType == ITEM_TYPE_TWO) {
            View convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_rview_type_two, parent, false);
            ViewHolderTwo viewHolderTwo = new ViewHolderTwo(convertView);
            return viewHolderTwo;
        } else if (viewType == ITEM_TYPE_THREE) {
            View convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_rview_type_three, parent, false);
            ViewHolderThree viewHolderThree = new ViewHolderThree(convertView);
            return viewHolderThree;
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ViewHolderOne) {
            bindViewHolderOne((ViewHolderOne) holder);
        } else if (holder instanceof ViewHolderTwo) {
            bindViewHolderTwo((ViewHolderTwo) holder, position);
        } else if (holder instanceof ViewHolderThree) {
            bindViewHolderThree((ViewHolderThree) holder);
        }
    }

    @Override
    public int getItemCount() {
        return typeList.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (typeList.get(position) == 1) {
            return ITEM_TYPE_ONE;
        } else if (typeList.get(position) == 2) {
            return ITEM_TYPE_TWO;
        } else if (typeList.get(position) == 3) {
            return ITEM_TYPE_THREE;
        }
        return 0;
    }

    static class ViewHolderOne extends RecyclerView.ViewHolder {

        private TextView tvTitle, tvContent;

        public ViewHolderOne(@NonNull View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.Layout_Item_RView_TypeOne_tvTitle);
            tvContent = itemView.findViewById(R.id.Layout_Item_RView_TypeOne_tvContent);
        }
    }

    static class ViewHolderTwo extends RecyclerView.ViewHolder {

        private TextView tvTitle;
        private GridView gViewPhoto;

        public ViewHolderTwo(@NonNull View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.Layout_Item_RView_TypeTwo_tvTitle);
            gViewPhoto = itemView.findViewById(R.id.Layout_Item_RView_TypeTwo_gViewPhoto);
        }
    }

    static class ViewHolderThree extends RecyclerView.ViewHolder {

        private TextView tvTitle;
        private ImageView ivThumb;

        public ViewHolderThree(@NonNull View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.Layout_Item_RView_TypeThree_tvTitle);
            ivThumb = itemView.findViewById(R.id.Layout_Item_RView_TypeThree_ivThumb);
        }
    }

    private void bindViewHolderOne(ViewHolderOne viewHolderOne) {
        viewHolderOne.tvTitle.setText("这是一条新闻的标题");
        viewHolderOne.tvContent.setText("新闻内容新闻内容新闻内容新闻内容新闻内容新闻内容新闻内容新闻内容新闻内容新闻内容");
    }

    private void bindViewHolderTwo(ViewHolderTwo viewHolderTwo, int position) {
        viewHolderTwo.tvTitle.setText("这是一条带有多张图片的新闻的标题");
        List<Integer> photoList = new ArrayList<>();
        for (int i = 0; i < 3; i ++) {
            photoList.add(R.drawable.fengjing);
        }
        PhotoListAdapter photoListAdapter = new PhotoListAdapter(mContext, photoList);
        viewHolderTwo.gViewPhoto.setAdapter(photoListAdapter);
        viewHolderTwo.gViewPhoto.setTag(position);
        viewHolderTwo.gViewPhoto.setOnItemClickListener((parent, view, position1, id) -> {
            int mPosition = (int) (parent.getTag());
            Log.e("图片索引", mPosition + "-" + position1);
        });
    }

    private void bindViewHolderThree(ViewHolderThree viewHolderThree) {
        viewHolderThree.tvTitle.setText("这是一条带有单张图片新闻的标题");
    }
}
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A:在 Android ,我们可以使用 RecyclerView 的 ItemAnimator 监听器和 LayoutManager 监听器来判断 RecyclerView加载状态。实现方法如下: 1. 使用 ItemAnimator 监听器 RecyclerView 的 ItemAnimator 是用来设置动画效果的。我们可以通过监听 ItemAnimator 的 onAnimationEnd() 方法来判断 RecyclerView加载状态,如果该方法调用了 getItemCount() 方法,那么就可以判断 RecyclerView 已经加载完成了。 ``` recyclerView.getItemAnimator().setListener(new RecyclerView.ItemAnimator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { // 动画开始 } @Override public void onAnimationEnd(Animator animator) { // 动画结束 if (recyclerView.getLayoutManager().getItemCount() > 0) { // RecyclerView 加载完成 } } @Override public void onAnimationCancel(Animator animator) { // 动画取消 } @Override public void onAnimationRepeat(Animator animator) { // 动画重复 } }); ``` 2. 使用 LayoutManager 监听器 LayoutManager 是 RecyclerView 用来管理布局的类。我们可以通过监听 LayoutManager 的 onLayoutCompleted() 方法来判断 RecyclerView加载状态,如果该方法调用了 getItemCount() 方法,那么就可以判断 RecyclerView 已经加载完成了。 ``` recyclerView.getLayoutManager().setOnLayoutCompletedListener(new RecyclerView.OnLayoutCompletedListener() { @Override public void onLayoutCompleted(RecyclerView.State state) { // RecyclerView 布局完成 if (recyclerView.getLayoutManager().getItemCount() > 0) { // RecyclerView 加载完成 } } }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值