用BaseAdapter解决Listview列表项中的子控件无法获得焦点

事由:
ListView的子列表项item具有点击触摸事件,例如OnItemClickListener()和OnItemLongClickListener()。若此时item中的子控件(例如:Button)也需要响应它的点击触摸事件:OnClickListener()。会发现,虽然可以显示出,但是无法获得焦点,点击操作被item覆盖。下面将介绍如何实现两种点击触摸事件都响应。
解决方案:
使用灵活的BaseAdapter!
1.分别创建ListView和Item布局如下:
listview.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.list.MainActivity" >
    <ListView 
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#0000FF"
        android:divider="#FF0000"
        android:dividerHeight="2dp">       
    </ListView>
</LinearLayout>

list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:orientation="horizontal"
    android:weightSum="3">
    <TextView 
        android:id="@+id/tv"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textSize="12sp"
        android:layout_weight="2"
        />
<Button 
    android:id="@+id/bt"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="A"
    android:textSize="12sp"
    android:layout_weight="1"
    android:focusable="false"  <!--去除焦点能力-->
    />
</LinearLayout>

2.存储item上的数据:

list=new ArrayList<Map<String,Object>>();   
        Map<String, Object> map=null;
        for (int i = 0; i < 20; i++) {
            map=new HashMap<String, Object>();
            map.put("text", i);
            list.add(map);
        }   

3.创建一个类继承BaseAdapter,并重写里面的方法。
当系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度。然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。也就是说,如果让getCount()返回1,那么只显示一行。而getItem()和getItemId()则在需要处理和取得Adapter中的数据时调用。对于ListView的优化,在getView(),采用covertview和viewholder。继承后的MyAdapter类如下:

public class Myadapter extends BaseAdapter {
    List<Map<String, Object>> list;
    Context context;
    LayoutInflater inflater;
    public Myadapter(Context context,List<Map<String, Object>> param) {
        // TODO Auto-generated constructor stub
        this.inflater=LayoutInflater.from(context);
        this.list=param;
        this.context=context;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }
//对getView方法的重写实现了ListView的优化。
    @Override
    public View getView(int position, View covertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder viewholder;
        if (null==covertView) {
            covertView=inflater.inflate(R.layout.list_item, null);
            viewholder=new ViewHolder();
            viewholder.tv=(TextView) covertView.findViewById(R.id.tv);
            viewholder.bt= (Button) covertView.findViewById(R.id.bt);
            covertView.setTag(viewholder);  //绑定iewholder对象
        }else{
            viewholder=(ViewHolder) covertView.getTag();
        }
        viewholder.tv.setText(list.get(position).get("text").toString());
        viewholder.bt.setOnClickListener(new OnClickListener() {   //可以发现对button的触发事件被放在这里处理

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "你点击了按钮", Toast.LENGTH_SHORT).show();
            }
        });
        return covertView;
    }
    private static class ViewHolder{
        private TextView tv;
        private Button bt;

    }
}

4.在activity中绑定adapter,并点击响应item的触摸事件:

        mlistview.setAdapter(adapter);
        mlistview.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "点击ListView的列表项", Toast.LENGTH_SHORT).show();
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值