1. 程式人生 > >Android中的ListView響應item內部按鈕點選事件

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()方法 裡實現點選後的邏輯即可。
整體效果:
這裡寫圖片描述