作者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://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1396633052.A.A8B.html
1F:→ asifsea:谢谢t大的回答十分的清楚!我是用Spinner项目选取来切换。 04/05 11:55
2F:→ asifsea:以为是一个listview装一个adapter,没想到都指向同一个 04/05 11:58
3F:→ asifsea:因为样式是采取simple_list_item_2,一行名称 一行放地址 04/05 12:07
4F:→ 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
5F:推 asifsea:说来惭愧...采取SimpleAdapter不会运用在Listener里>< 04/05 20:23
6F:→ asifsea:所以就直接用t大所教的偷吃步法来改,一来是简单明了。 04/05 20:24
7F:→ asifsea:二来其Item所要跳页显示的资料庞大,采取四个Listener的话 04/05 20:25
8F:→ asifsea:往後很容易修改资料,甚至是分清为哪个系列的简介内容。 04/05 20:25
9F:→ asifsea:这listview烦恼我很久了,google查很久都没相同案例 04/05 20:26
10F:→ asifsea:真的很谢谢t大这麽有耐性的回答,其解法十分易懂,受教了~ 04/05 20:27
11F:→ asifsea:冒昧问一句:请问google map api2在AVD模拟器到底能否呈现? 04/05 20:43
12F:→ tails32100:理论上应该是不行吧...我没用过AVD开发过Orz... 04/07 00:10
13F:→ asifsea:後来不用内建的AVD 直接魔神模拟器就解决无法显示问题 04/15 15:05