Android recyclerView/listview的点击变色、点击换背景颜色(完整版)(最后附demo)

该博客详细介绍了如何在Android应用中实现RecyclerView的点击变色功能。通过创建自定义的RecyclerView.Adapter,设置点击事件监听,并在点击时改变选中项的颜色。同时,博主提供了完整的代码示例,包括MainActivity、RecyclerView.Adapter和布局文件,帮助读者理解和实现这一功能。
摘要由CSDN通过智能技术生成

**

一言不合就上图
**


我的AS版本是:3.1.2
android版本是:19——27

首先依賴(僅供參考):
    //recyclerview
    implementation 'com.android.support:recyclerview-v7:27.1.1'
1
2
然後項目結構:
首先:activity_main.xml的佈局

<?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:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:text="下面是recycler View點擊變色demo" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10px"
        android:orientation="horizontal"
        android:padding="20px">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recView"
            android:layout_width="300px"
            android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

        <TextView
            android:id="@+id/right_titel"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="30px"
            android:background="@color/colorAccent"
            android:gravity="center"
            android:text="點擊左側 獲取值"
            android:textSize="33sp" />
    </LinearLayout>

</LinearLayout>

recview_item.xml的佈局

<?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="wrap_content"
    android:orientation="vertical"
    android:padding="10px">

    <TextView
        android:id="@+id/item_titel"
        android:layout_width="match_parent"
        android:layout_height="150px"
        android:gravity="center"
        android:text="值:X"
        android:textSize="16sp" />
</LinearLayout>



RecViewAdapter類的代碼

package com.lmd.recviewchangecolordemo.adapter;

import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.lmd.recviewchangecolordemo.MainActivity;
import com.lmd.recviewchangecolordemo.R;

import java.util.List;

public class RecViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    /**
     * 第21-27行是:MainActivity裏面  適配器 傳過來的【上下文】和【模擬數據集合】
     */
    private MainActivity mainActivity;
    private List<Integer> list;

    public RecViewAdapter(MainActivity mainActivity, List<Integer> list) {
        this.mainActivity = mainActivity;
        this.list = list;
    }

    /**
     * 第33-39行是:手寫點擊事件的接口回調
     * 36行是點擊事件,    38行是長按事件。根據你的需求  寫你需要的
     */
    private OnItemClickListener onRecyclerViewItemClickListener;

    public interface OnItemClickListener {
        void onClick(int position);

        void onLongClick(int position);
    }

    /**
     * 第44-62行是點擊變色的邏輯
     */
    /最後一步點擊變色///
    //先声明一个int成员变量
    private int thisPosition;

    //再定义一个int类型的返回值方法
    public int getthisPosition() {
        return thisPosition;
    }

    //其次定义一个方法用来绑定当前参数值的方法
    //此方法是在调用此适配器的地方调用的,此适配器内不会被调用到
    public void setThisPosition(int thisPosition) {
        this.thisPosition = thisPosition;
    }

    public void setOnRecyclerViewItemClickListener(OnItemClickListener onItemClickListener) {
        this.onRecyclerViewItemClickListener = onItemClickListener;
    }


    /**
     * onCreateViewHolder渲染視圖綁定視圖
     *
     * @param parent
     * @param viewType
     * @return
     */
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mainActivity).inflate(R.layout.recview_item, parent, false);
        RecViewViewHolder viewViewHolder = new RecViewViewHolder(view);
        return viewViewHolder;
    }

    /**
     * onBindViewHolder綁定/賦值  數據
     * 點擊事件   變色邏輯
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {

        /**
         * 這裏是常 用/見  賦值的地方
         */
        RecViewViewHolder viewViewHolder = (RecViewViewHolder) holder;
        if (viewViewHolder != null) {
            viewViewHolder.titel.setText(list.get(position) + "");

            ///點擊變色/
            if (position == getthisPosition()) {
                //選中的顔色就設成了  黃色
                viewViewHolder.titel.setBackgroundColor(Color.YELLOW);
            } else {
                //未選中的顔色 就設成了 白色
                viewViewHolder.titel.setBackgroundColor(Color.WHITE);
            }
            點擊變色
        }
        /**
         * 這裏是設置  點擊/長按  的事件的地方
         */
        if (onRecyclerViewItemClickListener != null) {
            //點擊事件
            viewViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 拿到上面暴露的接口  的點擊方法  裏面的值和點擊事件的position  相互賦值  保持一致
                     * 算了,越説越亂,自己去理解吧
                     */
                    onRecyclerViewItemClickListener.onClick(position);
                }
            });
            //長按事件
            viewViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    onRecyclerViewItemClickListener.onLongClick(position);
                    return false;
                }
            });
            //
        }
        //
    }

    /**
     * 縂條目
     *
     * @return
     */
    @Override
    public int getItemCount() {
        /**
         * 第152行:list != null ? list.size() : 0
         * 這是三元運算符  知道吧
         * 相當於【if(){}】判空語句
         * 二選一  衹能用一種 判空語句
         */
//        if (list != null) {
//            return list.size();
//        } else {
//            return 0;
//        }
        return list != null ? list.size() : 0;
    }

    /**
     * 手寫View Holder  優化類
     * 必須繼承【RecyclerView】包下的【ViewHolder】
     */
    class RecViewViewHolder extends RecyclerView.ViewHolder {

        private final TextView titel;

        public RecViewViewHolder(View itemView) {
            super(itemView);
            titel = itemView.findViewById(R.id.item_titel);
        }
    }
}



