在
RecyclerView中,官方并没有提供给setOnItemClickListener点击事件,所以,我们只能自己写一个回调来响应Item的点击事件,如果需要setOnItemLongClickListener事件,写法差不多相同.
activity_main布局中的recyclerView控件:
<?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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:padding="5dp"
android:background="#eaeaea"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
gridview_item布局:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
card_view:cardBackgroundColor="@color/cardview_light_background"
card_view:cardCornerRadius="1dp" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp" >
<ImageView
android:id="@+id/pic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/pic"
android:layout_centerHorizontal="true"
android:gravity="center"
android:textColor="#212121"
android:textSize="16sp" />
</RelativeLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
Activity中的代码:
package view.ciat.com.recyclerviewdemo;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Toast;
import view.ciat.com.recyclerviewdemo.adapter.GridAdapter;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用RecyclerView控件
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
//创建一个GridLayout管理器,设置为4列
GridLayoutManager layoutManager = new GridLayoutManager(this, 4);
//设置GridView方向为:垂直方向
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//添加到RecyclerView容器里面
recyclerView.setLayoutManager(layoutManager);
//设置自动适应配置的大小
recyclerView.setHasFixedSize(true);
//创建适配器对象
GridAdapter adapter = new GridAdapter(this);
//把适配器设置到控件里面展示
recyclerView.setAdapter(adapter);
//设置Item点击事件
adapter.setOnItemClickListener(new GridAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
Toast.makeText(MainActivity.this, "你点击了" + position + "位置", Toast.LENGTH_SHORT).show();
}
});
}
}
GridViewAdpater适配器中的代码:
package view.ciat.com.recyclerviewdemo.adapter;
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;
import view.ciat.com.recyclerviewdemo.R;
/**
* 绑定GradApterViewHolder
*/
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.GradApterViewHolder> {
//图标
int icons[] = {R.mipmap.g1, R.mipmap.g2, R.mipmap.g3, R.mipmap.g4, R.mipmap.g5, R.mipmap.g6, R.mipmap.g7, R.mipmap.g9,R.mipmap.g10, R.mipmap.g11, R.mipmap.g12, R.mipmap.g13, R.mipmap.g14, R.mipmap.g15, R.mipmap.g16, R.mipmap.g17, R.mipmap.g18, R.mipmap.g19, R.mipmap.g20, R.mipmap.g21, R.mipmap.g22, R.mipmap.g23, R.mipmap.g24, R.mipmap.g25, R.mipmap.g26, R.mipmap.g27, R.mipmap.g28, R.mipmap.g29,};
//名称
String names[] = {"浏览器", "输入法", "健康", "效率", "教育", "理财", "阅读", "个性化", "购物", "资讯", "生活", "工具", "出行", "通讯", "拍照", "社交", "影音", "安全", "休闲", "棋牌", "益智", "射击", "体育", "儿童", "网游", "角色", "策略", "经营", "竞速"};
//上下文
private Context context;
private OnItemClickListener onItemClickListener;
public GridAdapter(Context context) {
this.context = context;
}
@Override
public GradApterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false);
return new GradApterViewHolder(view, onItemClickListener);
}
@Override
public void onBindViewHolder(GradApterViewHolder holder, int position) {
holder.setData(position);
}
@Override
public int getItemCount() {
return 100;
}
/**
* 设置数据和复用优化
*/
public class GradApterViewHolder extends RecyclerView.ViewHolder {
private ImageView pic;
private TextView name;
public GradApterViewHolder(View itemView, final GridAdapter.OnItemClickListener listener) {
super(itemView);
pic = (ImageView) itemView.findViewById(R.id.pic);
name = (TextView) itemView.findViewById(R.id.name);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
//如果用户点击了Item,就获返回当前点击Item的位置
listener.onItemClick(v, getPosition());
}
}
});
}
/**
* 给控件设置数据
*
* @param position
*/
public void setData(int position) {
pic.setImageDrawable(context.getResources().getDrawable(icons[position % icons.length]));
name.setText(names[position % names.length]);
}
}
//接口回调监听
public interface OnItemClickListener {
void onItemClick(View v, int position);
}
/**
* 设置条目点击事件方法
*
* @param onItemClickListener 回调接口
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}