【android】如何为RecyclerView添加item点击事件

最近在项目开发过程当中使用到了列表的点击事件,由于列表用的是RecyclerView控件进行开发的,所以就涉及到了RecylerView的点击事件。具体的思路是在RecyclerView的Adapter当中定义响应点击事件的接口,然后再recycerView.set(adapter)的时候能够直接处理点击事件。这里我直接粘贴出我项目代码中的文件供大家参考:

SameContentListRecyclerViewAdapter .java

package com.yqzbw.yqms.lb.adapter;

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 com.yqzbw.yqms.lb.activity.R;
import com.yqzbw.yqms.lb.util.OtherUtil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;

/**
 * Created by 王笔锋 on 2017/8/11.
 * Description: 该类是列表展示Adapter
 */

public class SameContentListRecyclerViewAdapter extends RecyclerView.Adapter implements View.OnClickListener {
    
    private List> dataList;
    private OnItemClickListener mOnItemClickListener = null;

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_same_content_list, parent, false);
        view.setOnClickListener(this);
        return new ViewHolder(view);
    }

    public SameContentListRecyclerViewAdapter(List> dataList) {
        this.dataList = dataList;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        //标题需要进行一下过滤,因为标题文件当中可能含有html的标签
        holder.titleTextView.setText(OtherUtil.filter(dataList.get(position).get("kvTitle")));
        holder.sourceTextView.setText(dataList.get(position).get("kvSite"));
        //在这里要对时间做一下处理
        String showTime = "";
        String dateTime = dataList.get(position).get("kvCtime");
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmSS", Locale.getDefault());
        try {
            Date parse  = dateFormat.parse(dateTime);
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS", Locale.getDefault());
            showTime = format.format(parse);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        holder.timeTextView.setText(showTime);
        //设置来源图片
        String kvSourcetype = dataList.get(position).get("kvSourcetype");
        int imageId = getImageIdBySourceType(kvSourcetype);
        holder.sourceImage.setBackgroundResource(imageId);
        //将position保存在itemView的Tag中,以便点击时进行获取
        holder.itemView.setTag(position);
    }

    /**
     * 根据类型得到对应的图片id
     * @param kvSourcetype
     * @return
     */
    private int getImageIdBySourceType(String kvSourcetype) {
        //默认为微博图片
        int imageId = R.drawable.weibo04;
        switch (kvSourcetype) {
            case "01":
                imageId = R.drawable.news01;
                break;
            case "02":
                imageId = R.drawable.forum02;
                break;
            case "03":
                imageId = R.drawable.blog03;
                break;
            case "04":
                imageId = R.drawable.weibo04;
                break;
            case "05":
                imageId = R.drawable.media05;
                break;
            case "06":
                imageId = R.drawable.weixin;
                break;
            case "07":
                imageId = R.drawable.video07;
                break;
            case "08":
                imageId = R.drawable.longweibo08;
                break;
            case "09":
                imageId = R.drawable.app09;
                break;
            case "10":
                imageId = R.drawable.comment10;
                break;
            case "99":
                imageId = R.drawable.other99;
                break;
            case "1":
                imageId = R.drawable.news01;
                break;
            case "2":
                imageId = R.drawable.forum02;
                break;
            case "3":
                imageId = R.drawable.blog03;
                break;
            case "4":
                imageId = R.drawable.weibo04;
                break;
            case "5":
                imageId = R.drawable.media05;
                break;
            case "6":
                imageId = R.drawable.weixin;
                break;
            case "7":
                imageId = R.drawable.video07;
                break;
            case "8":
                imageId = R.drawable.longweibo08;
                break;
            case "9":
                imageId = R.drawable.app09;
                break;
            default:
                break;
        }
        return imageId;
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    /**
     * 响应点击事件
     * @param v
     */
    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            //注意这里使用getTag方法获取position
            mOnItemClickListener.onItemClick(v, (int)v.getTag());
        }
    }

    /**
     * 设置listener事件并初始化
     * @param listener
     */
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }
    
    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView titleTextView;
        ImageView sourceImage;
        TextView sourceTextView;
        TextView timeTextView;
        
        public ViewHolder(View itemView) {
            super(itemView);
            titleTextView = (TextView)itemView.findViewById(R.id.tv_title);
            sourceTextView = (TextView)itemView.findViewById(R.id.tv_source);
            timeTextView = (TextView)itemView.findViewById(R.id.tv_time);
            sourceImage = (ImageView)itemView.findViewById(R.id.iv_source);
        }
    }

    /**
     * 定义点击事件的接口
     */
    public interface OnItemClickListener {
        void onItemClick(View view , int position);
    }
}

使用adapter

//设置adapter,填充列表信息
SameContentListRecyclerViewAdapter sameContentListRecyclerViewAdapter = new SameContentListRecyclerViewAdapter(dataList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
sameContentRecyclerView.setLayoutManager(linearLayoutManager);
sameContentRecyclerView.setAdapter(sameContentListRecyclerViewAdapter);
//为Adapter添加点击事件
sameContentListRecyclerViewAdapter.setOnItemClickListener(new SameContentListRecyclerViewAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(getActivity(), "position = " + position, Toast.LENGTH_SHORT).show();
        //在这里获取到position之后就可以做你想要的操作,当然你可以根据自己的需要传递不同的参数
    }
});

如果文章当中有任何不正确的地方,还请广大读者纠正,非常感谢!

你可能感兴趣的:(【android】如何为RecyclerView添加item点击事件)