Android开发之RecyclerView的不同position加载不同View详解

来源:互联网 发布:测试网络丢包率软件 编辑:程序博客网 时间:2024/05/22 01:53

Android开发之RecyclerView的不同position加载不同View详解


近日做项目,使用RecyclerView控件来显示数据,然而,在使用过程中,需要在不同的position设置不同的布局,该怎么办呢???

不要着急,经本人的一番研究后,终于实现了其基本功能,现将代码贴出,还望各位大神批评指正,不喜勿喷,灰常感谢O(∩_∩)O哈哈~

核心思想:
1.重写RecyclerView.Adapter的getItemViewType(int position),
  在此方法中根据不同的position,设置不同的ViewType
2.编写具体的RecyclerView.ViewHolder子类(不同子类对应不同View或Layout)
3.重写RecyclerView.Adapter的onCreateViewHolder(ViewGroup parent,int viewType)
  在此方法中根据我们之前设置的ViewType来返回不同的RecyclerView.ViewHolder的子类
下面我们废话少说,直接贴代码了:
MainActivity
package com.hxht.testrecyclerviewwithdifferentitemview;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.Toolbar;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.widget.NumberPicker;import android.widget.Toast;import com.hxht.testrecyclerviewwithdifferentitemview.adapter.MyAdapter;import com.hxht.testrecyclerviewwithdifferentitemview.customview.DividerItemDecoration;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private Toolbar toolbar;    private FloatingActionButton fab;    private RecyclerView recyclerView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initData();    }    /**     * 找控件     */    private void initView() {        toolbar = (Toolbar) findViewById(R.id.toolbar);        fab = (FloatingActionButton) findViewById(R.id.fab);        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);    }    /**     * 给我们需要的控件填充数据     */    private void initData() {        setSupportActionBar(toolbar);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();            }        });        List<String> descs = new ArrayList<>();        descs.clear();        List<Integer> images = new ArrayList<>();        images.clear();        for (int i = 1; i < 21; i++) {            descs.add("测试数据" + (i < 10 ? "0" + i : i));        }        images.add(R.mipmap.icon01);        images.add(R.mipmap.icon02);        images.add(R.mipmap.icon03);        images.add(R.mipmap.icon04);        images.add(R.mipmap.icon05);        images.add(R.mipmap.icon06);        images.add(R.mipmap.icon07);        images.add(R.mipmap.icon07);        images.add(R.mipmap.icon08);        images.add(R.mipmap.icon09);        images.add(R.mipmap.icon10);        images.add(R.mipmap.icon11);        images.add(R.mipmap.icon12);        images.add(R.mipmap.icon13);        images.add(R.mipmap.icon14);        images.add(R.mipmap.icon15);        images.add(R.mipmap.icon16);        images.add(R.mipmap.icon17);        images.add(R.mipmap.icon18);        images.add(R.mipmap.icon19);        images.add(R.mipmap.icon20);        MyAdapter adapter = new MyAdapter(MainActivity.this, descs, images);        recyclerView.setAdapter(adapter);        RecyclerView.LayoutManager manager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);        recyclerView.setLayoutManager(manager);        recyclerView.addItemDecoration(new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL_LIST));        adapter.setmOnItemClickListener(new MyAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Toast.makeText(MainActivity.this, "点击了" + position + "位置", Toast.LENGTH_SHORT).show();            }        });    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        int id = item.getItemId();        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}