MainActivity類的代碼

package com.lmd.recviewchangecolordemo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.lmd.recviewchangecolordemo.adapter.RecViewAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * 我覺得我寫的注釋 太詳細了,
 * 顯   得   很   羅   嗦,
 * 你自己過濾你需要的信息吧。
 * Tip:我不是港臺人,衹是公司產品需要用繁體字。(懶得再改回來,反正大家基本都能看得懂)
 */

/**
 * 第26行:沒必要非得繼承FragmentActivity
 * 根據你自己的需求來吧
 */
public class MainActivity extends FragmentActivity {

    private RecViewAdapter adapter;
    private TextView rightTitel;
    private List<Integer> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //記得:先加載數據,后給控件賦值.否則顯示不出來.(也就是先寫38行initDat(),后寫39行initView())
        initData();//初始數據
        initView();//初始控件
        initListener();//點擊事件

//        //默認  加載第一條數據   如果不寫這行  右側文字會顯示“點擊左側 獲取值”
        rightTitel.setText(list.get(0) + "");
    }

    /**
     * 初始化
     */
    private void initView() {
        RecyclerView recView = findViewById(R.id.recView);
        rightTitel = findViewById(R.id.right_titel);
        //設置RecyclerView的獨特顯示風格  (注:必寫。不寫不顯示視圖)
        recView.setLayoutManager(new LinearLayoutManager(this));
        //把上下文和list數據集合傳給適配器
        adapter = new RecViewAdapter(this, list);
        //控件綁定適配器
        recView.setAdapter(adapter);
        //刷新適配器
        adapter.notifyDataSetChanged();

    }

    /**
     * 模擬的假數據
     */
    private void initData() {
        //模擬 假數據
        list = new ArrayList<Integer>();
        for (int i = 1; i < 31; i++) {
            list.add(i);
        }
        Log.e("tag", "list集合的内容為:" + list);
    }

    /**
     * 點擊事件
     */
    private void initListener() {
        /**
         * 使用  適配器我們剛寫好的  暴露的接口
         */
        adapter.setOnRecyclerViewItemClickListener(new RecViewAdapter.OnItemClickListener() {
            //帶出來的【點擊】重寫方法
            @Override
            public void onClick(int position) {
                Toast.makeText(MainActivity.this, "點擊了" + (position + 1), Toast.LENGTH_SHORT).show();
                //  "\n"    是換行符 知道吧
                rightTitel.setText("獲取到的值為:" + "\n" + (position + 1));
                Log.e("tag", "獲取到的左側點擊值為:" + (position + 1));
                //拿适配器调用适配器内部自定义好的setThisPosition方法(参数写点击事件的参数的position)
                adapter.setThisPosition(position);
                //嫑忘记刷新适配器
                adapter.notifyDataSetChanged();
            }

            //帶出來的【長按】重寫方法
            @Override
            public void onLongClick(int position) {
                Log.e("tag", "獲取到的左側長按點擊值為:" + (position + 1));
            }
        });
    }
}



Demo版
简洁版
完事完事 The End…
————————————————
版权声明:本文为CSDN博主「Banner Kane」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/YuEOrange/article/details/81004725

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值