写在前面:这个博客是我学习了三次recyclerview之后才理解了结构写的,因为问同学或者看书讲的对新手都很不友好(个人见解),所以尝试一下能不能写一篇对新手比较友好的recyclerview结构解释。当然里面有很多不是非常正确的描述,仅仅用于新手理解,请勿较真。

activity的xml文件(activity_mian.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
 
</LinearLayout>

这个就是把你的activity设置成recyclerview

“item”的xml文件(item.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
 
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="10dp" />
 
</LinearLayout>

recyclerview大家应该都知道结果是什么样子了,这个文件就是每一项(条)内容的布局

接下来是个人认为比较难理解的逻辑内容了:

一共有三个必需类(Activity,Adapter,Viewholder),和一个非必需类(Entity):

Activity类就和普通的Activity类是一样的作用。在Activity类中需要定义要显示的数据,Activity类是和recyclerview的整体布局文件相对应,用recyclerview调用setAdapter,传入显示数据即达到想要效果。

Entity类中的内容是与每一小项(条)中的内容一一对应,用于对ViewHolder中的绑定上的组件提供显示内容

Viewholder类是获取item.xml文件中的布局,把xml中的组件和java中的变量联系起来

Adapter类是将要显示的内容填入每一条,其中有三个必须实现的函数:

             onCreateViewHolder:创建一个ViewHolder,来装下xml中的布局

             onBindViewHolder:将组件填上显示内容

             getItemCount:获取要显示的小项个数

下面是代码:

Mainactivity.java:(对应xml文件为activity_main.xml)

package com.example.learnrecyclerview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private List<Entity> mDatas;
    private MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this,
                                           LinearLayoutManager.VERTICAL,false));
        myAdapter = new MyAdapter(mDatas);
        mRecyclerView.setAdapter(myAdapter);
    }

    protected void initData()
    {
        mDatas = new ArrayList<>();
        for (int i = 'A'; i < 'Z'; i++)
        {
            Entity t = new Entity();
            t.setS1("" + (char) i);
            mDatas.add(t);
        }
    }
}


MyAdapter.java:(无对应xml文件,并且其中包含了一个MyHolder的内部类,内部类中的属性和item中的组件对应,可以说MyHolder的对应xml文件为item.xml)

package com.example.learnrecyclerview;

import android.content.Context;
import android.support.annotation.NonNull;
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.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {

    private List<Entity> entityList;//要显示的数据

    public MyAdapter(List<Entity> entityList) {
        this.entityList = entityList;
    }

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = View.inflate(viewGroup.getContext(),R.layout.item, null);
        MyHolder holder = new MyHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder myHolder, int i) {
        myHolder.item.setText(entityList.get(i).getS1());
    }

    @Override
    public int getItemCount() {
        return entityList.size();
    }

    class MyHolder extends RecyclerView.ViewHolder {

        private TextView item;

        public MyHolder(@NonNull View itemView) {
            super(itemView);
            item = itemView.findViewById(R.id.item);
        }

    }
}

Entity.java:(无对应xml文件,但是类的属性需要和item中的要显示内容的组件的内容一一对应)

package com.example.learnrecyclerview;

public class Entity {
    private String s1;


    public String getS1() {
        return s1;
    }

    public void setS1(String s1) {
        this.s1 = s1;
    }

}

结果截图:

        

         现在想想好像挺简单的,但是不知道为什么一开始总是不懂,可能有些细节没有注意到,还有就是其中几个很重要的概念Adapter和ViewHolder没有搞清楚,不知道他们两个的区别在哪里,所以就有些懵。现在终于弄懂了!记录一下。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