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") /
Unity中button事件監聽的四種方式
UGUI 視覺化建立以及關聯事件很方便, 動態建立可以利用建立好的 Prefab 進行例項化, 只是在關聯事件上有些複雜, 本文總結了幾種給按鈕繫結事件的關聯方式. 1. 視覺化建立及事件繫結 # Step 1 : 通過 Hierarchy 面板建立 UI
Android中ListView中包含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