2.RecyclerView

跟ListView效果基本接近,但是性能,效果与灵活性比ListView强

它还可以横向滚动,能够显示列表,网格,瀑布流等形式,且不同的ViewHolder能够实现item多元化功能,但是使用起来稍微麻烦一点,没有类似ListView的onItemClickListener监听事件,需要开发者自己实现。

RecyclerView不能像ListView那样直接使用,因为他是新增的控件,得在project视图下的app文件夹下的build.gradle下导入依赖包 

 

implementation 'androidx.recyclerview:recyclerview:1.1.0'

 

 导包失败,加一行代码

 

首先在进行项目之前我们先写个菜单栏

 

 

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <!--listView-->
    <item android:title="ListView效果"
          android:id="@+id/list_view">
        <menu>
            <item android:title="垂直标准"
                  android:id="@+id/list_view_vertical_stander">
            </item>
            <item android:title="垂直反向"
                android:id="@+id/list_view_vertical_reverse">
            </item>
            <item android:title="水平标准"
                android:id="@+id/list_view_horizontal_stander">
            </item>
            <item android:title="水平反向"
                android:id="@+id/list_view_horizontal_reverse">
            </item>
        </menu>
    </item>

    <!--网格效果-->
    <item android:title="GridView效果"
        android:id="@+id/Grid_view">
        <menu>
            <item android:title="垂直标准"
                android:id="@+id/grid_view_vertical_stander">
            </item>
            <item android:title="垂直反向"
                android:id="@+id/grid_view_vertical_reverse">
            </item>
            <item android:title="水平标准"
                android:id="@+id/grid_view_horizontal_stander">
            </item>
            <item android:title="水平反向"
                android:id="@+id/grid_view_horizontal_reverse">
            </item>
        </menu>
    </item>

    <!--瀑布流-->
    <item android:title="StaggerView效果"
        android:id="@+id/stagger_view">
        <menu>
            <item android:title="垂直标准"
                android:id="@+id/stagger_view_vertical_stander">
            </item>
            <item android:title="垂直反向"
                android:id="@+id/stagger_view_vertical_reverse">
            </item>
            <item android:title="水平标准"
                android:id="@+id/stagger_view_horizontal_stander">
            </item>
            <item android:title="水平反向"
                android:id="@+id/stagger_view_horizontal_reverse">
            </item>
        </menu>
    </item>

</menu>

光写了菜单栏还不行,还显示不出来,那我们怎么让菜单栏显示出来呢??

//加载菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
     //MenuInflater是用来实例化Menu目录下的Menu布局文件 getMenuInflater().inflate(R.menu.menu,menu);
return super.onCreateOptionsMenu(menu); }

菜单出来了了,咋获取每个item以便后续给他们加上各自的状态?

  //当菜单被选中
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();
        switch (itemId){
//            list view
            case R.id.list_view_vertical_stander:
                Log.d(TAG,"点击了list_view_vertical_stander");
                break;
            case R.id.list_view_vertical_reverse:
                Log.d(TAG,"点击了list_view_vertical_reverse");
                break;
            case R.id.list_view_horizontal_stander:
                Log.d(TAG,"点击了list_view_horizontal_stander");
                break;
            case R.id.list_view_horizontal_reverse:
                Log.d(TAG,"点击了list_view_horizontal_reverse");
                break;
//            grid view
            case R.id.grid_view_vertical_stander:
                Log.d(TAG,"点击了grid_view_vertical_stander");
                break;
            case R.id.grid_view_vertical_reverse:
                Log.d(TAG,"点击了grid_view_vertical_reverse");
                break;
            case R.id.grid_view_horizontal_stander:
                Log.d(TAG,"点击了grid_view_horizontal_stander");
                break;
            case R.id.grid_view_horizontal_reverse:
                Log.d(TAG,"点击了grid_view_horizontal_reverse");
                break;
//            stagger view
            case R.id.stagger_view_vertical_stander:
                Log.d(TAG,"点击了stagger_view_vertical_stander");
                break;
            case R.id.stagger_view_vertical_reverse:
                Log.d(TAG,"点击了stagger_view_vertical_reverse");
                break;
            case R.id.stagger_view_horizontal_stander:
                Log.d(TAG,"点击了stagger_view_horizontal_stander");
                break;
            case R.id.stagger_view_horizontal_reverse:
                Log.d(TAG,"点击了stagger_view_horizontal_reverse");
                break;
        }
        return super.onOptionsItemSelected(item);
    }

