文章导图
- RecyclerView 介绍
A flexible view for providing a limited window into a large data set.
– Android Developer
RecyclerView是一种新的数据容器,目标是为任何基于适配器的视图提供相似的渲染方式。可以完全替代ListView和GridView,在support-V7版本中提供支持。
RecyclerView 基本使用方法(类似于ListView使用)
- RecyclerView 已经包含在 /sdk/extras/android/support/v7 目录下。
- 如果使用Eclipse 开发,只是导入recyclerview.jar 是不够的,因为有用到本身布局的一些东西。所以要将整个 recyclerview工程作为你项目的依赖。
- 如果使用AS就简单多了,直接在Module的build.gradle加入依赖
compile 'com.android.support:recyclerview-v7:22.2.0'
编写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>
编写主容器布局
<?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方法
- 编写对应的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();
是一样的。- 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 已经包含在 /sdk/extras/android/support/v7 目录下。
这里使用了默认的条目动画,继承RecyclerView.ItemAnimator
可以很方便的实现条目动画,github上已经有了蛮多的动画实现,推荐这个动画开源库 可以很方便实现各种条目的出现效果。以上代码使用了ButterKinfe,有兴趣的同学可以学一下。
以上是使用RecyclerView实现ListView效果的基本流程,剩下的需求可以基于此进一步展开。