去年写了几篇关于Android的基础知识点,没想到收到了很多朋友的好评,不过后来太忙了没有继续更新,真的蛮遗憾的。最近又要用到Android啦,超级无敌巨重要的RecyclerView怎么能不讲一讲呢!!
1.什么是RecyclerView?
在介绍RecyclerView之前,首先要知道他能实现什么呢——列表!(各种花里胡哨的列表哈哈哈)
上面的图框起来的部分都是用RecyclerView实现的,不过他们都不够花里胡哨,其实RecyclerView可以实现更加复杂的列表,在下面的介绍中争取弄一个花里胡哨的吧~不过说到底,RecyclerView到底是啥呢??可以把它理解成一块空间,就像刚刚图片上圈出来的地方,就是一块空间,仅仅定义一个RecyclerView,就可以得到这块空间,但也就仅仅只有这块空间,里面什么也没有的。里面的东西怎么装进去呢,就要涉及RecyclerView的另外两个配套神器了!!item.xml和adpter.java啦,下面会详细介绍。
截止现在,要清楚的一点就是,RecyclerView可以实现列表,而什么是列表呢?大致就是重复同一个样式的元素,形成了一个有顺序的列表(实在不知如何解释,大家都懂的吧)
2.RecyclerView的配套神器
item.xml(其实item只是一个名字,完全可以自定义的哈)
作用:定义列表中,一条数据的样式!!(为了方便说明,下文就叫它item了哈)
(什么是一条数据呢?例如下面这个图片中,绿色框起来的就是RecyclerView占得一块空间,在这个空间里面,装着整个列表,而列表中的一条数据,就是红色框起来的部分)
一个item的样式可以很复杂(像这个火锅团购的一样,有图片、各种文字、按钮,甚至更复杂),也可以很简单(像最上面的举例一样,就一张图),我这里举一个例子吧,只为突出重点,没有任何美工,别嫌弃啊!
怎么实现这样一条数据的样式呢?
(storelist_item.xml) 记住它的名字哦!!后面会串起来~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="200dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="4"
android:layout_height="200dp">
<ImageView
android:id="@+id/image_store"
android:layout_width="match_parent"
android:layout_height="100dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:layout_height="200dp">
<TextView
android:id="@+id/tv_store_name"
android:layout_width="match_parent"
android:layout_height="30dp"
android:textSize="24sp"/>
<TextView
android:id="@+id/tv_store_address"
android:layout_width="match_parent"
android:layout_height="30dp"
android:textSize="24sp"/>
<TextView
android:id="@+id/tv_store_serve"
android:layout_width="match_parent"
android:layout_height="30dp"
android:textSize="24sp"/>
</LinearLayout>
</LinearLayout>
注意点:和普通页面的布局没啥区别,也是各种LinearLayout或者RelativeLayout搞定。但是每个组件,最好都要给一个Id哦!!
adapter.java
搞定了item.xml,接下来就是弄适配器了~
作用:动态的给item赋值
一个列表由很多个item组成,但是总不能让每个item都长一样吧,所以每个列表的具体内容,就是adapter来把关,初学看到adapter真的都有点怕,至少我当初是这样的嘤嘤嘤,其实adapter里面的内容也是很套路的,知道那部分做啥就知道该怎么改怎么用了。
先分析一下,要实现动态给item赋值需要思考三点:
- 具体是给item里面的那个小部件赋值呢?
- 找到了这个小部件,赋什么值呢?
- 要给好多个item赋值呢?
上面的三个问题,就对应了adapter里面的三个方法
1.具体是给item里面的那个小部件赋值呢?
2.找到了这个小部件,赋什么值呢?
3.要给好多个item赋值呢?
下面贴了storelist_item.xml对应的adapter(StoreListAdapter.java)的代码,只需要弄懂刚刚提到的三部分的作用和对应的位置就行。
注意:LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.storelist_item,parent,false)); 适配器和item.xml就是这句话连接起来的!!
package com.example.wmn.pet;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
public class StoreListAdapter extends RecyclerView.Adapter <StoreListAdapter.LinearViewHolder>{
private Context mContext;
String[] names = {"菠菜宠物店1","菠菜宠物店2", "菠菜宠物店3", "菠菜宠物店4"};
String[] address = {"重庆市北碚区天生路1号","重庆市北碚区天生路2号","重庆市北碚区天生路3号","重庆市北碚区天生路4号"};
String[] serves = {"服务1","服务2","服务3","服务4"};
int[] imags={R.drawable.store1,R.drawable.store2,R.drawable.store3,R.drawable.store4};
public StoreListAdapter(Context context){
this.mContext=context;
}//构造方法
@Override
//返回一个ViewHolder
//public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
public StoreListAdapter.LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.storelist_item,parent,false));
}
@Override
//绑定ViewHolder
//public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
public void onBindViewHolder(StoreListAdapter.LinearViewHolder holder, final int position) {
holder.tv_name.setText(names[position]);
holder.tv_address.setText(address[position]);
holder.tv_serve.setText(serves[position]);
holder.image.setImageResource(imags[position]);
}
@Override
//获取列表长度
public int getItemCount() {
return 4;
}
class LinearViewHolder extends RecyclerView.ViewHolder {
//找到组件
private TextView tv_name,tv_address,tv_serve;
private ImageView image;
public LinearViewHolder(View itemView) {
super(itemView);
tv_name = itemView.findViewById(R.id.tv_store_name);
tv_address = itemView.findViewById(R.id.tv_store_address);
tv_serve = itemView.findViewById(R.id.tv_store_serve);
image=itemView.findViewById(R.id.image_store);
}
}
}
使用RecyclerView
1.声明。RecyclerView也和普通组件一样,要用的话在xml里面声明哦
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_grid_home"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#8BC34A" />
2.在java里面进一步定义
public class MainActivity extends AppCompatActivity {
private RecyclerView rv_storelist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv_storelist = findViewById(R.id.rv_grid_home);
rv_storelist.setLayoutManager(new LinearLayoutManager(MainActivity.this));
rv_storelist.setAdapter(new StoreListAdapter(MainActivity.this));
}
}
代码不多,就这几句,重要的三句我们一句一句解释哈
rv_storelist = findViewById(R.id.rv_grid_home); 在xml里面声明了一个RecyclerView,给它取了一个id,这里需要用id找到它
rv_storelist.setLayoutManager(new LinearLayoutManager(MainActivity.this)); 这里是要设置item们的布局,是一行一个?还是一行2个?还是交错着那个瀑布布局啥的?如果item是要一行一个的布局,那就LinearLayoutManager,如果是一行多个就GridLayoutManager
rv_storelist.setAdapter(new StoreListAdapter(MainActivity.this)); 给RecyclerView设置适配器
截止现在,一个完整的RecyclerView的demo就搞定啦!!其实真的不难,但是好难讲清楚啊!那种词不达意的感觉真难受,来一波总结吧
- item.xml+adapter.java 决定 RecyclerView的样式
- 使用RecyclerView要在xml里面当组件用,在java里面进一步设置
- item的动态绑定数据,其实不一定要像刚才那样,在.java文件里面已经写好了,这些数据可以是从上一个页面跳转过来时传递的数据,也可以是从数据库里面读出来的数据...
如果你有什么不清楚的,欢迎留言交流....这篇博客写得真的好差,我会不定期继续修改完善的...