现在我们的前期准备工作做好了

第一个界面我想写成左边图片右边文字那样的

先写个布局 item_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="90dp">

    <ImageView
        android:id="@+id/list_view_icon"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_margin="10dp"
        android:src="@drawable/ic_baseline_toys_24"
        android:scaleType="fitXY"/>

    <TextView
        android:id="@+id/list_view_title"
        android:textSize="40dp"
        android:text="小风车"
        android:layout_marginTop="20dp"
        android:layout_toRightOf="@id/list_view_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>

写RecyclerView  activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

MainActivity.class

package com.example.myrecyclerview;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myrecyclerview.adapters.ListViewAdapter;
import com.example.myrecyclerview.beans.Datas;
import com.example.myrecyclerview.beans.ItemBean;

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

/**
 * 总结:
 * 1、首先我们要有控件,这个RecyclerView它呢,
 * 添加RecyclerView的依赖,这样子才能在布局文件里使用RecyclerView这个控件。
 * 2、通过findViewById找到控件
 * 3、准备好数据
 * 4、设置布局管理器
 * 5、创建适配器
 * 6、设置适配器
 * 7、数据就可以现实出来了
 */

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    RecyclerView recyclerView;
    LinearLayoutManager linearLayoutManager;

    //假数据
    List<ItemBean> mData;

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

        //找到recyclerview
        recyclerView = (RecyclerView)this.findViewById(R.id.recycler_view);
        //RecyclerView需要设置样式(布局)
        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);
        //准备数据 模拟一些假数据
        initData();
    }

    //加载菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu,menu);
        return super.onCreateOptionsMenu(menu);
    }


    //当菜单被选中
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();
        switch (itemId){
//            list view
            case R.id.list_view_vertical_stander:
                Log.d(TAG,"点击了list_view_vertical_stander");
                break;
            case R.id.list_view_vertical_reverse:
                Log.d(TAG,"点击了list_view_vertical_reverse");
                break;
            case R.id.list_view_horizontal_stander:
                Log.d(TAG,"点击了list_view_horizontal_stander");
                break;
            case R.id.list_view_horizontal_reverse:
                Log.d(TAG,"点击了list_view_horizontal_reverse");
                break;
//            grid view
            case R.id.grid_view_vertical_stander:
                Log.d(TAG,"点击了grid_view_vertical_stander");
                break;
            case R.id.grid_view_vertical_reverse:
                Log.d(TAG,"点击了grid_view_vertical_reverse");
                break;
            case R.id.grid_view_horizontal_stander:
                Log.d(TAG,"点击了grid_view_horizontal_stander");
                break;
            case R.id.grid_view_horizontal_reverse:
                Log.d(TAG,"点击了grid_view_horizontal_reverse");
                break;
//            stagger view
            case R.id.stagger_view_vertical_stander:
                Log.d(TAG,"点击了stagger_view_vertical_stander");
                break;
            case R.id.stagger_view_vertical_reverse:
                Log.d(TAG,"点击了stagger_view_vertical_reverse");
                break;
            case R.id.stagger_view_horizontal_stander:
                Log.d(TAG,"点击了stagger_view_horizontal_stander");
                break;
            case R.id.stagger_view_horizontal_reverse:
                Log.d(TAG,"点击了stagger_view_horizontal_reverse");
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    //生成假数据的函数
    private void initData(){
        //弄些假数据----->Adapter适配器----->显示数据
        //创建集合
        mData = new ArrayList<>();
        //创建模拟数据
        for (int i = 0; i < 10; i++) {
            mData.add(new ItemBean(Datas.icons[i], "小风车"+i));
        }
        //创建适配器  并把数据给适配器
        ListViewAdapter listViewAdapter = new ListViewAdapter(mData);
        //设置适配器到RecyclerView里去
        recyclerView.setAdapter(listViewAdapter);
    }

}

