`
zhouxuebao87
  • 浏览: 117553 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ListView与Button共存问题

 
阅读更多
ListView 和 其它能触发点击事件的widget无法一起正常工作的原因是加入其它widget后,ListView的itemclick事件将无法触发,被其它widget的click事件屏蔽。
  • 首先,说明一下,ListView中每一行包括以下三项:
一个ImageView, 一个TextView,一个ImageButton,依次排开。
以下是layout的内容,分为两部分:
  • res/layout/main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:padding="10dip" android:orientation="vertical">

<ListView android:id="@id/android:list" android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>

 

因为继承了ListActivity,所以ListView 的id设置为"@id/android:list"是必须的

  • res/layout/lvitem.xml

注意:

<RelativeLayout>中

android:descendantFocusability="blocksDescendants"

<ImageButton>中

android:focusable="false"

这两项的设置很关键,如果不设置,将导致ListView的ItemClick事件将无法触发,该事件被ImageButton的click事件屏蔽了。

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dip"
android:descendantFocusability="blocksDescendants" >

<ImageView
android:id="@+id/ItemImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dip"
/>


<!--
把按钮背景设置为透明: android:background="#00000000"
把按钮背景设置为半透明: android:background="#e0000000"
-->
<ImageButton
android:id="@+id/ItemCloseWin"

android:layout_alignParentRight="true"
android:layout_alignTop="@+id/ItemWinName"
android:layout_alignBottom="@+id/ItemWinName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:background="#e0000000"
android:gravity="left|center_vertical"
android:focusable="false"
android:src="@android:drawable/ic_menu_close_clear_cancel"
/>

<TextView
android:id="@+id/ItemWinName"

android:layout_toRightOf="@+id/ItemImage"
android:layout_toLeftOf="@+id/ItemCloseWin"
android:layout_alignTop="@+id/ItemImage"
android:layout_alignBottom="@+id/ItemImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:gravity="left|center_vertical"
android:textSize="20dip"
android:text="title"
/>


</RelativeLayout>

  • 接下来,我们看看继承ListActivity的实现

lvWithButtonExt中,为了能处理ImageButton的click事件,我继承了BaseAdapter类,并重新实现了getView()接口,在其中加入了Button的clicklistener,详见lvButtonAdapter类的实现。

public class lvWithButtonExt extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// 关联Layout中的ListView
ListView vncListView = (ListView)findViewById(android.R.id.list);

// 生成动态数组,加入数据
ArrayList<HashMap<String, Object>> remoteWindowItem = new ArrayList<HashMap<String, Object>>();
for(int i=0;i<10;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemImage", R.drawable.firefox);//图像资源的ID
map.put("ItemWinName", "Window ID "+i);
map.put("ItemCloseWin", android.R.drawable.ic_menu_close_clear_cancel);
remoteWindowItem.add(map);
}

// 生成适配器的Item和动态数组对应的元素
lvButtonAdapter listItemAdapter = new lvButtonAdapter(
this,
remoteWindowItem,//数据源
R.layout.lvitem,//ListItem的XML实现

//动态数组与ImageItem对应的子项
new String[] {"ItemImage","ItemWinName", "ItemCloseWin"},
//ImageItem的XML文件里面的一个ImageView,两个TextView ID
new int[] {R.id.ItemImage,R.id.ItemWinName,R.id.ItemCloseWin}
);

vncListView.setAdapter(listItemAdapter);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
l.getItemAtPosition(position);
}
}

  • 接下来,我们看看lvButtonAdapter的实现

为了响应按钮的点击事件,首先要记录按钮的位置,然后为按钮设置clicklistener。

在重新实现的getView()接口中,我使用了lvButtonListener监听类,在构造函数中,记录行号,以便在OnClick接口中能准确的定位按钮所在的位置,进而对相应的行进行处理。

public class lvButtonAdapter extends BaseAdapter {
private class buttonViewHolder {
ImageView appIcon;
TextView appName;
ImageButton buttonClose;
}

private ArrayList<HashMap<String, Object>> mAppList;
private LayoutInflater mInflater;
private Context mContext;
private String[] keyString;
private int[] valueViewID;
private buttonViewHolder holder;

public lvButtonAdapter(Context c, ArrayList<HashMap<String, Object>> appList, int resource,
String[] from, int[] to) {
mAppList = appList;
mContext = c;
mInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
keyString = new String[from.length];
valueViewID = new int[to.length];
System.arraycopy(from, 0, keyString, 0, from.length);
System.arraycopy(to, 0, valueViewID, 0, to.length);
}

@Override
public int getCount() {
return mAppList.size();
}

@Override
public Object getItem(int position) {
return mAppList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

public void removeItem(int position){
mAppList.remove(position);
this.notifyDataSetChanged();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView != null) {
holder = (buttonViewHolder) convertView.getTag();
} else {
convertView = mInflater.inflate(R.layout.lvitem, null);
holder = new buttonViewHolder();
holder.appIcon = (ImageView)convertView.findViewById(valueViewID[0]);
holder.appName = (TextView)convertView.findViewById(valueViewID[1]);
holder.buttonClose = (ImageButton)convertView.findViewById(valueViewID[2]);
convertView.setTag(holder);
}

HashMap<String, Object> appInfo = mAppList.get(position);
if (appInfo != null) {
String aname = (String) appInfo.get(keyString[1]);
int mid = (Integer)appInfo.get(keyString[0]);
int bid = (Integer)appInfo.get(keyString[2]);
holder.appName.setText(aname);
holder.appIcon.setImageDrawable(holder.appIcon.getResources().getDrawable(mid));
holder.buttonClose.setImageDrawable(holder.buttonClose.getResources().getDrawable(bid));
holder.buttonClose.setOnClickListener(new lvButtonListener(position));
}
return convertView;
}

class lvButtonListener implements OnClickListener {
private int position;

lvButtonListener(int pos) {
position = pos;
}

@Override
public void onClick(View v) {
int vid=v.getId();
if (vid == holder.buttonClose.getId())
removeItem(position);
}
}
}

分享到:
评论

相关推荐

    【Android】ListView与Button的共存问题解决

    5. **使用CardView或RecyclerView**:在现代Android开发中,CardView和RecyclerView是更推荐使用的组件,它们提供了更好的性能和更多的定制选项,可以更方便地处理与Button等Widget的共存问题。 综上所述,解决...

    android中ListView和Button共存的问题

    使用BaseAdapter自定义适配器,采用了回收converView和ViewHolder优化代码,并且解决了在ListView中使用Button时,ListView的itemClick不能被触发的问题。

    ListView和Button的结合使用

    本文将详细介绍如何在Android应用中将ListView与Button结合使用,以及如何处理它们的点击事件,实现不同的操作。 首先,我们需要创建一个ListView。在布局文件(如activity_list_view.xml)中,添加ListView元素,...

    listView上增加button点击事件

    然而,在实际应用中,我们经常需要在ListView的每一项(item)中添加按钮(button),以便用户进行交互操作。标题"listView上增加button点击事件"所涉及的核心知识点是如何在ListView的item中嵌入Button,并同时处理...

    android中listView的Button监听

    最近在做android项目时 发现要在listView用到Button等各种点击事件 经过各种百度 发现有两个简单的方法实现 我把demo放上去 为了方便自己以后用到 也方便学习listview实现button监听的同学们 注意 我用最新sdk...

    实现listview监听button

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。然而,当列表项中包含交互元素,如Button时,我们需要实现对这些元素的点击事件监听。本篇将详细介绍如何在ListView中监听Button的点击事件,...

    Android ListView添加Button及其事件

    当我们需要在每个列表项中添加交互元素,如Button,来提供用户操作,那么就需要对ListView进行自定义。本篇文章将详细讲解如何在Android的ListView中添加Button,并实现其点击事件。 首先,我们要创建一个自定义的...

    scrollview与listview,viewpager共存

    解决ScrollView与ListView、ViewPager共存的问题,有以下几种策略: 1. **避免嵌套**:最佳实践是尽量避免在ScrollView中嵌套可滚动的视图。如果需要展示的内容可以分为多个部分,考虑使用多个单独的ScrollView,...

    ListView的Button点击更改Button本身背景

    同时,为了防止状态丢失,我们还需要在`getView()`中处理View的复用问题,确保每次显示的数据与数据集中的对应项匹配。 代码示例: ```java public class MyAdapter extends ArrayAdapter&lt;String&gt; { private ...

    ListView中嵌入Button ,ListView的item与Button的click事件分别被响应,同时还实现了类似Digg的item点击效果

    在实际应用中,我们经常需要在ListView的每一项(item)中嵌入其他组件,如Button,以实现更丰富的交互功能。本示例中,我们将探讨如何在ListView中嵌入Button,并处理Button的点击事件,同时确保ListView item自身...

    解决ListView 和 ScrollView 共存冲突的问题

    总之,解决ListView和ScrollView共存问题的关键在于理解它们的滚动机制,并根据具体需求选择合适的方法。通常,尽量避免直接嵌套,而是利用RecyclerView的灵活性和NestedScrollView的嵌套滚动特性。对于复杂的布局...

    ScrollView中嵌套ListView,还可以嵌套多个listview 解决无法共存问题

    ScrollView中嵌套ListView,还可以嵌套多个listview 解决无法共存问题。放到项目中可以直接用

    Android listview和button点击事件冲突问题解决方法

    通过这种方式,我们有效地解决了ListView与Button点击事件冲突的问题,使用户在点击ListView项时,只触发ListView的点击事件,而不会误触到Item中的Button。当然,如果你遇到其他复杂的交互需求,可能还需要结合使用...

    android listview 中button 事件处理

    本文用两种方法BaseAdapter 和SimpleAdapter分别实现三种情况。listview中有button事件的时候,针对不同的需求,响应不同的事件。只实现响应listview的点击事件。只响应listview中的button事件。两个事件都需要。

    ListView和Button点击事件冲突处理

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表,而Button则是实现用户交互的基本元素。当这两种控件结合使用时,有时会出现点击事件的冲突问题,导致按钮的点击事件无法正常触发或者ListView的...

    item中 button共存问题

    标题"item中 button共存问题"和描述指出,这涉及到如何在ListView的每个Item布局中正确地放置并管理Button,同时确保它们的功能正常且不会引发冲突。以下是对这个主题的详细讨论: 首先,我们需要理解ListView的...

    listview的事件处理

    本篇文章将深入探讨ListView的事件处理,特别是如何处理ListView与Button共存时焦点问题,以及在Adapter中实现接口来响应按钮点击,改变ListView中的数据。 首先,我们来解决“listview与button共存抢夺焦点问题”...

    android ViewPager 和 listview的共存问题

    通过分析这个示例,我们可以更深入地理解如何在实际项目中处理ViewPager和ListView的共存问题。实践是最好的老师,建议对这个示例进行研究和调试,以便掌握这些技巧。 总之,虽然ViewPager和ListView的共存带来了...

    ListView上给Button增加开关

    ListView通过Adapter来绑定数据和视图,Adapter是连接数据源与ListView的桥梁。当数据源发生变化时,Adapter会通知ListView进行相应的更新。因此,我们的Button开关状态也应存储在数据源中,以便于适配器能够正确地...

    ListView的基本使用带Button

    Adapter是连接ListView与数据源的桥梁。这里我们使用BaseAdapter的子类,并重写其中的方法,如`getView()`,以返回每个条目的视图: ```java public class MyAdapter extends BaseAdapter { private Context ...

Global site tag (gtag.js) - Google Analytics