Android中的ListView响应item内部按钮点击事件

ListView可以说是我们在实际开发中最常用到的控件了。可以说每一个app都需要用到listview来显示列表,如果我们需要点击listView的不同按钮跳转到不同页面,具体逻辑在重写的onItemClick()方法中实现,这里不多说,不了解listView基本用法的小伙伴们可以去百度一下listView的基本用法,而button的点击事件实现的具体逻辑在重写的onClick()方法中实现。那么当我们要实现单个item的点击事件应该怎么实现呢?比如我们购物时,单个物品的点击+和-,表示选择数量,即响应item的内部点击事件,同时又不能和整体item的点击事件冲突。当然我们可以直接在adpter的getView中直接做内部按钮的点击处理,但是这样写的化,按钮一多的话,就显得整体代码比较拥挤,而且把Activity的点击事件放在adpter中,用起来有时会不方便。为此,我们可以使用接口回调的方式进行处理,让其在Activity中去响应,增加其灵活性。

代码如下:
adapter:

import java.util.List;  

import android.content.Context;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.widget.BaseAdapter;  
import android.widget.Button;  
import android.widget.TextView;  

import java.util.List;  

import android.content.Context;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.widget.BaseAdapter;  
import android.widget.Button;  
import android.widget.TextView;  

public class ListItemAdapter extends BaseAdapter implements OnClickListener {  
    private List<String> mList;  
    private Context mContext;  
    private InnerItemOnclickListener mListener;  

    public ListItemAdapter(List<String> mList, Context mContext) {  
        this.mList = mList;  
        this.mContext = mContext;  
    }  

    @Override  
    public int getCount() {  
        // TODO 自动生成的方法存根  
        return mList.size();  
    }  

    @Override  
    public Object getItem(int position) {  
        // TODO 自动生成的方法存根  
        return mList.get(position);  
    }  

    @Override  
    public long getItemId(int position) {  
        // TODO 自动生成的方法存根  
        return position;  
    }  

    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
        final ViewHolder viewHolder;  
        if (convertView == null) {  
            viewHolder = new ViewHolder();  
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item,  
                    null);  
            viewHolder.bt1 = (Button) convertView.findViewById(R.id.bt1);  
            viewHolder.bt2 = (Button) convertView.findViewById(R.id.bt2);  
            viewHolder.tv = (TextView) convertView.findViewById(R.id.tv);  
            convertView.setTag(viewHolder);  
        } else {  
            viewHolder = (ViewHolder) convertView.getTag();  
        }  
        viewHolder.bt1.setOnClickListener(this);  
        viewHolder.bt2.setOnClickListener(this);  
        viewHolder.bt1.setTag(position);  
        viewHolder.bt2.setTag(position);  
        viewHolder.tv.setText(mList.get(position));  
        return convertView;  
    }  

    public final static class ViewHolder {  
        Button bt1, bt2;  
        TextView tv;  
    }  

    interface InnerItemOnclickListener {  
        void itemClick(View v);  
    }  

    public void setOnInnerItemOnClickListener(InnerItemOnclickListener listener){  
        this.mListener=listener;  
    }  

    @Override  
    public void onClick(View v) {  
        mListener.itemClick(v);  
    }  
}  

MainActivity.java

import java.util.ArrayList;  
import java.util.List;  

import com.example.listitemdemo.ListItemAdapter.InnerItemOnclickListener;  
import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.widget.AdapterView;  
import android.widget.AdapterView.OnItemClickListener;  
import android.widget.ListView;  

public class MainActivity extends Activity implements InnerItemOnclickListener,  
        OnItemClickListener {  
    private ListView mList;  
    private List<String> mDataList;  
    private ListItemAdapter mAdapter;  
    private static final String[] Datas = { "北京", "上海", "广州", "深圳", "苏州", "南京",  
            "武汉", "长沙", "杭州", "长春", "无锡", "常州", "绍兴", "嘉兴", "衢州" };  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        initView();  
        mDataList = new ArrayList<String>();  
        for (int i = 0; i < Datas.length; i++) {  
            mDataList.add(Datas[i]);  
        }  
        mAdapter = new ListItemAdapter(mDataList, this);  
        mAdapter.setOnInnerItemOnClickListener(this);  
        mList.setAdapter(mAdapter);  
        mList.setOnItemClickListener(this);  
    }  

    private void initView() {  
        mList = (ListView) findViewById(R.id.lv);  
    }  

    @Override  
    public void itemClick(View v) {  
        int position;  
        position = (Integer) v.getTag();  
        switch (v.getId()) {  
        case R.id.bt1:  
            Log.e("内部item--1-->", position + "");  
            break;  
        case R.id.bt2:  
            Log.e("内部item--2-->", position + "");  
            break;  
        default:  
            break;  
        }  

    }  

    @Override  
    public void onItemClick(AdapterView<?> parent, View view, int position,  
            long id) {  
        Log.e("整体item----->", position + "");  
    }  

}  

我们在ListItemAdapter中自定义一个接口以及抽象方法itemClick(),在MainActivity中实现此接口从而重写itemClick(),并且通过调用setOnInnerItemOnClickListener(InnerItemOnclickListener listener)将实现此接口的类的对象传入,当我们点击按钮时会调用OnClick()方法,在此方法里面会调用子类重写的itemClick()方法,而方法里的参数v指的就是点击的button。所以我们只要在重写的itemClick()方法 里实现点击后的逻辑即可。
整体效果:
这里写图片描述

  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值