ItemBean.class

 

package com.example.myrecyclerview.beans;

public class ItemBean {
    public int icon;
    public String title;

    public ItemBean(int icon, String title) {
        this.icon = icon;
        this.title = title;
    }
}

 

Datas.class

 

package com.example.myrecyclerview.beans;

import com.example.myrecyclerview.R;

public class Datas {
    public static int[] icons = {
            R.drawable.ic_baseline_toys_24,
            R.drawable.ic_favorite_black_24dp,
            R.drawable.ic_baseline_toys_24,
            R.drawable.ic_favorite_black_24dp,
            R.drawable.ic_baseline_toys_24,
            R.drawable.ic_favorite_black_24dp,
            R.drawable.ic_baseline_toys_24,
            R.drawable.ic_favorite_black_24dp,
            R.drawable.ic_baseline_toys_24,
            R.drawable.ic_favorite_black_24dp};
}

 

ListenrViewAdapter.xml

package com.example.myrecyclerview.adapters;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myrecyclerview.R;
import com.example.myrecyclerview.beans.ItemBean;

import java.util.List;

//继承RecyclerView.Adapter适配器之后,先写泛型,写完泛型直接全部快捷生成就ok了
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.InnerHolder> {

    private final List<ItemBean> mData;

    //自己写构造方法
    public ListViewAdapter(List<ItemBean> data){
        this.mData = data;
    }

    //这个方法用于创建条目的View(条目的界面)
    @NonNull
    @Override
    public InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //创建能承载这个条目数据的界面(新建一个layout)
        View view = View.inflate(parent.getContext(), R.layout.item_list_view, null);
        return new InnerHolder(view);
    }

    //这个方法用于绑定内部holder
    @Override
    public void onBindViewHolder(@NonNull InnerHolder holder, int position) {
        //设置数据,这个函数没有,自己设置
        holder.setData(mData.get(position));
    }

    //返回条目的个数
    @Override
    public int getItemCount() {
        if (mData != null){
            return mData.size();
        }
        return 0;
    }

    public class InnerHolder extends RecyclerView.ViewHolder {

        private ImageView mIcon;
        private TextView mTitle;

        public InnerHolder(@NonNull View itemView) {
            super(itemView);

            //找到条目控件
            mTitle = itemView.findViewById(R.id.list_view_title);
            mIcon = itemView.findViewById(R.id.list_view_icon);
        }

        public void setData(ItemBean itemBean) {
            //开始设置数据
            mIcon.setImageResource(itemBean.icon);
            mTitle.setText(itemBean.title);
        }
    }
}

 实现ListView的效果

 

 

 MainActivity.xml

package com.example.myrecyclerview;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.example.myrecyclerview.adapters.ListViewAdapter;
import com.example.myrecyclerview.beans.Datas;
import com.example.myrecyclerview.beans.ItemBean;

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

