Android系统在5.0版本推出了新控件——RecyclerView。RecyclerView几乎要将我们过去使用的ListView取代掉。因为我们不再需要自己管理一个带有static关键字的ViewHolder,不再需要控制Item的回收,同时,它也为我们提供了Item的添加和减除的动画接口。最后,最重要的是,它为ListView这样的,多项重复布局,提供了更好的解耦。将ListView这样的列表,拆解成了一个没有布局规则的可回收布局,和一个布局管理器。
本系列将记录我学习使用RecyclerView的过程,希望通过这一次的学习,我能够用它完全地替代掉RecyclerView。
首先看基本使用:
RecyclerView的基本使用由4部分构成,分别是RecyclerView、Adapter、ViewHolder和LayoutManager。
其中,Adapter负责ViewHolder、数据和RecyclerView三者的连接,而LayoutManager则管理了多个ViewHolder之间的关系。
这里我写了一个简单的例子:
ViewHolder:
import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.TextView; /** * Created by fishboneLsy on 2016/6/25. */ public class ItemViewHolder<T extends BaseBean> extends RecyclerView.ViewHolder { TextView textView; public ItemViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.item_textview_id); } public void bindViewHolder(T bean , int position){ if (bean instanceof DataBean){ textView.setText(((DataBean) bean).getName()); } } }
我们在ViewHolder的构造方法中,获取Item子控件的实例。然后,自己编写一个public方法,用于连接数据和ViewHolder。
Adapter:
import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * Created by fishboneLsy on 2016/6/25. */ public class RecyclerViewAdapter extends RecyclerView.Adapter<ItemViewHolder> { Context mContext; List<BaseBean> mDataList; public RecyclerViewAdapter(Context context , List<BaseBean> dataList){ mContext = context; mDataList = dataList; } @Override public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item_layout , parent , false); return new ItemViewHolder(view); } @Override public void onBindViewHolder(ItemViewHolder holder, int position) { holder.bindViewHolder(mDataList.get(position) , position); } @Override public int getItemCount() { if (mDataList != null){ return mDataList.size(); } return 0; } }
Adapter中三个方法,分别是:
获取ViewHolder实例,通常一个item在一个列表中只会调用一次;
连接ViewHolder和数据,当item被回收又重新需要显示时,此方法会调用一次;
获取RecyclerView管理的item个数,在setAdapter和adapter.notifyDataSetChanged时调用。
最后来看一下RecyclerView的设置:
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; RecyclerViewAdapter adapter; List<BaseBean> dataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dataList = new ArrayList<>(); recyclerView = (RecyclerView) findViewById(R.id.recycler_view_id); adapter = new RecyclerViewAdapter(this , dataList); recyclerView.setAdapter(adapter); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); initTest(); adapter.notifyDataSetChanged(); } private void initTest(){ for (int i = 0 ; i < 30 ; i++){ dataList.add(new DataBean("position = " + i)); } } }
这样,一个基本的类ListView列表就诞生了。目前来说,它的主要优势只有两个,一个是更好看的回收机制,另一个是自由的布局方式。
缺点就一大堆了:没有HeaderView和FooterView、没有FastScroller等等。接下来,我们将逐步发现它更多的优点,并弥补它的缺陷。
Done~