最近做了一个小Demo,listView控件中自定义了item项控件,里面添加了Textview,
ImageButton等组件,但问题出现了,ListView控件中的onItemClickListener事件监听不到,经过多次测试之后,发现是由于添加Button按钮的原因,把它改为ImageView之后便没问题,具体原因还不是很清楚,个人感觉是Button把焦点给获取到自己身上了,所以ListView便没了响应。
2012.05.29 从网上找到了解决办法, 当我们使用listView嵌套button或者其它clickable控件时会出现listView的onitemClick事件不响应的问题。我们只需要在item的xml文件中的根布局中加上一句:
- android:descendantFocusability="blocksDescendants"
android:descendantFocusability="blocksDescendants"
屏蔽item中抢夺focus的控件权限即可解决问题。
<Button
android:id="@+id/dvd_imageBtn_fillDel"
android:layout_width="21px"
android:layout_height="29px"
android:background="#FF0000"
android:layout_alignParentRight="true"
android:layout_marginTop="10px"
android:layout_marginRight="10px"
/>
把button改为 ImageView即可
<ImageView
android:id="@+id/dvd_imageBtn_fillDel"
android:layout_width="21px"
android:layout_height="29px"
android:background="#FF0000"
android:layout_alignParentRight="true"
android:layout_marginTop="10px"
android:layout_marginRight="10px"
/>
效果图:
在做该Demo时,又学到了一个知识点,就是在操作ListView的时候,比如我要删除ListView中的某一项, 前提是我得知道该项在数据集中的索引,
从下面这篇文章链接里得到了启发:
http://www.cnblogs.com/macroxu-1982/archive/2011/06/27/2091552.html 这篇文章主要是讲在使用CursorAdapter的时候,使用view中的
setTag() 和 getTag()来进行传递标识, 经过自己测试后,在ArrayAdapter中的getView()方法中也可以直接使用tag直接为组件(view)赋值,
如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null)
convertView = LayoutInflater.from(mContext).inflate(mTextViewResourceId, null);
mImgViewDelFile = (ImageView) convertView.findViewById(R.id.dvd_imageView_fillDel);
mImgViewDelFile.setOnClickListener(new ClickBtnEvent());
TextView fileName = (TextView) convertView.findViewById(R.id.dvd_play_fillName);
TextView fileAuthor = (TextView) convertView.findViewById(R.id.dvd_play_fillAuthor);
fileName.setText(mListFileName[position]);
fileAuthor.setText(mListFileAuthor[position]);
mImgViewDelFile.setTag(position);//在这里设置删除按钮对应的item项索引
int colorPos = position % colors.length;
convertView.setBackgroundColor(colors[colorPos]);
return convertView;
}
而在点击删除按钮(上图红色块)的时候,直接从getTag()中获取即可,详见代码:
/**按钮点击事件*/
class ClickBtnEvent implements OnClickListener{
@Override
public void onClick(View v) {
Toast.makeText(mContext, "应该删除该文件:" + v.getTag().toString(), Toast.LENGTH_SHORT).show();
}
}
//删除的时候直接操纵v.getTag()所对应的项即可。