/**
 * 总结:
 * 1、首先我们要有控件,这个RecyclerView它呢是在V7包下的,所以我们要打开这个 Module settings里的依赖,
 * 添加RecyclerView的依赖,这样子才能在布局文件里使用RecyclerView这个控件。
 * 2、通过findViewById找到控件
 * 3、准备好数据
 * 4、设置布局管理器
 * 5、就是创建适配器
 * 6、设置适配器
 * 7、数据就可以现实出来了
 */

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    RecyclerView recyclerView;
    LinearLayoutManager linearLayoutManager;

    //假数据
    List<ItemBean> mData;

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



        //找到recyclerview
        recyclerView = (RecyclerView)this.findViewById(R.id.recycler_view);

        //默认ListView效果
        showList(true,true);

        //准备数据 模拟一些假数据
        initData();

    }

    //加载菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu,menu);
        return super.onCreateOptionsMenu(menu);
    }


    //当菜单被选中
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();
        switch (itemId){
//            list view
            case R.id.list_view_vertical_stander:
                showList(true,false);
                Log.d(TAG,"点击了list_view_vertical_stander");
                break;
            case R.id.list_view_vertical_reverse:
                Log.d(TAG,"点击了list_view_vertical_reverse");
                showList(true,true);
                break;
            case R.id.list_view_horizontal_stander:
                Log.d(TAG,"点击了list_view_horizontal_stander");
                showList(false,false);
                break;
            case R.id.list_view_horizontal_reverse:
                Log.d(TAG,"点击了list_view_horizontal_reverse");
                showList(false,true);
                break;
//            grid view
            case R.id.grid_view_vertical_stander:
                Log.d(TAG,"点击了grid_view_vertical_stander");
                break;
            case R.id.grid_view_vertical_reverse:
                Log.d(TAG,"点击了grid_view_vertical_reverse");
                break;
            case R.id.grid_view_horizontal_stander:
                Log.d(TAG,"点击了grid_view_horizontal_stander");
                break;
            case R.id.grid_view_horizontal_reverse:
                Log.d(TAG,"点击了grid_view_horizontal_reverse");
                break;
//            stagger view
            case R.id.stagger_view_vertical_stander:
                Log.d(TAG,"点击了stagger_view_vertical_stander");
                break;
            case R.id.stagger_view_vertical_reverse:
                Log.d(TAG,"点击了stagger_view_vertical_reverse");
                break;
            case R.id.stagger_view_horizontal_stander:
                Log.d(TAG,"点击了stagger_view_horizontal_stander");
                break;
            case R.id.stagger_view_horizontal_reverse:
                Log.d(TAG,"点击了stagger_view_horizontal_reverse");
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    //生成假数据的函数
    private void initData(){
    //弄些假数据----->Adapter适配器----->显示数据
        //创建集合
        mData = new ArrayList<>();
        //创建模拟数据
        for (int i = 0; i < 10; i++) {
            mData.add(new ItemBean(Datas.icons[i], "小风车"+i));
        }

        //创建适配器
        ListViewAdapter listViewAdapter = new ListViewAdapter(mData);
        //设置适配器到RecyclerView里去
        recyclerView.setAdapter(listViewAdapter);
    }

    //用于显示ListView
    @SuppressLint("WrongConstant")
    public void showList(boolean isVertical,boolean isReverse){
        //通过布局管理器来控制
        //设置水平还是垂直?
        //设置正向还是反向?
        //RecyclerView需要设置样式(布局)
        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(isVertical ? OrientationHelper.VERTICAL : OrientationHelper.HORIZONTAL);
        linearLayoutManager.setReverseLayout(isReverse);
        recyclerView.setLayoutManager(linearLayoutManager);
    }

}

现在我们想实现分割线,谷歌14年开发者大会发布了一个控件CardView

implementation 'androidx.cardview:cardview:1.0.0'

把我们的图片和图片后面的文字用cardView包裹起来

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

<!--cardUseCompatPadding是自动调整适合的间距-->

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="#FFFFFF"
        app:cardUseCompatPadding="true">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/list_view_icon"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:layout_margin="10dp"
                android:src="@drawable/ic_baseline_toys_24"
                android:scaleType="fitXY"/>

            <TextView
                android:id="@+id/list_view_title"
                android:textSize="40dp"
                android:text="小风车"
                android:layout_marginTop="20dp"
                android:layout_toRightOf="@id/list_view_icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </RelativeLayout>

    </androidx.cardview.widget.CardView>

</RelativeLayout>

现在我们去实现GridView效果

首先就是创建一个布局

