天天看点

RecyclerView知识点小解<pre name="code" class="java" style="font-size: 24px; font-weight: bold; text-align: center;"> RecyclerView知识点小解

<pre name="code" class="java" style="font-size: 24px; font-weight: bold; text-align: center;">
           

RecyclerView知识点小解

  在现在的App中, 到处可见RecyclerView的身影, 几乎已经把传统的ListView给迭代更新掉了。    由此可见该组件的重要性。  这篇文章主要就是把RecyclerView的基本知识点给讲解一下,  已经如何使用RecyclerView。

      一、注意

   该组件是Android超级库里面的, 想要使用需要先把该组件导入工程,本人用的IDE是Android Studio, 最好大家不要采用Eclipse进行开发,    因为Google之前在Eclipse写的ADT太老了。 就算你引用了该组件的JIRA, 编译的时候它也带入不进去。

  二、导入

   在当前工程的Window找到   File --> Project Structure...会弹出一个新窗口, 点击左边的app --> Dependencies --> '+'(加号) -->     选第一个 --> 找到你要的RecyclerView组件点击OK即可、    因为大多人都知道怎么导入的, 为了方便就不上图片版的嘞。

三、与传统的ListView进行比较

   传统的ListView在进行视图复用中并没有硬性要求, 你可以进行视图缓存, 也可以不进行。    但是RecyclerView就提供了一个类为RecyclerView.ViewHolder.  你必须按照视图缓存方式进行处理。    定制Item视图项, ListView只能实现垂直性排列的列表视图, 然而RecyclerView则是通过RecyclerView.LayoutManager进行展示,     只要你能写的出, 就没有办不到的视图呈现方式。  (单单就这一点就可以吧ListView给舍弃了)       Item动画, 还记得在ListView中写动画的时候需要考虑的复杂因素, 而且ListView也没有提供任何方便开发者的接口,    相反的, 可以通过RecyclerView.ItemAnimator来设置每个条目的展示动画。         适配器,  在ListView中有太多的Adapter告诉开发者, 游标适配器、 基本适配器... 太多了, RecycerView就可以让我们开发自己提供    数据集, RecyclerView.Adapter。  这样就可以不需要管那么多Adapter该用什么好了。(我学习ListView的时候, 被这个搞破了脑子)    设置每个Item条目的分割线, ListView中可以设置android:driver属性来控制每个Item可有的分割线, RecyclerView提供了    Recycler.ItemDecoration来控制每个条目的分割效果。(我基本上都是直接采用每个Item的margin或padding的方式进行分割)    Item点击事件, ListView可以直接设置OnItemClickListener方法, 在RecyclerView就可以设置OnItemTouchListener。  明显RecyclerView可以    进行的逻辑操作更多。

    四、 基础知识点

      RecyclerView.Adapter扮演者重要的角色, 一般我们着重重写他的两个方法。onCreateViewHolder, onBindViewHolder。   public ViewHolder onCreateViewHolder(...)创建Item视图, 并返回响应的ViewHolder   public void onBindViewHolder(....)  绑定当前Item的视图展示项。   RecyclerView.LayoutManager 负责Item的展示, 以及何时回收。  每个RecyclerView必须指定一个LayoutManager, 否则会抛出异常。   LinearLayoutManager :  水平或者垂直的Item视图。   GridLayoutManager: 网格Item视图 StaggereGridLayoutManager交错的网格Item视图。 当然还有一些很实用的API:

findFirstVisibleItemPosition()

返回当前第一个可见Item的position

findFirstCompletelyVisibleItemPosition()

返回当前第一个完全可见Item的position

findLastVisibleItemPosition()

返回当前最后一个可见Item的position

findLastCompletelyVisibleItemPosition()

返回当前最后一个完全可见Item的position

五、使用

<span style="font-family:Microsoft YaHei;font-size:14px;">public class MainActivity extends Activity {

    private RecyclerView mRecyView;
    private List<String> mDatas;
    private MyRecyclerViewAdapter mRecyViewAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initDatas();

        mRecyViewAdapter = new MyRecyclerViewAdapter(this, mDatas);
        mRecyView.setAdapter(mRecyViewAdapter);
        mRecyView.setLayoutManager(new GridLayoutManager(this, 2));
    }

    private void initDatas() {
        mDatas = new ArrayList<String>();

        mDatas.add(0, "Android");
        mDatas.add(1, "IOS");
        mDatas.add(2, "Java");
        mDatas.add(3, "C");
        mDatas.add(4, "C++");
        mDatas.add(5, "C#");
        mDatas.add(6, "HTML");
        mDatas.add(7, "CSS");
        mDatas.add(7, "JavaScript");

    }

    private void initView() {
        mRecyView = (RecyclerView) this.findViewById(R.id.main_recy_view);
    }
}</span>
           
<span style="font-family:Microsoft YaHei;font-size:14px;">public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

    private Context mContext;
    private List<String> mDatas;
    private LayoutInflater mLayoutInflater;

    public MyRecyclerViewAdapter(Context ctx, List<String> datas){
        this.mContext = ctx;
        this.mDatas = datas;
        mLayoutInflater = LayoutInflater.from(mContext);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(mLayoutInflater.inflate(R.layout.main_recy_view_layout, parent, false));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTv.setText(mDatas.get(position));
    }

    @Override
    public int getItemCount() {
        return mDatas == null ? 0 : mDatas.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        private TextView mTv;
        public ViewHolder(View itemView) {
            super(itemView);

            mTv = (TextView) itemView.findViewById(R.id.main_recy_view_tv);
            mTv.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            int id = v.getId();
            switch (id){
                case R.id.main_recy_view_tv:
                    Toast.makeText(mContext, ((TextView) v).getText().toString(), Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }
}</span>
           

运行效果:

RecyclerView知识点小解&lt;pre name="code" class="java" style="font-size: 24px; font-weight: bold; text-align: center;"&gt; RecyclerView知识点小解

大家可切换不同的LayoutManager进行查看效果。