天天看点

android 子view点击事件,RecyclerView的使用和子view点击事件的处理

1.使用RecyclerView第一步导入依赖在build.gradle文件中添加一些语句

implementation 'androidx.recyclerview:recyclerview:1.1.0'

2.在你需要使用的recyclerview的布局文件下添加以下代码

android:id="@+id/Recycyler"

android:layout_height="match_parent"

android:layout_width="match_parent">

androidx.recyclerview.widget.RecyclerView>

3.创建模拟数据,

数据格式

public class Mydate {

public String name;

public int icon;

}

要显示数据的图片

public class DATA {

public static int[] icon={

R.mipmap.ic_launcher,R.mipmap.gtx,R.mipmap.ic_launcher,R.mipmap.gtx,R.mipmap.ic_launcher,R.mipmap.gtx,R.mipmap.ic_launcher,R.mipmap.gtx,R.mipmap.ic_launcher,R.mipmap.gtx,R.mipmap.ic_launcher,R.mipmap.gtx,

};

}

创建模拟数据

private void initdata() {

mdata=new ArrayList<>();

for (int i = 0; i < DATA.icon.length; i++) {

Mydate mydate=new Mydate();

mydate.icon=DATA.icon[i];//设置每个条目的图片

mydate.name="我是第"+ i +"个条目";//设置每个条目的文本

mdata.add(mydate);

}

}

5.设置适配器,这里适配器还没创建,下一步将会创建

private void setAdater() {

LinearLayoutManager manager=new LinearLayoutManager(this);//布局管理器

recyclerView.setLayoutManager(manager);

MyAdapter myAdapter=new MyAdapter(mdata);//创建适配器并把数据传入进去

recyclerView.setAdapter(myAdapter);//设置适配器

}

6.创建适配器

创建适配器类继承 RecyclerView.Adapter

public class MyAdapter extends RecyclerView.Adapter

重写一下三个方法

//此方法用于绑定条目的的格式

@Override

public holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view=View.inflate(parent.getContext(),R.layout.item,null);

return new holder(view);

}

@Override

//此方法用于绑定数据

public void onBindViewHolder(@NonNull final holder holder, final int position) {

holder.initdata(mData.get(position));

}

@Override

//此方法用于返回条目格式

public int getItemCount() {

if (mData.size()!=0) {

return mData.size();

}

return 0;

}

7.条目布局如下

android:id="@+id/LLL"

android:orientation="horizontal" android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_margin="10dp"

android:id="@+id/iv"

android:layout_width="100dp"

android:background="@drawable/gtx"

android:layout_height="100dp"/>

android:layout_margin="10dp"

android:id="@+id/tv123"

android:text="我是第一个"

android:layout_width="200dp"

android:layout_height="100dp"/>

LinearLayout>

8.设置控件,在适配器中写,一般在继承RecyclerView.Adapter,利用ALT+ENTER直接生成

class holder extends RecyclerView.ViewHolder {

public TextView textView;

public ImageView imageView;

public holder(@NonNull View itemView) {

super(itemView);

//找到控件

imageView=itemView.findViewById(R.id.iv);

textView=itemView.findViewById(R.id.tv123);

}

public void initdata(Mydate mydate){

//为控件填入需要写入的数据

imageView.setImageResource(mydate.icon);

textView.setText(mydate.name);

}

}

10.创建构造器,个人理解,是把数据传入进来,若理解不对,请多多指教

private final List mData;

public MyAdapter(List mdata) {

this.mData=mdata;

}

到这一个简单的RecyclerView就可以使用了

若想在条目中设置点击事件,要进行如下步骤

11.利用接口实现点击事件在适配器中添加以下接口

1.设置接口

//利用接口给Recycler设置点击事件

public interface MyViewHolerClicks {

//item的回调方法

void onItemClick(int position);

}

2.声明接口变量

public MyViewHolerClicks myViewHolerClicks;

3.声明给外界调用的的方法

public void setMyViewHolerClicks(MyViewHolerClicks myViewHolerClicks) {

this.myViewHolerClicks = myViewHolerClicks;

}

