最近學(xué)習(xí)使用第三方LayoutManager實(shí)現(xiàn)了優(yōu)美的圖書(shū)列表驱证,記錄下我的學(xué)習(xí)歷程冷离,同時(shí)寫(xiě)給學(xué)弟學(xué)習(xí)使用愿棋。為此我分成了基礎(chǔ)和進(jìn)階篇招盲,基礎(chǔ)篇主要講利用RecyclerView實(shí)現(xiàn)我們的列表展示扭屁,主要涉及到的知識(shí)是RecyclerView的使用和自定義item點(diǎn)擊事件算谈。進(jìn)階篇講解怎么利用開(kāi)源的LayoutManager實(shí)現(xiàn)優(yōu)美的圖書(shū)展示頁(yè)面。
本次的大綱
-
1.1 RecyclerView的基礎(chǔ)使用
- 1.1.1 RecyclerView的使用之前的配置
- 1.1.2 RecyclerView的創(chuàng)建
- 1.1.3 RecyclerView Adapter的使用
- 1.1.4 LayoutManager的使用
1.2 自定義item點(diǎn)擊事件
1.1 RecyclerView的基礎(chǔ)使用
1.1.1 RecyclerView的使用之前的配置
RecyclerView是support-v7包的一個(gè)列表控件料滥,它相比ListView使用起來(lái)更加靈活然眼,RecyclerView支持添加item增加、刪除動(dòng)畫(huà)葵腹,自定義item分割線等等高級(jí)功能高每。
要使用RecyclerView要導(dǎo)入v7包,在build.gradle包添加如下代碼
compile 'com.android.support:recyclerview-v7:25.3.0'
1.1.2 RecyclerView的創(chuàng)建
使用RecyclerView很簡(jiǎn)單践宴,在布局文件里面添加代碼
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
1.1.3 RecyclerView Adapter的使用
RecyclerView有自己的Adapter鲸匿,我們創(chuàng)建一個(gè)MyRecyclerViewAdapter類(lèi)來(lái)繼承RecyclerView.Adapter。
重寫(xiě)所需方法如下
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
class MyViewHolder extends RecyclerView.ViewHolder{
public MyViewHolder(View itemView) {
super(itemView);
}
}
}
onCreateViewHolder(ViewGroup parent, int viewType) 創(chuàng)建ViewHolder
onBindViewHolder(MyViewHolder holder, int position) 綁定ViewHolder
沒(méi)有用過(guò)RecyclerView或者沒(méi)有對(duì)ListView進(jìn)行優(yōu)化處理的可能不知道ViewHolder是什么阻肩,簡(jiǎn)單來(lái)說(shuō)ViewHolder就是一個(gè)持有者類(lèi)带欢,利用ViewHolder把我們item里面的View包裝起來(lái),就不需要再像每次BaseAdapter里的getView方法執(zhí)行的時(shí)候綁定每個(gè)View的id磺浙,實(shí)現(xiàn)列表的加載的優(yōu)化洪囤。
我們來(lái)完善我們的Adapter,為了簡(jiǎn)單演示撕氧,我們item只包含一個(gè)TextView并居中瘤缩。修改MyRecyclerViewAdapter代碼
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private List<String> mList = new ArrayList<>();
private Context context;
public MyRecyclerViewAdapter(Context context) {
this.context = context;
}
public void setList(List<String> mList){
this.mList.addAll(mList);
notifyDataSetChanged();
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(
LayoutInflater.from(context).inflate(R.layout.item,parent,false));//創(chuàng)建ViewHolder
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textView.setText(mList.get(position));//給TextView設(shè)置文字
}
@Override
public int getItemCount() {
return mList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyViewHolder(final View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
}
}
}
1.1.4 LayoutManager的使用
RecyclerView跟listView不一樣,listView使用簡(jiǎn)單但是會(huì)有很多限制伦泥,而RecyclerView沒(méi)有太多限制剥啤,所以使用起來(lái)好多代碼需要我們自己定義锦溪,就相當(dāng)于RecyclerView只提供給你一個(gè)控件,其他的他什么也不管府怯。
ListView setAdapter 之后就可以使用刻诊,RecyclerView需要一個(gè)LayoutManager來(lái)控制顯示列表的樣式。在這里我就用普通的線性布局(水平牺丙、垂直)來(lái)實(shí)現(xiàn)列表的排布则涯,下一節(jié)演示使用來(lái)源LayoutManager實(shí)現(xiàn)高雅列表布局。
初始化LayoutManager并設(shè)置給RecyclerView
RecyclerView.LayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(manager);
LinearLayoutManager 的第二個(gè)參數(shù)設(shè)置水平(HORIZONTAL)與垂直(VERTICAL)冲簿。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
adapter = new MyRecyclerViewAdapter(this);
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
adapter.setList(list);
RecyclerView.LayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(manager);
mRecyclerView.setAdapter(adapter);
}
可以看到粟判,連分割線都沒(méi)有,正如我所說(shuō)的峦剔,RecyclerView不跟你多提供其他東西档礁,RecyclerView的分割線也可以自己定義,這就比listview靈活得多吝沫,想要炫酷的效果你就要自己去寫(xiě)代碼呻澜。
1.2 自定義item點(diǎn)擊事件
item的點(diǎn)擊事件需要我們自己寫(xiě)接口實(shí)現(xiàn),在Adapter里面添加:
private interface onRecyclerViewOnClickListener{
void onClick(View view,int position);
}
private onRecyclerViewOnClickListener listener;
public void setOnItemClickListener(onRecyclerViewOnClickListener listener){
this.listener = listener;
}
我自定義一個(gè)onRecyclerViewOnClickListener的接口惨险,提供一個(gè)onClick的抽象方法羹幸。并且給Adapter添加一個(gè)setOnItemClickListener方法。
然后在MyViewHolder里面添加外部點(diǎn)擊事件平道,來(lái)處理我們的接口方法睹欲。
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(final View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener!=null){
listener.onItemClick(itemView,getPosition());
}
}
});
}
}
在Activity里面調(diào)用我們的點(diǎn)擊事件
adapter.setOnItemClickListener(new MyRecyclerViewAdapter.onRecyclerViewOnClickListener() {
@Override
public void onItemClick(View view, int position) {
//點(diǎn)擊事件的具體處理代碼
}
});