在我们开发过程中经常会遇到需要我们展示不同样式列表的情况,通常我们都会使用ListView展示列表,然后实现BaseAdapter两个方法,即:getViewTypeCount() 和 getItemViewType(int position)即可实现

不过在Android Nougat Google发布了RecycleView之后,大家都纷纷弃ListView ,GridView,而使用RecycleView。所以今天我们写一个RecycleView实现不同Item条目样式的案例。

RecycleView和RecycleViewAdapter使用步骤:

1,初始化RecycleView及相关设置

     mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);        //设置适配器管理器:LinearLayoutManager GridLayoutManager StaggeredGridLayoutManager(瀑布流),        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));        //添加分割线        mRecyclerView.addItemDecoration(new RecycleItemDecoration(context, RecycleItemDecoration.VERTICAL_LIST));

2,设置适配器和添加数据

mRecyclerView.setAdapter(new RecycleAdapter(context, initData()));
 private List initData() {        List mData = new ArrayList<>();        for (int i = 'A'; i < 'Z'; i++) {            Bean bean = new Bean();            bean.setText((char) i + "");            int type = i % 3;            if (type == 0) {                bean.setType(0);            } else if (type == 1) {                bean.setType(1);            } else if (type == 2) {                bean.setType(2);            }            mData.add(bean);        }        return mData;    }

3实现RecycleViewAdapter适配器并实现所需方法

通常实现常用列表样式只需要实现两个方法即可:

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
用来创建ViewHolder并将item布局添加ViewHolder中

 public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position)
获取已绑定的ViewHolder对象并进行数据填充

而我们使用RecycleView实现不同Item样式的展示,同ListVIew一样,RecycleView也给我们提供了类似的方法,

 public int getItemViewType(int position) 

获取指定苏索引条目的样式类型,返回值即为当前条目样式的类型(我总感觉应该是setItemViewType比较恰当)


通过这三部我们就基本可以使用RecycleView和RecycleAdapter实现列表和多种Item样式布局展示。下面我们展示详细代码:


/** * 作    者 :丁广帅 * 创建日期 :2016/9/29 10:30 * 描   述 : */public class PerfertectFg extends BaseFragment {    @SuppressLint("ValidFragment")    public PerfertectFg(String tabNames, int tabIcons) {        super(tabNames, tabIcons);    }    public PerfertectFg() {    }    private RecyclerView mRecyclerView;    private Context context;    @Override    protected void onCreateViewLazy(Bundle savedInstanceState) {        super.onCreateViewLazy(savedInstanceState);        setContentView(R.layout.child_three);        context = getContext();        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);        //设置适配器管理器:LinearLayoutManager GridLayoutManager StaggeredGridLayoutManager(瀑布流),        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));        //添加分割线        mRecyclerView.addItemDecoration(new RecycleItemDecoration(context, RecycleItemDecoration.VERTICAL_LIST));        mRecyclerView.setAdapter(new RecycleAdapter(context, initData()));    }    private List initData() {        List mData = new ArrayList<>();        for (int i = 'A'; i < 'Z'; i++) {            Bean bean = new Bean();            bean.setText((char) i + "");            int type = i % 3;            if (type == 0) {                bean.setType(0);            } else if (type == 1) {                bean.setType(1);            } else if (type == 2) {                bean.setType(2);            }            mData.add(bean);        }        return mData;    }}

借鉴鸿神的分割线样式:Android RecyclerView 使用完全解析 体验艺术般的控件

public class RecycleItemDecoration extends RecyclerView.ItemDecoration {    /**     * 读取attr资源     */    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 RecycleItemDecoration(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);        }    }    /**     * 绘制竖直方向分割线     *     * @param c     * @param 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);            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.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);        }    }    /**     * 绘制水平方向分割线     *     * @param c     * @param parent     */    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);        }    }}
d RecycleView适配器实现,需要我们注意的一点是如果仅有一种Item样式RecycleAdapter的泛型我们直接写成自定义ViewHolder即可。如果是多种Item样式的话,RecycleAdapter泛型必须为RecycleView.ViewHolder,然后再进行强转

((ViewHolderA) holder).text.setText(mData.get(position).getText() + "------样式一");

