1. 程式人生 > >ListView子項中包含Button按鈕監聽混亂的解決辦法

ListView子項中包含Button按鈕監聽混亂的解決辦法

ListView子項中包含Button按鈕,遇到監聽混亂這種問題對於初學者來說,可謂是焦頭爛額,加之網上的程式碼多是複製貼上,質量不高,也可能未能從根本上解決自己的問題,這裡我就簡要記錄下自己的一些嘗試和體會,僅以此文獻給廣大初學者。

Goods(實體類)

package com.example.listviewandbutton;

public class Goods {
    // 物品ID
    private String id;
    // 是否已讀(假設為簡訊)
    private boolean isRead;

    // 有參構造
    public Goods
(String id, boolean isRead) { super(); this.id = id; this.isRead = isRead; } public boolean isRead() { return isRead; } public void setRead(boolean isRead) { this.isRead = isRead; } public String getId() { return id; } public
void setId(String id) { this.id = id; } @Override public String toString() { return "Goods [id=" + id + "]"; } }

GlobalList(全域性靜態集合)

package com.example.listviewandbutton;

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

/**
 * 全域性靜態集合(為了後面修改isRead狀態方便)
 * 
 * @author
lambert * */
public class GlobalList { public static List<Goods> list = new ArrayList<Goods>(); }

MainActivity

package com.example.listviewandbutton;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

/**
 * 主介面
 * 
 * @author lambert
 * 
 */
public class MainActivity extends Activity {
    ListView lv;

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

        initDatas();
        // 獲取ListView物件
        lv = (ListView) findViewById(R.id.lv);
        // 載入介面卡
        lv.setAdapter(new MyAdapter(MainActivity.this, GlobalList.list));
    }

    /*
     * 初始化資料
     */
    public void initDatas() {
        // 模擬資料,並新增到全域性靜態集合
        for (int i = 0; i < 30; i++) {
            // true已讀,false未讀
            Goods g = new Goods(String.valueOf(i + 1), false);
            GlobalList.list.add(g);
        }
    }
}

MyAdapter(介面卡)


import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 介面卡
 * 
 * @author lambert
 * 
 */
public class MyAdapter extends BaseAdapter {

    Context context;
    // 全域性的ViewHolder引用
    ViewHolder vh;

    public MyAdapter(Context context, List<Goods> list) {
        super();
        this.context = context;
    }

    @Override
    public int getCount() {
        return GlobalList.list.size();
    }

    @Override
    public Object getItem(int arg0) {
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        return 0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2) {
        if (arg1 == null) {
            vh = new ViewHolder();
            arg1 = LayoutInflater.from(context).inflate(R.layout.items, null);
            vh.tv = (TextView) arg1.findViewById(R.id.tv);
            vh.btn = (Button) arg1.findViewById(R.id.btn);
            arg1.setTag(vh);
        } else {
            vh = (ViewHolder) arg1.getTag();
        }
        Goods g = GlobalList.list.get(arg0);
        vh.tv.setText("物品 " + g.getId());

        /*
         * 此處是重點,ListVeiw的Item裡有Button,我在BaseAdapter裡寫了Button的監聽,
         * 但是我每次點選Button,都是最後一個Item的Button響應事件,網上查說是因為傳進去
         * 的arg0是最後一個所以響應的是最後一個item,然後我在getview()外面寫了一個監聽介面, 並把arg0傳進去
         */
        vh.btn.setOnClickListener(new MyListener(arg0));

        if (g.isRead()) {
            vh.btn.setText("已讀");
            vh.btn.setBackgroundColor(Color.parseColor("#ffff4444"));
            vh.btn.setVisibility(View.GONE);
        } else {
            vh.btn.setText("未讀");
            vh.btn.setBackgroundColor(Color.parseColor("#ff99cc00"));
            vh.btn.setVisibility(View.VISIBLE);
        }
        return arg1;
    }

    class ViewHolder {
        TextView tv;
        Button btn;
    }

    /*
     * 外部監聽介面
     */
    class MyListener implements OnClickListener {
        int pos;

        public MyListener(int pos) {
            this.pos = pos;
        }

        @Override
        public void onClick(View arg0) {
            Goods g = GlobalList.list.get(pos);
            Toast.makeText(context, g.getId(), 0).show();
            // 此處可以由arg0強轉來取得Button按鈕
            Button btn = (Button) arg0;
            if (g.isRead()) {
                // 置為未讀
                btn.setText("未讀");
                btn.setVisibility(View.VISIBLE);
                GlobalList.list.set(pos, new Goods(String.valueOf(pos + 1),
                        false));
                // 淺綠色
                arg0.setBackgroundColor(Color.parseColor("#ff99cc00"));
            } else {
                // 置為已讀
                btn.setText("已讀");
                btn.setVisibility(View.GONE);
                GlobalList.list.set(pos, new Goods(
                        String.valueOf(pos + 1) + "", true));
                arg0.setBackgroundColor(Color.parseColor("#ffff4444"));
            }
        }
    }
}

執行後效果圖
這裡寫圖片描述
這裡寫圖片描述

相關推薦

ListView子項包含Button按鈕混亂解決辦法

