• Android RecyclerView实现加载多种条目类型*


    今天咱们是用RecyclerView来实现这个多种Item的加载. 
    其实最关键的是要复写RecyclerView的Adapter中的getItemViewType()方法 这个方法就根据条件返回条目的类型 这个MoreTypeBean 是用来传数据的 没必要跟我写的一样, 
    其实就是从activity中传到adapter中的数据中必须要有一个type字段来判断这个item对象需要那种视图,然后return出一个标记,在onCreateViewHolder中在引用所对应的item布局.

    //重写getItemViewType方法 根据条件返回条目的类型
        @Override
        public int getItemViewType(int position) {
    
            MoreTypeBean moreTypeBean = mData.get(position);
            if (moreTypeBean.type == 0) {
                return TYPE_PULL_IMAGE;
            } else if (moreTypeBean.type == 1) {
                return TYPE_RIGHT_IMAGE;
            } else {
                return TYPE_THREE_IMAGE;
            }
        }

    一般有多少种类型我们定义多少种常量.(我今天写了三种布局 所以我定义了三个)

      //定义三种常量  表示三种条目类型
        public static final int TYPE_PULL_IMAGE = 0;
        public static final int TYPE_RIGHT_IMAGE = 1;
        public static final int TYPE_THREE_IMAGE = 2;

    有了上面定义的常量之后 在onCreateViewHolder里根据viewtype来判断 所引用的item布局类型 这样每一条item就会不一样了

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            //创建不同的 ViewHolder
            View view;
            //根据viewtype来判断
    
            if (viewType == TYPE_PULL_IMAGE) {
                view =View.inflate(parent.getContext(),R.layout.item_pull_img,null);
                return new PullImageHolder(view);
            } else if (viewType == TYPE_RIGHT_IMAGE) {
                view =View.inflate(parent.getContext(),R.layout.item_right_img,null);
                return new RightImageHolder(view);
            } else {
                view =View.inflate(parent.getContext(),R.layout.item_three_img,null);
                return new ThreeImageHolder(view);
            }
        }

    创建三种不同的ViewHolder

    
        private class PullImageHolder extends RecyclerView.ViewHolder {
    
            public PullImageHolder(View itemView) {
                super(itemView);
            }
        }
    
        private class RightImageHolder extends RecyclerView.ViewHolder {
    
            public RightImageHolder(View itemView) {
                super(itemView);
            }
        }
    
        private class ThreeImageHolder extends RecyclerView.ViewHolder {
    
            public ThreeImageHolder(View itemView) {
                super(itemView);
            }
        }

    下面把所有的代码都给大家: 
    Activity中的代码

    public class Recycler_variety_Activity extends Activity {
    
        private int[] icons = {R.drawable.test, R.drawable.test1, R.drawable.test2, R.drawable.test3, R.drawable.test4, R.drawable.test5, R.drawable.test6};
        private RecyclerView mRecy;
        private List<MoreTypeBean> mData;
    
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.recycler_variety_activity);
            initView();
            initData();
            initViewOper();
        }
    
        private void initView() {
            mRecy = (RecyclerView) findViewById(R.id.act_recycler_variety_recycler);
        }
    
        private void initData() {
            mData = new ArrayList<>();
    //        随机数 用来标记item界面的类型
            Random random = new Random();
    
            for (int i = 0; i < icons.length; i++) {
                MoreTypeBean more = new MoreTypeBean();
    
                more.pic = icons[i];
                more.type = random.nextInt(3);
                mData.add(more);
            }
        }
    
        private void initViewOper() {
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
            mRecy.setLayoutManager(linearLayoutManager);
            Recycler_variety_Adapter adapter = new Recycler_variety_Adapter(mData);
            mRecy.setAdapter(adapter);
        }
    
    }

    recyclerview_test_layout的布局就是只有一个RecyclerView

       <android.support.v7.widget.RecyclerView
            android:id="@+id/act_recycler_variety_recycler"
            android:layout_width="match_parent"
            android:background="#d3d3d3"
            android:layout_height="match_parent"/>

    RecyclerView的Adapter

    public class Recycler_variety_Adapter extends RecyclerView.Adapter {
    
        //定义三种常量  表示三种条目类型
        public static final int TYPE_PULL_IMAGE = 0;
        public static final int TYPE_RIGHT_IMAGE = 1;
        public static final int TYPE_THREE_IMAGE = 2;
        private List<MoreTypeBean> mData;
    
        public Recycler_variety_Adapter(List<MoreTypeBean> data) {
            this.mData = data;
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            //创建不同的 ViewHolder
            View view;
            //根据viewtype来创建条目
    
            if (viewType == TYPE_PULL_IMAGE) {
                view =View.inflate(parent.getContext(),R.layout.item_pull_img,null);
                return new PullImageHolder(view);
            } else if (viewType == TYPE_RIGHT_IMAGE) {
                view =View.inflate(parent.getContext(),R.layout.item_right_img,null);
                return new RightImageHolder(view);
            } else {
                view =View.inflate(parent.getContext(),R.layout.item_three_img,null);
                return new ThreeImageHolder(view);
            }
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
        }
    
        @Override
        public int getItemCount() {
            if (mData != null) {
                return mData.size();
            }
            return 0;
        }
    
        //根据条件返回条目的类型
        @Override
        public int getItemViewType(int position) {
    
            MoreTypeBean moreTypeBean = mData.get(position);
            if (moreTypeBean.type == 0) {
                return TYPE_PULL_IMAGE;
            } else if (moreTypeBean.type == 1) {
                return TYPE_RIGHT_IMAGE;
            } else {
                return TYPE_THREE_IMAGE;
            }
    
    
        }
    
        /**
         * 创建三种ViewHolder
         */
        private class PullImageHolder extends RecyclerView.ViewHolder {
    
            public PullImageHolder(View itemView) {
                super(itemView);
            }
        }
    
        private class RightImageHolder extends RecyclerView.ViewHolder {
    
            public RightImageHolder(View itemView) {
                super(itemView);
            }
        }
    
        private class ThreeImageHolder extends RecyclerView.ViewHolder {
    
            public ThreeImageHolder(View itemView) {
                super(itemView);
            }
        }
    }

    item_pull_img布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
    
        >
        <LinearLayout
            android:layout_width="match_parent"
            android:padding="7dp"
            android:background="#fff"
            android:orientation="vertical"
            android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000"
            android:text="多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型"
            android:textSize="16sp"
            />
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="150dp"
            android:background="@drawable/sucai6"
            android:scaleType="fitXY"
            />
        </LinearLayout>
        <View
            android:layout_marginTop="3dp"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#d3d3d3"
            />
    </LinearLayout>

    item_right_img布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="vertical"
    
        >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#fff"
            android:orientation="horizontal"
            android:padding="7dp">
    
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型"
                android:textColor="#000"
                android:textSize="16sp" />
    
            <ImageView
                android:layout_width="120dp"
                android:layout_height="90dp"
                android:background="@drawable/sucai" />
        </LinearLayout>
        <View
            android:layout_marginTop="3dp"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#d3d3d3"
            />
    </LinearLayout>

    item_three_img布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:background="#fff"
            android:padding="7sp"
            android:layout_height="wrap_content">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型多种条目类型"
            android:textColor="#000"
            android:textSize="16sp" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="0dp"
                android:layout_height="80dp"
                android:layout_weight="1"
                android:scaleType="fitXY"
    
                android:src="@drawable/sucai3" />
            <View
                android:layout_width="6dp"
                android:layout_height="0dp"/>
    
            <ImageView
                android:layout_width="0dp"
                android:layout_height="80dp"
                android:layout_weight="1"
                android:scaleType="fitXY"
                android:src="@drawable/sucai4" />
            <View
                android:layout_width="6dp"
                android:layout_height="0dp"/>
            <ImageView
                android:layout_width="0dp"
                android:layout_height="80dp"
                android:layout_weight="1"
                android:scaleType="fitXY"
                android:src="@drawable/sucai5" />
    
    
        </LinearLayout>
    
    
    </LinearLayout>
        <View
            android:layout_marginTop="3dp"
            android:background="#d3d3d3"
            android:layout_width="match_parent"
            android:layout_height="1dp"/>
    </LinearLayout>

    MoreTypeBean

    public class MoreTypeBean {
        public int type;
        public int pic;
    }
  • 相关阅读:
    2016奇虎360研发工程师内推笔试编程题:找镇长
    2016奇虎360研发工程师内推笔试编程题:找到字符串第一个只出现一次的字符
    lintcode: 最长无重复字符的子串
    lintcode :同构字符串
    lintcode : 跳跃游戏
    lintcode :单词搜索
    Project Euler 110:Diophantine reciprocals II 丢番图倒数II
    Project Euler 109 :Darts 飞镖
    Project Euler 108:Diophantine reciprocals I 丢番图倒数I
    Project Euler 107:Minimal network 最小网络
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/9647916.html
Copyright © 2020-2023  润新知