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

**

一言不合就上图

**
这里写图片描述

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

首先依賴(僅供參考):

    //recyclerview
    implementation 'com.android.support:recyclerview-v7:27.1.1'

然後項目結構:
这里写图片描述

首先: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…

发布了21 篇原创文章 · 获赞 16 · 访问量 3万+
展开阅读全文

Android RecyclerView滑动出现空指针异常

05-03

ViewPager里面是Fragment然后Fragment里面是RecyclerV但是可以正常显示列表,一旦滑动就会出现异常,这个是垂直方向的 然后里面还嵌套了一个水平方向的网格式RecyclerView没有显示出来!TIME=1429828195000 FINGERPRINT=Xiaomi/cancro_wc_lte/cancro:4.4.4/KTU84P/5.4.24:user/release-keys HARDWARE=qcom UNKNOWN=unknown RADIO=unknown BOARD=MSM8974 versionCode=1 PRODUCT=cancro_wc_lte versionName=1.0 DISPLAY=KTU84P USER=builder HOST=qh-miui-ota-bd56 DEVICE=cancro TAGS=release-keys MODEL=MI 4LTE BOOTLOADER=unknown CPU_ABI=armeabi-v7a CPU_ABI2=armeabi IS_DEBUGGABLE=true ID=KTU84P SERIAL=895f2f74 MANUFACTURER=Xiaomi BRAND=Xiaomi TYPE=user java.lang.NullPointerException at android.support.v4.view.ViewCompat$ICSViewCompatImpl.setAccessibilityDelegate(ViewCompat.java:923) at android.support.v4.view.ViewCompat.setAccessibilityDelegate(ViewCompat.java:1343) at android.support.v7.widget.RecyclerView$Recycler.addViewHolderToRecycledViewPool(RecyclerView.java:3900) at android.support.v7.widget.RecyclerView$Recycler.recycleCachedViewAt(RecyclerView.java:3843) at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:3880) at android.support.v7.widget.RecyclerView$Recycler.recycleView(RecyclerView.java:3804) at android.support.v7.widget.RecyclerView$LayoutManager.removeAndRecycleViewAt(RecyclerView.java:5529) at android.support.v7.widget.LinearLayoutManager.recycleChildren(LinearLayoutManager.java:1143) at android.support.v7.widget.LinearLayoutManager.recycleViewsFromEnd(LinearLayoutManager.java:1218) at android.support.v7.widget.LinearLayoutManager.recycleByLayoutState(LinearLayoutManager.java:1242) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1268) at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1102) at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:959) at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:3062) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doframe(Choreographer.java:543) at android.view.Choreographer$frameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5047) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) at dalvik.system.NativeStart.main(Native Method) 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览