ListView子項中包含Button按鈕,遇到監聽混亂這種問題對於初學者來說,可謂是焦頭爛額,加之網上的程式碼多是複製貼上,質量不高,也可能未能從根本上解決自己的問題,這裡我就簡要記錄下自己的一些嘗試和體會,僅以此文獻給廣大初學者。 Goods(實體類

android Button 按鈕的幾種方式

android button控制元件目前主要有如下幾種監聽方式: 一個button控制元件對應一個監聽:       Button buttontest;        buttontest 

Enterprise Manager配置失敗-程式未啟動或資料庫服務未註冊到該程式解決辦法

問題描述:在win7 32位系統下安裝oracle11g,在使用Database configuration Assistant建立資料庫時,在建立到85%的時候報錯,錯誤如下: 解決辦法: 在listener.ora中增加對BlueAeri-PC或ip地址的

win7_64位_oracle11g:Enterprise Manager配置失敗-程式未啟動或資料庫服務未註冊到該程式解決辦法

Enterprise Manager配置失敗-監聽程式未啟動或資料庫服務未註冊到該監聽程式解決辦法 環境:win7 64位系統、oracle11g資料庫 問題描述:在win7 64位系統下安裝oracle11g,在使用Database configuration Ass

Enterprise Manager配置失敗-程式未啟動或資料庫服務未註冊到該程式解決辦法----ORACLE 11g

Enterprise Manager配置失敗-監聽程式未啟動或資料庫服務未註冊到該監聽程式解決辦法 環境:win7 32位系統、oracle11g資料庫 問題描述:在win7 32位系統下安裝oracle11g,在使用Database configuration A

Enterprise Manager配置失敗-程式未啟動或資料庫服務未註冊到該程式解決辦法—-ORACLE 11g...

Enterprise Manager配置失敗-監聽程式未啟動或資料庫服務未註冊到該監聽程式解決辦法環境:win7 32位系統、oracle11g資料庫問題描述:在win7 32位系統下安裝oracle11g,在使用Database configuration Assistan

win10_64位_oracle11g:Enterprise Manager配置失敗-程式未啟動或資料庫服務未註冊到該程式解決辦法

問題描述:在win7 64位系統下安裝oracle11g,在使用Database configuration Assistant建立資料庫時,在建立到85%的時候報錯,錯誤如下:   解決辦法: 經過檢視警告中給出的日誌檔案F:\develop\oracle_dat

Android 自定義Dialog類,並在Activity實現按鈕

實際開發中,經常會用到Dialog,比如退出時候會彈出是否退出,或者還有一些編輯框也會用Dialog實現,效果圖如下: 開發中遇到的問題無非在於如果在Activity中監聽這個Dialog中實現的按鈕,Dialog類如下,在MyDialog這個類中實現了一個LeaveMyDialogLi

Swift按鈕方法私有化之後崩潰解決方式

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "註冊", style: UIBarButtonItemStyle.Plain, target: self, action: "loginBtn") /

Unitybutton事件的四種方式

UGUI 視覺化建立以及關聯事件很方便, 動態建立可以利用建立好的 Prefab 進行例項化, 只是在關聯事件上有些複雜, 本文總結了幾種給按鈕繫結事件的關聯方式. 1. 視覺化建立及事件繫結 # Step 1 : 通過 Hierarchy 面板建立 UI

AndroidListView包含Button時滑動丟失選中狀態的解決方法(二)

1.介面卡中的主要邏輯: import android.content.Context; import android.support.v4.content.ContextCompat; import android.text.TextUtils; import a

java的key事件機制

com java.awt imp package 時間 ext javax .get pri package com.at221; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; im

<Java>按鈕事件的實現方式

方式 log undle 必須 AC listen oncreate ava creat 一:事件處理機制要通過以下三個不同對象來實現: (1)事件源:事件發生的場所,通常為產生事件的組件。 (2)事件對象:封裝在組件上發生的特定事件。 (3)事件監聽對象:負責監聽事件源發

ListView點擊事件失效(item裏面有button按鈕控件)解決方法

title oid item ble layout hit attribute js xml wid ListView點擊事件失效解決方法: 一般出現這個情況,就是你的item裏面有按鈕的點擊事件,你的item裏面有button控件,button控件是搶占焦點的,只要在你

React和Vue,是如何變數變化的

React 中 本地除錯React程式碼的方法 先將React程式碼下載到本地,進入專案資料夾後yarn build 利用create-react-app建立一個自己的專案 把react原始碼和自己剛剛建立的專案關聯起來,之前build原始碼到build資料夾下面,然後cd到react資料夾

微信小程式開發textarea文字域字數限制與動態計算

微信小程式開發時常會有評論或者備註功能,都會用到文字域字元長度計算以及字元限制的功能,筆者把最簡潔易用的案例分享出來。學習之前先看微信官方API文件 https://mp.weixin.qq.com/debug/wxadoc/dev/component/textarea.html

Windows 2012 R2 Server伺服器Oracle安裝過程ORA-12514:TNS 問題

一、修改資料庫伺服器中listener.ora檔案內容 路徑: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora # listener.ora Network Configuration File:

vue使用element-ui鍵盤事件

  vue中element-ui在使用el-input的時候,由於el-input在輸入框的外層添加了一層的<div class="el-input"></div>,把input隱藏在子級,所以el-input新增上了keyup無響應; <el

js實現button按鈕變灰不可用,可用的方法

按鈕變灰不可用方法:document.getElementById("crop").setAttribute("disabled", true); 按鈕可用方法:document.getElementById("crop").removeAttribute("disabled"); 按

Spring啟動過程Application事件的與處理.md

這篇部落格是解決一個實際問題,在解決過程中梳理SpringApplicationEvent的執行機制和使用方法。這個問題是,微服務架構下,需要依次啟動多個服務,服務之間存在執行時的依賴關係,必須保證多個服務的啟動順序。所以決定從Spring的Application事件入手。 1.Ap