4.在绑定数据中设置点击事件,第6步中重写的第二个函数中添加一下代码

if (myViewHolerClicks!=null) {

holder.imageView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

myViewHolerClicks.onItemClick(position);

}

});

}

5.在要使用RecyclerView的Activity中实现接口

MyViewHolerClicks myViewHolerClicks=new MyViewHolerClicks() {

@Override

public void onItemClick(int position) {

Toast.makeText(RecyclerActivity.this,"点击了第"+position+"头像",Toast.LENGTH_SHORT).show();

}

};

6.在设置适配器中添加如下代码,在第五步的代码中

myAdapter.setMyViewHolerClicks(myViewHolerClicks);//点击事件

这样点击事件就可以实现了。

全部代码如下Activity的代码如下:

package com.example.fragment.Recycler.java;

import androidx.appcompat.app.AppCompatActivity;

import androidx.recyclerview.widget.LinearLayoutManager;

import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Toast;

import com.example.fragment.R;

import com.example.fragment.Recycler.Adater.MyAdapter;

import java.util.ArrayList;

import java.util.List;

import static com.example.fragment.Recycler.Adater.MyAdapter.*;

public class RecyclerActivity extends AppCompatActivity {

private RecyclerView recyclerView;

private List mdata;

private String TAG="RecyclerActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_recycler);

recyclerView=findViewById(R.id.Recycyler);

initdata();

setAdater();

}

MyViewHolerClicks myViewHolerClicks=new MyViewHolerClicks() {

@Override

public void onItemClick(int position) {

Toast.makeText(RecyclerActivity.this,"点击了第"+position+"头像",Toast.LENGTH_SHORT).show();

}

};

private void setAdater() {

LinearLayoutManager manager=new LinearLayoutManager(this);//布局管理器

recyclerView.setLayoutManager(manager);

MyAdapter myAdapter=new MyAdapter(mdata);//创建适配器并把数据传入进去

recyclerView.setAdapter(myAdapter);//设置适配器

myAdapter.setMyViewHolerClicks(myViewHolerClicks);//点击事件

}

private void initdata() {

mdata=new ArrayList<>();

for (int i = 0; i < DATA.icon.length; i++) {

Mydate mydate=new Mydate();

mydate.icon=DATA.icon[i];//设置每个条目的图片

mydate.name="我是第"+ i +"个条目";//设置每个条目的文字

mdata.add(mydate);

}

}

}

适配器代码如下:

package com.example.fragment.Recycler.Adater;

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.fragment.R;

import com.example.fragment.Recycler.java.Mydate;

import java.util.List;

public class MyAdapter extends RecyclerView.Adapter {

private final List mData;

//声明接口变量

public MyViewHolerClicks myViewHolerClicks;

public MyAdapter(List mdata) {

this.mData=mdata;

}

//利用接口给Recycler设置点击事件

public interface MyViewHolerClicks {

//item的回调方法

void onItemClick(int position);

}

//声明给外界方法

public void setMyViewHolerClicks(MyViewHolerClicks myViewHolerClicks) {

this.myViewHolerClicks = myViewHolerClicks;

}

@NonNull

@Override

public holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view=View.inflate(parent.getContext(),R.layout.item,null);

return new holder(view);

}

@Override

public void onBindViewHolder(@NonNull final holder holder, final int position) {

holder.initdata(mData.get(position));

if (myViewHolerClicks!=null) {

holder.imageView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

myViewHolerClicks.onItemClick(position);

}

});

}

}

@Override

public int getItemCount() {

if (mData.size()!=0) {

return mData.size();

}

return 0;

}

class holder extends RecyclerView.ViewHolder {

public TextView textView;

public ImageView imageView;

public holder(@NonNull View itemView) {

super(itemView);

imageView=itemView.findViewById(R.id.iv);

textView=itemView.findViewById(R.id.tv123);

}

public void initdata(Mydate mydate){

imageView.setImageResource(mydate.icon);

textView.setText(mydate.name);

}

}

}

效果如下

android 子view点击事件,RecyclerView的使用和子view点击事件的处理

此文章只是本人在学习中写的笔记,如有不对请指正。