Android中RecyclerView使用,RecyclerView-Item点击事件设置

xiaoxiao2021-02-28  22

最近在使用RecyclerView,这里做一下简单的笔记,毕竟好记性当不得烂笔头 首先来看布局文件: Activity的布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycle_list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center"></android.support.v7.widget.RecyclerView> </LinearLayout>

item中的布局文件:

<?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="50dp" android:background="#44ff0000"> <TextView android:id="@+id/my_item_id_num" android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="center" android:gravity="center" android:text="1" /> </RelativeLayout>

接下来就是Activity了: package com.example.lipiao.recyclerviewdemo; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class AActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<String> data = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); recyclerView = (RecyclerView) findViewById(R.id.recycle_list); recyclerView.setLayoutManager(new LinearLayoutManager(this)); //初始化适配数据 for (int i = 0; i < 40; i++) { data.add("" + i); } MyRVAdapter adapter = new MyRVAdapter(this, data); recyclerView.setAdapter(adapter); } class MyRVAdapter extends RecyclerView.Adapter<MyRVAdapter.MyViewHolder> { private List<String> mData = new ArrayList(); private Context context; public MyRVAdapter(Context context, List mData) { this.context = context; this.mData = mData; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.my_item,null); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textView.setText(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } class MyViewHolder extends RecyclerView.ViewHolder { public TextView textView; public MyViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.my_item_id_num); } } } } 看看效果图: 然而发现,明明在布局文件中设置了RecyclerView的android:layout_gravity="center",但是在页面布局中并没有看到居中 解决方案:在onCreateViewHolder中把inflate(R.layout.my_item,null)更改成inflate(R.layout.my_item, parent,false),再次运行看效果,这就成为居中状态了 看看效果图: 如果parent传进去为null,生成的View的LayoutParams为null,在RecyclerView.addView时,发现LayoutParams为null,则生成默认的LayoutParams 基本的使用都了解了,接下来为RecyclerView添加item的点击事件,RecyclerView并不像ListView那样提供了setOnItemClickListener,所以需要自己动手来进行实现,这里是将点击事件放在了adapter使用接口回调实现,下面来看看步骤: 1,新增接口,就仿照ListView的点击事件来吧,接口名就叫setOnItemClickListener //点击事件回调接口 interface OnItemClickListener{ void onItemClick(View view,int position); } 2,在MyRVAdapter中声明变量并提供一个设置监听事件的方法给外面的调用者; private OnItemClickListener onItemClickListener =null; public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener = onItemClickListener; } 3,在onCreateViewHolder()中为每个view添加点击事件(MyRVAdapter实现OnClickListener接口) @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.my_item, parent,false); MyViewHolder holder = new MyViewHolder(view); //设置点击事件 view.setOnClickListener(this); return holder; } 4,在onBindViewHolder()方法中设置view的position @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textView.setText(mData.get(position)); //将position保存在itemView的Tag中 holder.itemView.setTag(position); } 5,将在onClick方法中将点击事件使用接口回调传出即可 @Override public void onClick(View view) { //注意这里使用getTag方法获取position onItemClickListener.onItemClick(view,(int)view.getTag()); }

6,在Activity中使用

recyclerView.setAdapter(adapter); adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(AActivity.this,"点击了:"+data.get(position),Toast.LENGTH_SHORT).show(); } }); 看看效果图:

完整的Activity代码:

package com.example.lipiao.recyclerviewdemo.matchaction; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import com.example.lipiao.recyclerviewdemo.MainActivity; import com.example.lipiao.recyclerviewdemo.R; import java.util.ArrayList; import java.util.List; public class AActivity extends AppCompatActivity{ private RecyclerView recyclerView; private List<String> data = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); recyclerView = (RecyclerView) findViewById(R.id.recycle_list); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); for (int i=0;i<40;i++){ data.add(""+i); } MyRVAdapter adapter = new MyRVAdapter(this,data); recyclerView.setAdapter(adapter); adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(AActivity.this,"点击了:"+data.get(position),Toast.LENGTH_SHORT).show(); } }); } class MyRVAdapter extends RecyclerView.Adapter<MyRVAdapter.MyViewHolder> implements View.OnClickListener{ private List<String> mData = new ArrayList(); private Context context; public MyRVAdapter(Context context, List mData) { this.context = context; this.mData = mData; } private OnItemClickListener onItemClickListener =null; public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener = onItemClickListener; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.my_item, parent,false); MyViewHolder holder = new MyViewHolder(view); //设置点击事件 view.setOnClickListener(this); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textView.setText(mData.get(position)); //将position保存在itemView的Tag中 holder.itemView.setTag(position); } @Override public int getItemCount() { return mData.size(); } @Override public void onClick(View view) { //注意这里使用getTag方法获取position onItemClickListener.onItemClick(view,(int)view.getTag()); } class MyViewHolder extends RecyclerView.ViewHolder { public TextView textView; public MyViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.my_item_id_num); } } } //点击事件回调接口 interface OnItemClickListener{ void onItemClick(View view,int position); } }

转载请注明原文地址: https://www.6miu.com/read-37125.html

最新回复(0)