AndroidStudio中RecyclerView用法

去年写了几篇关于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赋值需要思考三点:

  1. 具体是给item里面的那个小部件赋值呢?
  2. 找到了这个小部件,赋什么值呢?
  3. 要给好多个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文件里面已经写好了,这些数据可以是从上一个页面跳转过来时传递的数据,也可以是从数据库里面读出来的数据...

 

如果你有什么不清楚的,欢迎留言交流....这篇博客写得真的好差,我会不定期继续修改完善的...

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值