/** * 作    者 :丁广帅 * 创建日期 :2016/10/14 14:26 * 描   述 : */public class RecycleAdapter extends RecyclerView.Adapter {    /**     * RecycleViewAdapter 要素点:     * 

* 1,ViewHolder必须继承RecyclerView.ViewHolder * 2,RecycleView.Adapter的泛型为自定义ViewHolder */ private List mData; private Context context; public enum Item_Type { RECYCLEVIEW_ITEM_TYPE_1, RECYCLEVIEW_ITEM_TYPE_2, RECYCLEVIEW_ITEM_TYPE_3 } public RecycleAdapter(Context context, List mData) { this.mData = mData; this.context = context; } /** * 创建ViewHolder * * @param parent * @param viewType :不同ItemView的类型 * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == Item_Type.RECYCLEVIEW_ITEM_TYPE_1.ordinal()) { View mView = LayoutInflater.from(context).inflate(R.layout.recycle_item_a, null); ViewHolderA viewHolder = new ViewHolderA(mView); return viewHolder; } else if (viewType == Item_Type.RECYCLEVIEW_ITEM_TYPE_2.ordinal()) { View mView = LayoutInflater.from(context).inflate(R.layout.recycle_item_b, null); ViewHolderB viewHolder = new ViewHolderB(mView); return viewHolder; } else if (viewType == Item_Type.RECYCLEVIEW_ITEM_TYPE_3.ordinal()) { View mView = LayoutInflater.from(context).inflate(R.layout.recycle_item_c, null); ViewHolderC viewHolder = new ViewHolderC(mView); return viewHolder; } return null; } /** * 绑定数据:可以直接拿到已经绑定控件的Viewholder对象 * * @param holder * @param position */ @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { if (holder instanceof ViewHolderA) { ((ViewHolderA) holder).text.setText(mData.get(position).getText() + "------样式一"); } else if (holder instanceof ViewHolderB) { ((ViewHolderB) holder).text.setText(mData.get(position).getText() + "------样式二"); } else if (holder instanceof ViewHolderC) { ((ViewHolderC) holder).text.setText(mData.get(position).getText() + "------样式三"); } } //返回值赋值给onCreateViewHolder的参数 viewType @Override public int getItemViewType(int position) { if (mData.get(position).getType() == 0) { return Item_Type.RECYCLEVIEW_ITEM_TYPE_1.ordinal(); } else if (mData.get(position).getType() == 1) { return Item_Type.RECYCLEVIEW_ITEM_TYPE_2.ordinal(); } else if (mData.get(position).getType() == 2) { return Item_Type.RECYCLEVIEW_ITEM_TYPE_3.ordinal(); } return -1; } @Override public int getItemCount() { return mData.size(); } class ViewHolderA extends RecyclerView.ViewHolder { public TextView text; public ViewHolderA(View itemView) { super(itemView); text = (TextView) itemView.findViewById(R.id.text); } } class ViewHolderB extends RecyclerView.ViewHolder { public TextView text; public ViewHolderB(View itemView) { super(itemView); text = (TextView) itemView.findViewById(R.id.text); } } class ViewHolderC extends RecyclerView.ViewHolder { public TextView text; public ViewHolderC(View itemView) { super(itemView); text = (TextView) itemView.findViewById(R.id.text); } }}





最后还是建议大家以后尽量使用RecycleView来替代ListVIew和GridView!!!


下载链接:http://download.csdn.net/detail/ding_gc/9655977



更多相关文章

  1. android设置屏幕方向与自动感应切换
  2. 这是我见过有关Android(安卓)RecyclerView最好的一篇文章:深入解
  3. Android(安卓)material Design 之CoordinatorLayout详解
  4. Android(java)学习笔记73:线程组的概述和使用
  5. android之TimePicker
  6. 一段android跳转到web界面的代码
  7. listview与adapter用法
  8. android 开发 讯飞语音唤醒功能
  9. Android(安卓)Material Design 系列之 CoordinatorLayout + Coll

随机推荐

  1. 自定义样式的来源和优先级/css常用选择器
  2. 图文列表与课程表
  3. 自定义样式的来源与优先级及选择器与权重
  4. CSS选择器中优先级和权重区别
  5. CSS的样式来源与样式选择器
  6. VSCode中Emmet的快捷操作
  7. 用户注册页面、简单的后台页面
  8. CSS选择器种类
  9. CSS盒子模型
  10. CSS伪类,状态伪类和结构性伪类