当前位置: 代码迷 >> Android >> 请教关于listview上 选中后 显示的有关问题
  详细解决方案

请教关于listview上 选中后 显示的有关问题

热度:43   发布时间:2016-04-28 01:53:20.0
请问关于listview上 选中后 显示的问题
请问  以下的效果是怎么实现的呢?

现在做到的是 从网络数据库中获取数据,并用listview显示出来。

但是要做到 当点击其中一项的时候,出现右手边的 “打勾”的符号, 而且只能选中三个,当点击 第四的时候,会弹出提示框 “不能选择多于3个”。

现在这个 listview的显示 主要是用 自定义adapter的方法显示  如public class xxxAdapter extends BaseAdapter {  }

而 那个打勾的效果 是要在   xxxAdapter  里边的  item布局文件里边  弄个 checkbox吗?还是怎么处理呢?

如果在布局里边弄个  textview 显示 文字 ,弄个checkbox显示 打勾的,  那么这 checkbox怎么处理已经点击了 三个了呢?

麻烦会的朋友帮忙回复,谢啦



------解决思路----------------------
item的布局是自定义的,左边一个textview,右边一个checkbox
至于数量自己计数吧,检查被选中的checkbox是否大于3
------解决思路----------------------
右边那个勾勾用什么都可以,imageView什么的都行,只要能显示那个勾勾就行。
我觉得计数还是要放到你自定义的adapter里面比较好,大概的思路可以这样写

在adapter中有一个全局变量count=0,这个变量有get和set方法,当你的item发生
点击事件时,去adapter中get count这个变量,如果小于3,显示后面的勾勾,并且把
count+1 set回adapter

并且建议你的item还要设一个变量boolean flag,默认为false,这个变量判断这个item是否打了勾勾,
点击这个item的时候,判断这个变量是否为false,如果为false,去做后面的事情,
如果能打勾勾,再把这个变量set 为true。
如果为true,就把后面的勾勾取消掉,flag set 回false。
这样你就还可以防止点错勾勾,可以取消勾了。

打得有点乱,不晓得我说明白没

------解决思路----------------------
百度checkbox+listview很多案例
------解决思路----------------------
引用:
@pang376654973    谢谢您的回复

“item还要设一个变量boolean flag”

对于 item要设置一个变量 flag。

有点不太明白,比如说默认的时候,flag 为 false。

当点击  item 1 的时候,  显示  表示 “打开”  的 图片,然后 flag设置为 true。

那么 当点击 item2 的时候, 显示 表示 “打开” 的 图片,这时后,要把flag 设置为 true。 那么这个标志为怎么写呢?
怎么区分 是 item1  的标志位 而不是 item2 的标志位呢?

就是 item1  怎么跟  对应的标志位 flag   对应起来
         item2  怎么跟  对应的标志位 flag   对应起来

代码 不太清楚怎么写区分
麻烦再说下吧,谢谢啦



看来你对listview还不是很熟悉啊。你传给adapter的不是一个list<object> 么?
我看你下面的回复,你的object中,包含一个textview的值,一个imageview的值,再加一个变量boolean flag
不就好了么,这样每个item都有自己一个独立的flag(我对viewHolder不是很熟悉,就不乱说了)??

我把点击事件给你说得详细点吧。
你在activity中设置你的listview item的点击事件,listview.setOnItemClickListener(OnItemClickListener);
在OnItemClickListener中有一个必须重写的方法:

public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//其中有个参数是 int position,这个就是你点击listview时对应点的哪个item的位置,
//通过这个参数,你可以找到对应的item的flag
}

------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

@pang376654973    谢谢您的回复

“item还要设一个变量boolean flag”

对于 item要设置一个变量 flag。

有点不太明白,比如说默认的时候,flag 为 false。




当点击  item 1 的时候,  显示  表示 “打开”  的 图片,然后 flag设置为 true。

那么 当点击 item2 的时候, 显示 表示 “打开” 的 图片,这时后,要把flag 设置为 true。 那么这个标志为怎么写呢?
怎么区分 是 item1  的标志位 而不是 item2 的标志位呢?

就是 item1  怎么跟  对应的标志位 flag   对应起来
         item2  怎么跟  对应的标志位 flag   对应起来

代码 不太清楚怎么写区分
麻烦再说下吧,谢谢啦



看来你对listview还不是很熟悉啊。你传给adapter的不是一个list<object> 么?
我看你下面的回复,你的object中,包含一个textview的值,一个imageview的值,再加一个变量boolean flag
不就好了么,这样每个item都有自己一个独立的flag(我对viewHolder不是很熟悉,就不乱说了)??

我把点击事件给你说得详细点吧。
你在activity中设置你的listview item的点击事件,listview.setOnItemClickListener(OnItemClickListener);
在OnItemClickListener中有一个必须重写的方法:

public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//其中有个参数是 int position,这个就是你点击listview时对应点的哪个item的位置,
//通过这个参数,你可以找到对应的item的flag
}