item_grid_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardUseCompatPadding="true">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/grid_view_icon"
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:src="@drawable/ic_baseline_toys_24"
                android:scaleType="fitXY"
                android:layout_centerHorizontal="true"/>

            <TextView
                android:id="@+id/grid_view_textview"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="我是一个标题"
                android:textSize="25sp"
                android:layout_marginTop="20dp"
                android:layout_below="@id/grid_view_icon"/>

        </RelativeLayout>

    </androidx.cardview.widget.CardView>

</RelativeLayout>

MainActivity.class

  //用于显示GridView
    @SuppressLint("WrongConstant")
    public void showGrid(boolean isVertical,boolean isReverse){
        //通过布局管理器来控制
        //设置水平还是垂直?
        //设置正向还是反向?
        //RecyclerView需要设置样式(布局)
        //列数是两列
        gridLayoutManager = new GridLayoutManager(this,3);
        gridLayoutManager.setOrientation(isVertical ? OrientationHelper.VERTICAL : OrientationHelper.HORIZONTAL);
        gridLayoutManager.setReverseLayout(isReverse);
        //设置布局管理器
        recyclerView.setLayoutManager(gridLayoutManager);
        //把数据传给适配器
        GridViewAdapter gridViewAdapter = new GridViewAdapter(mData);
        recyclerView.setAdapter(gridViewAdapter);
    }

GridViewAdapter.class 适配器

package com.example.myrecyclerview.adapters;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myrecyclerview.R;
import com.example.myrecyclerview.beans.ItemBean;

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

public class GridViewAdapter extends RecyclerView.Adapter<GridViewAdapter.InnerHolder> {

    List<ItemBean> itemBeanList = new ArrayList<>();
    ImageView imageView;
    TextView textView;

    //先通过构造方法把数据传进来啊
    public GridViewAdapter(List<ItemBean> itemBeanList){
        this.itemBeanList = itemBeanList;
    }

    //绑定这条item的ui
    @NonNull
    @Override
    public GridViewAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate = View.inflate(parent.getContext(), R.layout.item_grid_view, null);
        return new InnerHolder(inflate);
    }

    //绑定数据
    @Override
    public void onBindViewHolder(@NonNull GridViewAdapter.InnerHolder holder, int position) {
        holder.setData(itemBeanList.get(position));
    }

    @Override
    public int getItemCount() {
        //返回条数
        if (itemBeanList != null){
            return itemBeanList.size();
        }
        return 0;
    }

    //找到控件
    public class InnerHolder extends RecyclerView.ViewHolder {
        public InnerHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.grid_view_textview);
            imageView = itemView.findViewById(R.id.grid_view_icon);
        }

        //找到控件之后设置数据
        public void setData(ItemBean itemBean) {
            textView.setText(itemBean.title);
            imageView.setImageResource(itemBean.icon);
        }
    }
}

 

 实现瀑布流的效果

main

 

//用于显示Stagger 瀑布流效果
    @SuppressLint("WrongConstant")
    public void showtagger(boolean isVertical,boolean isReverse){
        //通过布局管理器来控制
        //设置水平还是垂直?
        //设置正向还是反向?
        //RecyclerView需要设置样式(布局)
        //列数 方向
        staggerManger = new StaggeredGridLayoutManager(2,isVertical?StaggeredGridLayoutManager.VERTICAL:StaggeredGridLayoutManager.HORIZONTAL);
        staggerManger.setReverseLayout(isReverse);
        //设置布局管理器
        recyclerView.setLayoutManager(staggerManger);
        //把数据传给适配器
        StaggerViewAdapter staggerViewAdapter = new StaggerViewAdapter(mData);
        recyclerView.setAdapter(staggerViewAdapter);
    }

 

item_statter_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardUseCompatPadding="true">
        <ImageView
            android:id="@+id/stagger_view_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:src="@drawable/ic_baseline_toys_24"
            />

        <TextView
            android:id="@+id/stagger_view_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/stagger_view_icon"
            android:layout_marginTop="9dp"
            android:text="我是一个标题"
            android:textSize="25sp" />
    </androidx.cardview.widget.CardView>

</RelativeLayout>
StaggerViewAdapter.class
package com.example.myrecyclerview.adapters;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myrecyclerview.R;
import com.example.myrecyclerview.beans.ItemBean;

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

