踏平RecyclerView使用的各种坑,跟ListView和GridView说拜拜

RecyclerView是谷歌推出的新View,使用和listview差不多。

在此之前推荐一本书:跟着敲一遍你能从中级变高级,从习惯eclipse变成使用Android studio大神。


但是RecyclerView对于初学者还是有点难度,下面以最简短的代码让你一眼明白并牢记RecyclerView的使用方法

mRecyclerView = findViewById(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
mRecyclerView.addItemDecoration(new MyItemDecoration(
                this, MyItemDecoration.HORIZONTAL));

只有这四个方法简单吗??、

特别需要做的是写自己的adapter

使用步骤:

①创建RecyclerView 对象

②设置适配器adapter

完成了。。。。

所以只要会写adapter就会用RecyclerView了

最简单的使用demo可参考http://blog.csdn.net/gfg156196/article/details/51727783

使用中的过程总结:

①导包,请导入RecyclerView的包,不要选择V7包。

compile 'com.android.support:recyclerview-v7:25.0.1'

②创建自己的adapter

/**
 * Created by yugu88 on 2016/11/29.15:14
 * 注意点:必须使用泛型Adapter<RecHoder>
 */

public class RecAdapter extends RecyclerView.Adapter<RecHoder> {
    Activity content;
    String[] menu_text;

    public RecAdapter(Activity content, String[] menu_text) {
        this.content=content;
        this.menu_text=menu_text;
    }

    /**
     * @return RecHoder 修改此返回类型为自己定义的ViewHolder
     */
    @Override
    public RecHoder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater=LayoutInflater.from(content);
        View view=layoutInflater.inflate(R.layout.adapter_listview_menu, parent, false);
        return new RecHoder(view);//创建自己的ViewHolder并返回此对象
    }

    /**
     * @param holder 修改此ViewHolder的类型为自己定义的RecHoder
     */
    @Override
    public void onBindViewHolder(RecHoder holder, final int position) {
      
        holder.tv_menu.setText(menu_text[position]);

        Log.e("getItemCount",position+"");
        holder.tv_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });
    }

    @Override
    public int getItemCount() {
        return menu_text.length;
    }

}

③创建自己的ViewHolder

/**
 * Created by yugu88 on 2016/11/29.15:52
 */

public class RecHoder extends RecyclerView.ViewHolder {
 
    public TextView tv_menu;

    public RecHoder(View itemView) {
        super(itemView);
        tv_menu=(TextView) itemView.findViewById(R.id.tv_menu);
    }
}

④在Activity中使用RecyclerView

listview_menu=(RecyclerView) findViewById(R.id.listview_menu);
listview_menu.setLayoutManager(new LinearLayoutManager(this));// 此句最最重要LinearLayoutManager就是listview类型的
//listview_menu.setLayoutManager(new GridLayoutManager(this,4));// 此为GridView类型的视图 4列
//创建adapter对象
RecAdapter recAdapter=new RecAdapter(this, menu_text);
//设置adapter
listview_menu.setAdapter(recAdapter);

setLayoutManager();的参数有如下几种:

LinearLayoutManager 线性管理器。支持横向、纵向。

GridLayoutManager 网格布局管理器
StaggeredGridLayoutManager 瀑布就式布局管理器

如果需要分割线:

// 第二个参数是横线或者竖线的意思
listview_menu.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL));

可以在setAdapter(recAdapter)之前或者之后都可以。

LinearLayoutManager.HORIZONTAL 表示分割线是横着画的,一般用在垂直滚动的listview。如下。


addItemDecoration该方法的参数为RecyclerView.ItemDecoration,该类为抽象类,我们需要继承它写一个自己的类。

它的源码很短,如下:

 public static abstract class ItemDecoration {

        public void onDraw(Canvas c, RecyclerView parent, State state) {
            onDraw(c, parent);
        }

        @Deprecated
        public void onDraw(Canvas c, RecyclerView parent) {
        }

        public void onDrawOver(Canvas c, RecyclerView parent, State state) {
            onDrawOver(c, parent);
        }

        @Deprecated
        public void onDrawOver(Canvas c, RecyclerView parent) {
        }

        @Deprecated
        public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
            outRect.set(0, 0, 0, 0);
        }

        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
            getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
                    parent);
        }
    }

方法都没有实现,我们继承它实现自己的方法即可。

注意:onDraw方法,使用带有State state参数的方法。。

具体的画线的类如何写可以参考http://www.cnblogs.com/huolongluo/p/5879292.html

如果你实在是懒得写分割线,可以直接把别人的分割线类拿来使用。。。



发布了68 篇原创文章 · 获赞 128 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/gfg156196/article/details/53405940