您的位置:首页 > 移动开发 > Android开发

android listview 中button 冲突问题,不同情况不同解决方案

2014-05-13 11:51 323 查看
主题:

Listview与button共同 存在事件?

1 问题描述:

用户需求不同,要的结果也不同。大致有三种情况:1)想要listview的事件。2)想要listview中的button事件。3)想要两个事件都有。

2 知识准备:

1) 关于重写listview。BaseAdapter,或者是SimpleAdapter。其中getView方法的正确理解。

继承自BaseAdapter的:(有button事件)

public ViewgetView(final int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

if (convertView == null) {

holder=newViewHolder();

//可以理解为从vlist获取view 之后把view返回给ListView

convertView = mInflater.inflate(R.layout.vlist,null);

holder.title =(TextView)convertView.findViewById(R.id.sms_list_item_contractid);

holder.info =(TextView)convertView.findViewById(R.id.sms_list_item_receivetime);

holder.viewBtn =(Button)convertView.findViewById(R.id.sms_list_but_sendsms);

convertView.setTag(holder);

}else {

holder =(ViewHolder)convertView.getTag();

}

holder.title.setText((String)mData.get(position).get("title"));

holder.info.setText((String)mData.get(position).get("info"));

holder.viewBtn.setTag(position);

//给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉

holder.viewBtn.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View v) {

showInfo(position);

}

});

//holder.viewBtn.setOnClickListener(MyListener(position));

return convertView;

}

继承自SimpleAdapter的:

重写的时候(必须重写getVeiw),必须将列表视图操作全部写在里边。

mData=this.getData();
String[]from={ "title","info"};
int[]to={R.id.sms_list_item_contractid, R.id.sms_list_item_receivetime};

MyAdapter saImageItems_all = new MyAdapter(this,users_all,R.layout.vlist,from,to);

如果不重写,可以不用getView的方法。

mData=this.getData();
String[]from={ "title","info"};
int[]to={R.id.sms_list_item_contractid, R.id.sms_list_item_receivetime};

SimpleAdapter saImageItems_all = newSimpleAdapter(this,users_all,R.layout.sms_listview_item_layout,from,to);

2) 正确理解ViewHolder.

ViewHolder缓存了view中显示数据的子控件,View的每次创建是比较耗时的,因此对于getview方法传入的convertView应充分利用 != null的判断 ,view的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象。

引用自:/article/2019189.html

3) 影响listview中button事件的主要问题在哪。
http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html
主要讲了不同参数设置,在此不多说。

即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”

3 不同需求

1) 只想要listview事件,屏蔽掉里边的button事件。

方案:可以在重写方法上屏蔽掉button的处理事件。或者不用getView的方法重写。也可以代码不修改,直接在xml文件中修改。

目前只实现了屏蔽掉button事件处理的方法,对于xml方法,

Xml中设置:android:descendantFocusability="blocksDescendants",button事件仍然可以点击,不知道为什么,希望知道的朋友可以分享一下经验。

SampleAdapter可以不用重写getview,处理如下。

public void initDateItemListener(intnum){
mData=this.getData();
String[]from={ "title","info"};
int[]to={R.id.sms_list_item_contractid, R.id.sms_list_item_receivetime};

//MyAdaptersaImageItems_all = new MyAdapter(this,users_all,R.layout.vlist,from,to);
SimpleAdaptersaImageItems_all = new SimpleAdapter(this,users_all,R.layout.vlist,from,to);

lv.setAdapter(saImageItems_all);
//添加点击
lv.setOnItemClickListener(newOnItemClickListener() {

@Override
public voidonItemClick(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {
showInfoItem(arg2);
}
});
}
2) 只想要里边的button事件,屏蔽掉listview的事件处理。

方法一:可以直接在xml中进行设置,

去掉:android:descendantFocusability="blocksDescendants"

或者改成:android:descendantFocusability="afterDescendants"

方法二:代码修改,不用写item的点击事件,

//添加点击
lv.setOnItemClickListener(newOnItemClickListener() {

@Override
public voidonItemClick(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {
showInfoItem(arg2);
}
});

也是可以的。

BaseAdapter测试通过。

SimpleAdapter测试通过。

3) 两个都需要

首先,在listview的跟地址设置android:descendantFocusability="blocksDescendants"

然后只要接口在,就可以实现。

BaseAdapter测试通过。

SimpleAdapter测试通过。

4 代码下载地址:

http://download.csdn.net/detail/self_discipline1/7339427
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