public class StaggerViewAdapter extends RecyclerView.Adapter<StaggerViewAdapter.InnerHolder> {

    List<ItemBean> itemBeanList = new ArrayList<>();
    TextView textView;
    ImageView imageView;

    public StaggerViewAdapter(List<ItemBean> mData) {
        this.itemBeanList = mData;
    }

    @NonNull
    @Override
    public StaggerViewAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate = View.inflate(parent.getContext(), R.layout.item_stagger_view, null);
        return new InnerHolder(inflate);
    }

    @Override
    public void onBindViewHolder(@NonNull StaggerViewAdapter.InnerHolder holder, int position) {
        holder.setData(itemBeanList.get(position));
    }

    @Override
    public int getItemCount() {
        if (itemBeanList != null){
            return itemBeanList.size();
        }
        return 0;
    }

    public class InnerHolder extends RecyclerView.ViewHolder {
        public InnerHolder(@NonNull View itemView) {
            super(itemView);
            //找到控件
            textView = itemView.findViewById(R.id.stagger_view_textview);
            imageView = itemView.findViewById(R.id.stagger_view_icon);
        }

        public void setData(ItemBean itemBean) {
            textView.setText(itemBean.title);
            imageView.setImageResource(itemBean.icon);
        }
    }
}

接下来要完成条目的点击事件  不使用回调函数

ListViewAdapter.class

package com.example.myrecyclerview.adapters;

import android.annotation.SuppressLint;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myrecyclerview.R;
import com.example.myrecyclerview.beans.ItemBean;

import java.util.List;

//继承RecyclerView.Adapter适配器之后,先写泛型,写完泛型直接全部快捷生成就ok了
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.InnerHolder> {

    private final List<ItemBean> mData;

    //自己写构造方法
    public ListViewAdapter(List<ItemBean> data){
        this.mData = data;
    }

    //创建布局,创建viewHolder实例并返回
    //这个方法用于创建条目的View(条目的界面)
    @NonNull
    @Override
    public InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //创建能承载这个条目数据的界面(新建一个layout)
        View view = View.inflate(parent.getContext(), R.layout.item_list_view, null);

        return new InnerHolder(view);
    }

    //对RecyclerView的子项赋值,并设置其他属性
    //这个方法用于绑定内部holder
    @Override
    public void onBindViewHolder(@NonNull InnerHolder holder, @SuppressLint("RecyclerView") int position) {
        //设置数据,这个函数没有,自己设置
        holder.setData(mData.get(position),position);

        //所有点击事件都由InnerHolder(ViewHolder)获取
        holder.mIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), "点击了图片 id:"+position,Toast.LENGTH_SHORT).show();
                Log.e("点击了图片:  id:  : ", String.valueOf(position));
            }
        });

        holder.mTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), "点击了文字 id:"+position,Toast.LENGTH_SHORT).show();
                Log.e("点击了文字:  id:  : ", String.valueOf(position));
            }
        });


    }

    //返回条目的个数
    @Override
    public int getItemCount() {
        if (mData != null){
            return mData.size();
        }
        return 0;
    }

    public class InnerHolder extends RecyclerView.ViewHolder {

        private ImageView mIcon;
        private TextView mTitle;

        public InnerHolder(@NonNull View itemView) {
            super(itemView);

            //找到条目控件
            mTitle = itemView.findViewById(R.id.list_view_title);
            mIcon = itemView.findViewById(R.id.list_view_icon);
        }

        public void setData(ItemBean itemBean,int position) {
            //开始设置数据
            mTitle.setText(itemBean.title);
            mIcon.setImageResource(itemBean.icon);
        }
    }


}

 

StaggerViewAdapter.class


package com.example.myrecyclerview.adapters;

import android.annotation.SuppressLint;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myrecyclerview.R;
import com.example.myrecyclerview.beans.ItemBean;

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

public class StaggerViewAdapter extends RecyclerView.Adapter<StaggerViewAdapter.InnerHolder> {

