Re: [問題] 多個listview共用監聽

看板AndroidDev作者 (Tails)時間11年前 (2014/04/05 01:37), 11年前編輯推噓1(1012)
留言13則, 2人參與, 最新討論串2/2 (看更多)
目前聽起來的感覺 我個人是猜測你是用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

04/05 11:55, , 1F
謝謝t大的回答十分的清楚!我是用Spinner項目選取來切換。
04/05 11:55, 1F

04/05 11:58, , 2F
以為是一個listview裝一個adapter,沒想到都指向同一個
04/05 11:58, 2F

04/05 12:07, , 3F
因為樣式是採取simple_list_item_2,一行名稱 一行放地址
04/05 12:07, 3F

04/05 12:10, , 4F
是用SimpleAdapter和ArrayList<HashMap<String, String>
04/05 12:10, 4F
現在回來看這篇,覺得我打得有點跳痛,沒想到你看得懂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

04/05 20:23, , 5F
說來慚愧...採取SimpleAdapter不會運用在Listener裡><
04/05 20:23, 5F

04/05 20:24, , 6F
所以就直接用t大所教的偷吃步法來改,一來是簡單明瞭。
04/05 20:24, 6F

04/05 20:25, , 7F
二來其Item所要跳頁顯示的資料龐大,採取四個Listener的話
04/05 20:25, 7F

04/05 20:25, , 8F
往後很容易修改資料,甚至是分清為哪個系列的簡介內容。
04/05 20:25, 8F

04/05 20:26, , 9F
這listview煩惱我很久了,google查很久都沒相同案例
04/05 20:26, 9F

04/05 20:27, , 10F
真的很謝謝t大這麼有耐性的回答,其解法十分易懂,受教了~
04/05 20:27, 10F

04/05 20:43, , 11F
冒昧問一句:請問google map api2在AVD模擬器到底能否呈現?
04/05 20:43, 11F

04/07 00:10, , 12F
理論上應該是不行吧...我沒用過AVD開發過Orz...
04/07 00:10, 12F

04/15 15:05, , 13F
後來不用內建的AVD 直接魔神模擬器就解決無法顯示問題
04/15 15:05, 13F
文章代碼(AID): #1JFktSgB (AndroidDev)
文章代碼(AID): #1JFktSgB (AndroidDev)