MyAdapter
package com.hxht.testrecyclerviewwithdifferentitemview.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import com.hxht.testrecyclerviewwithdifferentitemview.R;import java.util.ArrayList;import java.util.List;public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    private Context mContext;    private List<String> descs;    private List<Integer> images;    private List<Object> allList;    private static final int TEXTVIEW_VIEWTYPE = 1;    private static final int IMAGEVIEW_VIEWTYPE = 2;    public interface OnItemClickListener {        void onItemClick(View view, int position);    }    private OnItemClickListener mOnItemClickListener;    public OnItemClickListener getmOnItemClickListener() {        return mOnItemClickListener;    }    public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) {        this.mOnItemClickListener = mOnItemClickListener;    }    public MyAdapter(Context mContext, List<String> descs, List<Integer> images) {        this.mContext = mContext;        this.descs = descs;        this.images = images;        allList = new ArrayList<>();        allList.clear();        for (int i = 0; i < descs.size(); i++) {            allList.add(descs.get(i));            allList.add(images.get(i));        }    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        RecyclerView.ViewHolder holder = getViewHolderByViewType(viewType);        return holder;    }    private RecyclerView.ViewHolder getViewHolderByViewType(int viewType) {        View tv_ItemView = View.inflate(mContext, R.layout.activity_rv_tv_item, null);        View iv_ItemView = View.inflate(mContext, R.layout.activity_rv_iv_item, null);        RecyclerView.ViewHolder holder = null;        switch (viewType) {            case TEXTVIEW_VIEWTYPE:                holder = new MyTextView_ViewHolder(tv_ItemView);                break;            case IMAGEVIEW_VIEWTYPE:                holder = new MyImageView_ViewHolder(iv_ItemView);                break;        }        return holder;    }    @Override    public int getItemViewType(int position) {        int viewType = -1;        int index = position % 2;        switch (index) {            case 0:                viewType = TEXTVIEW_VIEWTYPE;                break;            case 1:                viewType = IMAGEVIEW_VIEWTYPE;                break;        }        return viewType;    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {        if (position % 2 == 0) {            ((MyTextView_ViewHolder) holder).tv.setText(((String) allList.get(position)));            ((MyTextView_ViewHolder) holder).view.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (mOnItemClickListener != null) {                        mOnItemClickListener.onItemClick(v, position);                    }                }            });        } else {            ((MyImageView_ViewHolder) holder).iv.setImageResource(((Integer) allList.get(position)));            ((MyImageView_ViewHolder) holder).view.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (mOnItemClickListener != null) {                        mOnItemClickListener.onItemClick(v, position);                    }                }            });        }    }    @Override    public int getItemCount() {        return allList.size();    }    class MyTextView_ViewHolder extends RecyclerView.ViewHolder {        public View view;        public TextView tv;        public MyTextView_ViewHolder(View itemView) {            super(itemView);            this.view = itemView;            this.tv = (TextView) itemView.findViewById(R.id.tv);        }    }    class MyImageView_ViewHolder extends RecyclerView.ViewHolder {        public View view;        public ImageView iv;        public MyImageView_ViewHolder(View itemView) {            super(itemView);            this.view = itemView;            this.iv = (ImageView) itemView.findViewById(R.id.iv);        }    }}

DividerItemDecoration
package com.hxht.testrecyclerviewwithdifferentitemview.customview;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;public class DividerItemDecoration extends RecyclerView.ItemDecoration {    private static final int[] ATTRS = new int[]{            android.R.attr.listDivider    };    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;    private Drawable mDivider;    private int mOrientation;    public DividerItemDecoration(Context context, int orientation) {        final TypedArray a = context.obtainStyledAttributes(ATTRS);        mDivider = a.getDrawable(0);        a.recycle();        setOrientation(orientation);    }    public void setOrientation(int orientation) {        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {            throw new IllegalArgumentException("invalid orientation");        }        mOrientation = orientation;    }    @Override    public void onDraw(Canvas c, RecyclerView parent) {        if (mOrientation == VERTICAL_LIST) {            drawVertical(c, parent);        } else {            drawHorizontal(c, parent);        }    }    public void drawVertical(Canvas c, RecyclerView parent) {        final int left = parent.getPaddingLeft();        final int right = parent.getWidth() - parent.getPaddingRight();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            final View child = parent.getChildAt(i);            RecyclerView v = new RecyclerView(parent.getContext());            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                    .getLayoutParams();            final int top = child.getBottom() + params.bottomMargin;            final int bottom = top + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    public void drawHorizontal(Canvas c, RecyclerView parent) {        final int top = parent.getPaddingTop();        final int bottom = parent.getHeight() - parent.getPaddingBottom();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            final View child = parent.getChildAt(i);            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                    .getLayoutParams();            final int left = child.getRight() + params.rightMargin;            final int right = left + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    @Override    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {        if (mOrientation == VERTICAL_LIST) {            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());        } else {            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);        }    }}

布局文件如下:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:fitsSystemWindows="true"    tools:context=".MainActivity">    <android.support.design.widget.AppBarLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:theme="@style/AppTheme.AppBarOverlay">        <android.support.v7.widget.Toolbar            android:id="@+id/toolbar"            android:layout_width="match_parent"            android:layout_height="?attr/actionBarSize"            android:background="?attr/colorPrimary"            android:theme="@style/AppTheme.AppBarOverlay"            app:popupTheme="@style/AppTheme.PopupOverlay" />    </android.support.design.widget.AppBarLayout>    <include layout="@layout/content_main" />    <android.support.design.widget.FloatingActionButton        android:id="@+id/fab"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="end|bottom"        android:layout_margin="@dimen/fab_margin"        android:src="@android:drawable/ic_dialog_email" /></android.support.design.widget.CoordinatorLayout>

activity_rv_iv_item.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical"    android:padding="15dip">    <ImageView        android:id="@+id/iv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:layout_gravity="center" /></RelativeLayout>

activity_rv_tv_item.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical"    android:padding="15dip">    <TextView        android:id="@+id/tv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:layout_gravity="center"        android:textColor="#000000"        android:textSize="24dip" /></RelativeLayout>

content_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:context=".MainActivity"    tools:showIn="@layout/activity_main">    <android.support.v7.widget.RecyclerView        android:id="@+id/recyclerview"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>

效果图如下:

代码已贴出正所谓取之于社会,回报于社会,还望各位大神批评指正,不喜勿喷,灰常感谢O(∩_∩)O哈哈~


2 0
原创粉丝点击