@pang376654973   非常感谢您的回复
但是还有些地方不太明白呀,代码如下:
 public class InformationAdapter extends BaseAdapter {  
。。。。

   public int getCount() {
Log.d(TAG,"InformationAdapter: public int getCount()");
return Informationlist.size();
}

public Object getItem( int position ) {
Log.d(TAG,"InformationAdapter: public Object getItem( int position ) position ="+position);
return position;
}

public long getItemId( int position ) {
Log.d(TAG,"informationadapter:public long getItemId( int position )");
return position;
}

      public View getView(int position,View convertView,ViewGroup parent ) {
Log.d(TAG,"InformationAdapter: public View getView");
                 。。。。。
                   。。。。。
         }
}

另外上面的界面是在fragment上显示的 :
public class InformationFragment extends BaseFragment {
。。。。。。
  listView11.setOnItemClickListener( new OnItemClickListener() {
public void onItemClick(AdapterView<?>arg0,View arg1, int arg2,long arg3) { //arg2 is  position  
Log.d(TAG,"listView11 onItemClick InformationFragment position = "+arg2);

}
}); 
。。。。。。
}
当点击某一个item的时候,
03-11 10:34:17.265: D/InformationAdapter(31193): informationadapter:public long getItemId( int position )
03-11 10:34:17.270: D/InformationAdapter(31193): InformationAdapter: public int getCount()
03-11 10:34:17.335: D/InformationAdapter(31193): InformationAdapter: public int getCount()
03-11 10:34:17.335: D/InformationAdapter(31193): informationadapter:public long getItemId( int position )
03-11 10:34:17.340: D/InformationFragment(31193):  listView11 onItemClick InformationFragment position = 4

它只是调用了这些函数。 奇怪的是顺序为什么 getItemId()--》getCount()-》getItemId()-》 getItemId()--》

最后就是  我的理解是 把 flag放在一个数组里边, 数组的第一个位置代表 item1,以此类推。它的值不同就代表不同的状态。

但是 这个 应该放在哪个函数处理呢? getItemId()?getCount()?还是?

但是当点击的时候,代码没有跑 public View getView(int position,View convertView,ViewGroup parent ) 这个函数的 。

麻烦再回复下,谢啦
会的朋友麻烦也帮忙回复下吧,谢谢


首先,我建议你去好好看看listview的讲解,网上,书上都行。

public Object getItem( int position ),adapter里面这个函数不应该return position。
这个函数的意思是返回你点击那个item的数据,也就是你传入那个list的具体的一个。应该写成这样:
public Object getItem( int position ) {
return Informationlist.get(position).;
}
这样你要获得对应item的值,只需要在item的点击事件中写 adapter.getItem.getflag就行了。
当然你需要在list<object>的object中写好flag的get,set方法。

然后你的下一个问题,getView跑的时候不是点击item的时候,这个方法的作用是,
展示view的,比如你当前页面初始能展示5个item,当你往下滑,这个时候第6个item
就要出现了,这时adapter就会自动调用getView()去生成一个view赋给新出现的item。
所以getView()不是你点击item的时候会调用的。
------解决思路----------------------
上面笔误,是要获得对应item的flag的值。。
------解决思路----------------------
引用:
@ pang376654973  谢谢您的回复

我实在是不太明白您说的意思,不知道怎么写这个代码。 如果方便的话, 能帮忙简单的 写下吗?   谢啦


如果你连我说得这些都听不懂的话,我建议你就先不要写这么复杂的listView了。
毕竟listview是个很基础的东西,建议你搞明白。

先写一个简单的listview,成功后。
再学习写自定义的adapter,怎么传值,里面的每个方法是什么意思。
这些搞懂了,你最开始的问题就是小儿科了。
一步一步来,不要急了。。。。
------解决思路----------------------
引用:
@pang376654973   由于项目紧,请多多包涵


不知道你从网上下的数据的格式,我就简单跟你说一说。

假如你网上的下的数据是很多个object的集合,每个object都包含一个图片和一条文字(json,xml格式什么的处理流程都一样),
这样你需要把网上的数据解析成一个个图片,一个文字。
解析好后,你自己写一个实体类,就如就叫Infor,里面写你需要存的数据,针对上面的假设条件,可以这么写:

public class Infor {

public String picture;//从网上得到的图片一般来说是一个网址,也就是一个string
public String word;
public boolean flag;

public Infor(){

}

public String getPicture() {
return picture;
}

public void setPicture(String picture) {
this.picture = picture;
}

public String getWord() {
return word;
}

public void setWord(String word) {
this.word = word;
}

public boolean isFlag() {
return flag;
}

public void setFlag(boolean flag) {
this.flag = flag;
}


}

这样你的实体类里面包含所有你需要的数据加上flag;
然后new你的实体类,并且用你的网上数据来给这个新new的对象赋值。

Infor infor = new Infor();
infor.setPicture(你从网上得到的数据);
infor.setWord(你从网上得到的数据);
infor.setFlag(false);
然后再将这个对象交给你的list
Informationlist.add(infor);

还有数据你就不停new Infor的对象,不停赋值,不停交给你的list,最后将这个list交给adapter就行了。
一般来说,我们会根据网上的数据的格式来写个for循环,来控制new多少个infor对象,自动赋值。
因为不知道你从网上下的是什么数据,所以就不乱说了,你自己根据网上数据的来设定条件吧。

  相关解决方案