为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。
步骤
adapter中
自定义一个继承自RecyclerView.Adapter的MyAdapter。
1.在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener:
2.声明一个这个接口的变量public interface OnItemClickListener { void onItemClick(View view, int position); }
public OnItemClickListener mOnItemClickListener;3.建MyHolder集成RecycleView.ViewHolder
class SpeedHourHolder extends RecyclerView.ViewHolder { LinearLayout speedView; ImageView speedImage; public SpeedHourHolder(View itemView) { super(itemView); } }
4.在onCreateViewHolder()中绑定holder每个view
@Override
public SpeedHourHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.item_project, parent, false);
SpeedHourHolder holder = new SpeedHourHolder(view);
holder.speedImage = (ImageView) view.findViewById(R.id.speed_image);
holder.speedView = (LinearLayout) view.findViewById(R.id.speed_view);
return holder;
}5.在onBindViewHolder()方法中设置和item相关的数据,设置item的点击事件,注意在这里设置点击item的动画,可以实现点击的item放大,其余缩放到原位置,注意数据的刷新
@Override
public void onBindViewHolder(final SpeedHourHolder holder, final int position) {
final ProjectEntity.TopicBean.ItemsBean.ListBean bean = specailList.get(position);
if (bean != null) {
holder.speedImage.setScaleType(ImageView.ScaleType.FIT_XY);
Glide.with(mContext).load(bean.pic).error(R.mipmap.welfare_default_icon).into(holder.speedImage);
}
if (currentIndex == position) {
holder.speedView.setScaleX(1.5f);
holder.speedView.setScaleY(1.5f);
} else {
holder.speedView.setScaleX(1f);
holder.speedView.setScaleY(1f);
}
holder.speedView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mOnItemClickListener != null) {
currentIndex = position;
notifyDataSetChanged();
mOnItemClickListener.onItemClick(holder.speedView, position);
}
}
});
}6.最后暴露给外面的调用者,定义一个设置Listener的方法():
public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) {
this.mOnItemClickListener = mOnItemClickLitener;
}以上所有步骤都发生在自定义的adapter中,典型的观察者模式,有点绕的地方在于,这里涉及到两个观察者模式的使用,view的setOnClickListener本来就是观察者模式,我们将这个观察者模式的事件监听传递给了我们自己的观察者模式。
7.在Activity中使用:
private void initAdapter() {
private void initAdapter() { projectAdapter = new ProjectAdapter(this); recyclerView_project.setAdapter(projectAdapter); if (projectEntity != null && projectEntity.topic != null && projectEntity.topic.items != null && projectEntity.topic.items.size() > 0) { List<ProjectEntity.TopicBean.ItemsBean.ListBean> listBeen = projectEntity.topic.items.get(0).list; if (listBeen != null && listBeen.size() > 0) { listBeen.get(2).setPlay(true); mList.addAll(listBeen); projectAdapter.setList(listBeen); } } projectAdapter.setOnItemClickListener(new ProjectAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "测试中", Toast.LENGTH_SHORT).show(); } }); }
完整代码
ProjectAdapter.java
public class ProjectAdapter extends RecyclerView.Adapter<SpeedHourHolder> { private int currentIndex = 2; private List<ProjectEntity.TopicBean.ItemsBean.ListBean> specailList; private LayoutInflater mInflater; private Context mContext = null; public ProjectAdapter(Context context) { this.mContext = context; mInflater = LayoutInflater.from(context); } public void setList(List<ProjectEntity.TopicBean.ItemsBean.ListBean> list) { this.specailList = list; notifyDataSetChanged(); } public OnItemClickListener mOnItemClickListener; public interface OnItemClickListener { void onItemClick(View view, int position); } public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) { this.mOnItemClickListener = mOnItemClickLitener; } @Override public SpeedHourHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.item_project, parent, false); SpeedHourHolder holder = new SpeedHourHolder(view); holder.speedImage = (ImageView) view.findViewById(R.id.speed_image); holder.speedView = (LinearLayout) view.findViewById(R.id.speed_view); return holder; } @Override public void onBindViewHolder(final SpeedHourHolder holder, final int position) { final ProjectEntity.TopicBean.ItemsBean.ListBean bean = specailList.get(position); if (bean != null) { holder.speedImage.setScaleType(ImageView.ScaleType.FIT_XY); Glide.with(mContext).load(bean.pic).error(R.mipmap.welfare_default_icon).into(holder.speedImage); } if (currentIndex == position) { holder.speedView.setScaleX(1.5f); holder.speedView.setScaleY(1.5f); } else { holder.speedView.setScaleX(1f); holder.speedView.setScaleY(1f); } holder.speedView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mOnItemClickListener != null) { currentIndex = position; notifyDataSetChanged(); mOnItemClickListener.onItemClick(holder.speedView, position); } } }); } @Override public int getItemCount() { return specailList.size(); } } class SpeedHourHolder extends RecyclerView.ViewHolder { LinearLayout speedView; ImageView speedImage; public SpeedHourHolder(View itemView) { super(itemView); } }
item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/speed_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical" android:padding="10dp"> <ImageView android:id="@+id/speed_image" android:layout_width="50dp" android:layout_height="50dp" android:scaleType="fitXY" android:src="@mipmap/speed_icon" /> </LinearLayout>
MainActivity.java
ContentView(R.layout.activity_main) public class MainActivity extends AppCompatActivity { @ViewInject(R.id.recycler_view) private RecyclerView recyclerView_project; private ProjectEntity projectEntity; private ProjectAdapter projectAdapter = null; private List<ProjectEntity.TopicBean.ItemsBean.ListBean> mList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); x.view().inject(this); initView(); initData(); initAdapter(); } private void initView() { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recyclerView_project.setLayoutManager(linearLayoutManager); } private void initData() { String data = FileUtils.readAssert(this, "speenhour.txt"); projectEntity = JsonUtils.parseJson(data, ProjectEntity.class); } private void initAdapter() { projectAdapter = new ProjectAdapter(this); recyclerView_project.setAdapter(projectAdapter); if (projectEntity != null && projectEntity.topic != null && projectEntity.topic.items != null && projectEntity.topic.items.size() > 0) { List<ProjectEntity.TopicBean.ItemsBean.ListBean> listBeen = projectEntity.topic.items.get(0).list; if (listBeen != null && listBeen.size() > 0) { listBeen.get(2).setPlay(true); mList.addAll(listBeen); projectAdapter.setList(listBeen); } } projectAdapter.setOnItemClickListener(new ProjectAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "测试中", Toast.LENGTH_SHORT).show(); } }); } }
版权声明:本文为qing_happy88原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。