作者tails32100 (Tails)
看板AndroidDev
標題Re: [問題] 多個listview共用監聽
時間Sat Apr 5 01:37:29 2014
目前聽起來的感覺
我個人是猜測你是用Button/Spinner/其他AdapterView當作切換的開關
然後切換時,換ListView的內容達成的
因為你有提到:
1. 四個ListView是用共用同一個元件
2. 個別ListVeiw給了不同的Listener
可是最後點進去都是執行某固定一個Listener
不管有沒有猜對,都還是建議你用下面幾種方法解決會比較好:
A. TabHost或Spinner + Fragment
B. ViewPager
C. ViewPager + Fragment
難度由簡到難:B, C, A
(純屬個人想法)
最後,如果我上面猜測正確的話
那又該如何就現有的基礎去修正(假設客戶就是希望要長這樣)
首先先要了解一件事,雖然宣告了四個ListView變數
實際上四個ListView存的都是同一個View
也就是改了listview1後,2 3 4的內容都會跟著一起動
原因請去Google: java 參考
所以
第一步:其實只要宣告一個ListView變數就好了
第二步:只有一個ListView,那表示Listener也只要一個就好了
第三步:假設你四個Adapter都是用ArrayAdapter<String>,那Listener可以這樣寫:
onItemSelected(AdapterView<?> parent, View v, int position, long id) {
ArrayAdapter<String> adapter = (ArrayAdapter<String>) parent.getAdapter;
String data = adapter.getItem(position);
// data即為正確選到的資料
...
}
但實際上該怎麼寫,就要視你的Adapter是怎麼寫來決定了
※ 引述《asifsea (sea)》之銘言:
: layout配置只放一個listview,id為listclinic
: java檔裡宣告了四個listview,分別是listview1,2,3,4(如眼科系列診所,小兒科系列診所)
: 四個listview共用元件皆為findViewById(R.id.listclinic1)
: 但是四個listview裡的內容是不同的。
: 我想要點進每個listview的項目都可以正確顯示其代表的診所簡介
: 如眼科系列診所點進Item甲診所→顯示甲診所簡介
: 現在遇到的問題是,監聽事件要如何知道我指向的是四個中的哪個listview
: 1.有試過個別都給一個監聽器,如:
: listView1.setOnItemClickListener(Listener1);
: listView2.setOnItemClickListener(Listener2);
: 但是似乎無效,其不同listview的Item點進去都是顯示連到甲診所資料
這裡可以試看看換執行setOnItemClickListener順序
你會發現不同的ListView的item點進去會變成都是顯示乙(或丙、丁...)診所的資料
那就代表我猜的沒錯了XD
: 2.onItemSelected(AdapterView<?> parent, View v, int position, long id)
: parent,是用來選擇哪個listview的,但點進去都是顯示連到甲診所資料
: 要如何才能正確點進指定診所,顯示正確的簡介??
--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.126.68.4
※ 文章網址: http://www.ptt.cc/bbs/AndroidDev/M.1396633052.A.A8B.html
→ asifsea:謝謝t大的回答十分的清楚!我是用Spinner項目選取來切換。 04/05 11:55
→ asifsea:以為是一個listview裝一個adapter,沒想到都指向同一個 04/05 11:58
→ asifsea:因為樣式是採取simple_list_item_2,一行名稱 一行放地址 04/05 12:07
→ asifsea:是用SimpleAdapter和ArrayList<HashMap<String, String> 04/05 12:10
現在回來看這篇,覺得我打得有點跳痛,沒想到你看得懂XD
其實以目前的結構為基礎的話,解法也蠻多的
就我原本的解法要改成SimpleAdapter的話
那HashMap最好加上跟原始資料相關的Item
map.put("data_id", String.valueOf(id));
只是我不知道SimpleAdapter用getItem會取到什麼 (懶得試了)
所以Listener就跳過
----------------------------------------------------------
還有一個更偷吃步的方法
一樣改成一個ListView變數
但Listener設定四個
然後在Spinner裡的OnItemSelectedListener裡去換ListView的Listener:
onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch(position) {
case 0:
listview.setOnItemClickListener(Listener1);
break;
case 1:
listview.setOnItemClickListener(Listener2);
break;
...
}
}
理論上,這樣應該也可以達到你想要的結果
※ 編輯: tails32100 (59.126.68.4), 04/05/2014 13:10:28
推 asifsea:說來慚愧...採取SimpleAdapter不會運用在Listener裡>< 04/05 20:23
→ asifsea:所以就直接用t大所教的偷吃步法來改,一來是簡單明瞭。 04/05 20:24
→ asifsea:二來其Item所要跳頁顯示的資料龐大,採取四個Listener的話 04/05 20:25
→ asifsea:往後很容易修改資料,甚至是分清為哪個系列的簡介內容。 04/05 20:25
→ asifsea:這listview煩惱我很久了,google查很久都沒相同案例 04/05 20:26
→ asifsea:真的很謝謝t大這麼有耐性的回答,其解法十分易懂,受教了~ 04/05 20:27
→ asifsea:冒昧問一句:請問google map api2在AVD模擬器到底能否呈現? 04/05 20:43
→ tails32100:理論上應該是不行吧...我沒用過AVD開發過Orz... 04/07 00:10
→ asifsea:後來不用內建的AVD 直接魔神模擬器就解決無法顯示問題 04/15 15:05