RecyclerView学习和使用(基本使用)

文章导图 文章导图

  • RecyclerView 介绍

    A flexible view for providing a limited window into a large data set.
    Android Developer


RecyclerView是一种新的数据容器,目标是为任何基于适配器的视图提供相似的渲染方式。可以完全替代ListView和GridView,在support-V7版本中提供支持。
  • RecyclerView 基本使用方法(类似于ListView使用)

    1. RecyclerView 已经包含在 /sdk/extras/android/support/v7 目录下。
      • 如果使用Eclipse 开发,只是导入recyclerview.jar 是不够的,因为有用到本身布局的一些东西。所以要将整个 recyclerview工程作为你项目的依赖。
      • 如果使用AS就简单多了,直接在Module的build.gradle加入依赖
        compile 'com.android.support:recyclerview-v7:22.2.0'
    2. 编写item布局,只是包含两个TextView

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
      
          <TextView
              android:id="@+id/list_num"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              />
          <TextView
              android:id="@+id/list_content"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginLeft="100dp"
              />
          </LinearLayout>
    3. 编写主容器布局

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:tools="http://schemas.android.com/tools"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  tools:context=".MainActivity">
      
      <Button
          android:text="@string/add_item"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:id="@+id/add_item"/>
      
      <android.support.v7.widget.RecyclerView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:id="@+id/recycler_view_list"
          android:layout_below="@+id/add_item"
          />
      </RelativeLayout>

    这里虽然设置RecyclerView是wrap_content的,但是实际上如果没有其他元素会是match_parent的效果,所以需要根据条目调整高度的需求就需要在带代码中手动控制了。可以通过继承LinearLayoutManager 复写 onMeasure方法

    1. 编写对应的Adapter
      package com.baron.learn;
      
      import android.support.v7.widget.RecyclerView;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;
      import android.widget.TextView;
      
      import java.util.ArrayList;
      
      /**
       * Created by Lixiang on 2015/9/8 0008.
       */
      public class RecyclerViewListAdapter extends RecyclerView.Adapter{
      
      private ArrayList<DataModel>mDatas = new ArrayList<>();
      private static int count = 0;
      
      
      @Override
      public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                  return new DataModelViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false));
      }
      
      @Override
      public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
          DataModelViewHolder mHolder = (DataModelViewHolder) holder;
          mHolder.mNumTextView.setText(mDatas.get(position).mNumber+"");
          mHolder.mContentTextView.setText(mDatas.get(position).mContent);
      }
      
      @Override
      public int getItemCount() {
          return mDatas.size();
      }
      
      class DataModelViewHolder extends RecyclerView.ViewHolder{
      
          public TextView mNumTextView;
          public TextView mContentTextView;
      
          public DataModelViewHolder(View itemView) {
              super(itemView);
              mNumTextView = (TextView) itemView.findViewById(R.id.list_num);
              mContentTextView = (TextView) itemView.findViewById(R.id.list_content);
          }
      }
      
      public void addOneItem(DataModel pData , int position){
          mDatas.add(position,pData);
          notifyItemInserted(position);
      }
      
      public void addAll(ArrayList<DataModel>list){
          mDatas.addAll(list);
          notifyDataSetChanged();
      }
      
      public void addOneItemRandom(){
          DataModel pData = new DataModel(count++);
          //int position = new Random(getItemCount()).nextInt();
          //Log.d("MainActivity","在" + position + "添加一项");
          addOneItem(pData, 0);
      
      }
      }

    这里需要注意一点的是,在添加一项或者删除一项时 没有同ListView 一样使用 notifyDataChanged(); 而是使用了 notifyItemInserted(position);,这样是为了避免item动画失效的问题,当然不考虑动画因素使用notifyDataChanged();是一样的。

    1. View 容器中使用
        public class MainActivity extends Activity {
            private static final String TAG = "MainActivity";
            @Bind(R.id.add_item)
            Button mAddOneItem;
            @Bind(R.id.recycler_view_list)
            RecyclerView mRecyclerViewList;
            private DefaultItemAnimator mItemAnimator;
            private LinearLayoutManager mLinearLayoutManager;
            private RecyclerViewListAdapter mRecyclerViewListAdapter;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                ButterKnife.bind(this);
                initRecyclerView();
            }
        private void initRecyclerView(){
            mItemAnimator = new DefaultItemAnimator();
            mLinearLayoutManager = new LinearLayoutManager(this);
            mRecyclerViewListAdapter = new RecyclerViewListAdapter();
    
            mRecyclerViewList.setItemAnimator(mItemAnimator);
            mRecyclerViewList.setLayoutManager(mLinearLayoutManager);
            mRecyclerViewList.setAdapter(mRecyclerViewListAdapter);
        }
        @OnClick(R.id.add_item)
        public void onClick(View v){
            Log.d(TAG,"add one item");
            mRecyclerViewListAdapter.addOneItemRandom();
            mLinearLayoutManager.scrollToPosition(0);
        }
    }

这里使用了默认的条目动画,继承RecyclerView.ItemAnimator可以很方便的实现条目动画,github上已经有了蛮多的动画实现,推荐这个动画开源库 可以很方便实现各种条目的出现效果。以上代码使用了ButterKinfe,有兴趣的同学可以学一下。

以上是使用RecyclerView实现ListView效果的基本流程,剩下的需求可以基于此进一步展开。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值