    List<ItemBean> itemBeanList = new ArrayList<>();
    TextView textView;
    ImageView imageView;

    public StaggerViewAdapter(List<ItemBean> mData) {
        this.itemBeanList = mData;
    }

    @NonNull
    @Override
    public StaggerViewAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate = View.inflate(parent.getContext(), R.layout.item_stagger_view, null);
        return new InnerHolder(inflate);
    }

    @Override
    public void onBindViewHolder(@NonNull StaggerViewAdapter.InnerHolder holder, @SuppressLint("RecyclerView") int position) {
        holder.setData(itemBeanList.get(position));

        //图片id的获取
        holder.itemView.findViewById(R.id.stagger_view_icon).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), "点击了图片 id:"+position,Toast.LENGTH_SHORT).show();
                Log.e("点击了图片:  id:  : ", String.valueOf(position));
            }
        });

        //文字id的获取
        holder.itemView.findViewById(R.id.stagger_view_textview).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), "点击了文字 id:"+position,Toast.LENGTH_SHORT).show();
                Log.e("点击了文字:  id:  : ", String.valueOf(position));
            }
        });
    }

    @Override
    public int getItemCount() {
        if (itemBeanList != null){
            return itemBeanList.size();
        }
        return 0;
    }

    public class InnerHolder extends RecyclerView.ViewHolder {
        public InnerHolder(@NonNull View itemView) {
            super(itemView);
            //找到控件
            textView = itemView.findViewById(R.id.stagger_view_textview);
            imageView = itemView.findViewById(R.id.stagger_view_icon);
        }

        public void setData(ItemBean itemBean) {
            textView.setText(itemBean.title);
            imageView.setImageResource(itemBean.icon);
        }
    }



}

 

GridViewAdapter.class
package com.example.myrecyclerview.adapters;

import android.annotation.SuppressLint;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myrecyclerview.R;
import com.example.myrecyclerview.beans.ItemBean;

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

public class GridViewAdapter extends RecyclerView.Adapter<GridViewAdapter.InnerHolder> {

    List<ItemBean> itemBeanList = new ArrayList<>();
    ImageView imageView;
    TextView textView;

    //先通过构造方法把数据传进来啊
    public GridViewAdapter(List<ItemBean> itemBeanList){
        this.itemBeanList = itemBeanList;
    }

    //绑定这条item的ui
    @NonNull
    @Override
    public GridViewAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate = View.inflate(parent.getContext(), R.layout.item_grid_view, null);
        return new InnerHolder(inflate);
    }

    //绑定数据
    @Override
    public void onBindViewHolder(@NonNull GridViewAdapter.InnerHolder holder, @SuppressLint("RecyclerView") int position) {
        holder.setData(itemBeanList.get(position));

        //图片id的获取
        holder.itemView.findViewById(R.id.grid_view_icon).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), "点击了图片 id:"+position,Toast.LENGTH_SHORT).show();
                Log.e("点击了图片:  id:  : ", String.valueOf(position));
            }
        });

        //文字id的获取
        holder.itemView.findViewById(R.id.grid_view_textview).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), "点击了文字 id:"+position,Toast.LENGTH_SHORT).show();
                Log.e("点击了文字:  id:  : ", String.valueOf(position));
            }
        });
    }

    @Override
    public int getItemCount() {
        //返回条数
        if (itemBeanList != null){
            return itemBeanList.size();
        }
        return 0;
    }

    //找到控件
    public class InnerHolder extends RecyclerView.ViewHolder {
        public InnerHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.grid_view_textview);
            imageView = itemView.findViewById(R.id.grid_view_icon);
        }

        //找到控件之后设置数据
        public void setData(ItemBean itemBean) {
            textView.setText(itemBean.title);
            imageView.setImageResource(itemBean.icon);
        }
    }
}

 

 

 

 

 

 

 

posted @ 2021-09-08 22:01  涂妖教  阅读(79)  评论(0)    收藏  举报