视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
【Android】ListView与Button的共存问题解决
2025-09-29 05:04:10 责编:小OO
文档
【Android】ListView与Button的共存问题解决

ListView 和 其它能触发点击事件的widget无法一起正常工作的原因是加入其它widget后,ListView的itemclick事件将无法触发,被其它widget的click事件屏蔽。

 

首先,说明一下,ListView中每一行包括以下三项:

 

   一个ImageView, 一个TextView,一个ImageButton,依次排开。

 

以下是layout的内容,分为两部分:

res/layout/main.xml

     android:layout_width="fill_parent" android:layout_height="fill_parent"

     android:padding="10dip" android:orientation="vertical">

         android:layout_height="fill_parent" />

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

res/layout/lvitem.xml

注意:

android:descendantFocusability="blocksDescendants"

android:focusable="false"

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

   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" >

   

       android:id="@+id/ItemImage"

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:padding="5dip"

/>

   

   

      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"

/>

   

       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"

/>

     

    

接下来,我们看看继承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> remoteWindowItem = new ArrayList>();

         for(int i=0;i<10;i++)

         {

             HashMap map = new HashMap();

             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", "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> mAppList;

     private LayoutInflater mInflater;

     private Context mContext;

     private String[] keyString;

     private int[] valueViewID;

     private buttonViewHolder holder;

     

     public lvButtonAdapter(Context c, ArrayList> 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 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);

         }

     }

}下载本文

显示全文
专题