天天看點

android listview裡item添加一個按鈕點選事件,android中在Activity中響應ListView内部按鈕的點選事件的兩種方法...

最近交流群裡面有人問到一個問題:如何在Activity中響應ListView内部按鈕的點選事件,不要在Adapter中響應?

對于這個問題,我最初給他的解答是,在Adapter中定義一個回調接口,在Activity中實作該接口,進而實作對點選事件的響應。

下班後思考了一下,覺得有兩種方式都能比較好的實作:使用接口回調和使用抽象類回調。

正好可以複習一下接口和抽象類的差別,于是寫了兩個Demo:

1.使用接口回調:

Adapter類

package com.ivan.adapter;

import java.util.List;

import android.content.Context;

import android.util.Log;

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 com.ivan.listvieweventcallback.R;

public class ContentAdapter extends BaseAdapter implements OnClickListener {

private static final String TAG = "ContentAdapter";

private List mContentList;

private LayoutInflater mInflater;

private Callback mCallback;

public interface Callback {

public void click(View v);

}

public ContentAdapter(Context context, List contentList,

Callback callback) {

mContentList = contentList;

mInflater = LayoutInflater.from(context);

mCallback = callback;

}

@Override

public int getCount() {

Log.i(TAG, "getCount");

return mContentList.size();

}

@Override

public Object getItem(int position) {

Log.i(TAG, "getItem");

return mContentList.get(position);

}

@Override

public long getItemId(int position) {

Log.i(TAG, "getItemId");

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

Log.i(TAG, "getView");

ViewHolder holder = null;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item, null);

holder = new ViewHolder();

holder.textView = (TextView) convertView

.findViewById(R.id.textView1);

holder.button = (Button) convertView.findViewById(R.id.button1);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.textView.setText(mContentList.get(position));

holder.button.setOnClickListener(this);

holder.button.setTag(position);

return convertView;

}

public class ViewHolder {

public TextView textView;

public Button button;

}

//響應按鈕點選事件,調用子定義接口,并傳入View

@Override

public void onClick(View v) {

mCallback.click(v);

}

}

Activity類:

package com.ivan.listvieweventdemo;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ListView;

import android.widget.Toast;

import com.ivan.adapter.ContentAdapter;

import com.ivan.adapter.ContentAdapter.Callback;

import com.ivan.listvieweventcallback.R;

//MainActivity需要實作自定義接口

public class MainActivity extends Activity implements OnItemClickListener,

Callback {

// 模拟listview中加載的資料

private static final String[] CONTENTS = { "北京", "上海", "廣州", "深圳", "蘇州",

"南京", "武漢", "長沙", "杭州" };

private List contentList;

private ListView mListView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init();

}

private void init() {

mListView = (ListView) findViewById(R.id.listview);

contentList = new ArrayList();

for (int i = 0; i < CONTENTS.length; i++) {

contentList.add(CONTENTS[i]);

}

//

mListView.setAdapter(new ContentAdapter(this, contentList, this));

mListView.setOnItemClickListener(this);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

@Override

public void onItemClick(AdapterView> arg0, View v, int position, long id) {

Toast.makeText(this, "listview的item被點選了!,點選的位置是-->" + position,

Toast.LENGTH_SHORT).show();

}

@Override

public void click(View v) {

Toast.makeText(

MainActivity.this,

"listview的内部的按鈕被點選了!,位置是-->" + (Integer) v.getTag() + ",内容是-->"

+ contentList.get((Integer) v.getTag()),

Toast.LENGTH_SHORT).show();

}

}

2.使用抽象類回調

Adapter類:

package com.ivan.adapter;

import java.util.List;

import android.content.Context;

import android.util.Log;

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 com.ivan.listvieweventabstract.R;

public class ContentAdapter extends BaseAdapter {

private static final String TAG = "ContentAdapter";

private List mContentList;

private LayoutInflater mInflater;

private MyClickListener mListener;

public ContentAdapter(Context context, List contentList,

MyClickListener listener) {

mContentList = contentList;

mInflater = LayoutInflater.from(context);

mListener = listener;

}

@Override

public int getCount() {

Log.i(TAG, "getCount");

return mContentList.size();

}

@Override

public Object getItem(int position) {

Log.i(TAG, "getItem");

return mContentList.get(position);

}

@Override

public long getItemId(int position) {

Log.i(TAG, "getItemId");

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

Log.i(TAG, "getView");

ViewHolder holder = null;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item, null);

holder = new ViewHolder();

holder.textView = (TextView) convertView

.findViewById(R.id.textView1);

holder.button = (Button) convertView.findViewById(R.id.button1);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.textView.setText(mContentList.get(position));

holder.button.setOnClickListener(mListener);

holder.button.setTag(position);

return convertView;

}

public class ViewHolder {

public TextView textView;

public Button button;

}

public static abstract class MyClickListener implements OnClickListener {

@Override

public void onClick(View v) {

myOnClick((Integer) v.getTag(), v);

}

public abstract void myOnClick(int position, View v);

}

}

Activity類:

package com.ivan.listvieweventdemo;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ListView;

import android.widget.Toast;

import com.ivan.adapter.ContentAdapter;

import com.ivan.adapter.ContentAdapter.MyClickListener;

import com.ivan.listvieweventabstract.R;

public class MainActivity extends Activity implements OnItemClickListener {

// 模拟listview中加載的資料

private static final String[] CONTENTS = { "北京", "上海", "廣州", "深圳", "蘇州",

"南京", "武漢", "長沙", "杭州" };

private List contentList;

private ListView mListView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init();

}

private void init() {

mListView = (ListView) findViewById(R.id.listview);

contentList = new ArrayList();

for (int i = 0; i < CONTENTS.length; i++) {

contentList.add(CONTENTS[i]);

}

//執行個體化ContentAdapter類,并傳入實作類

mListView.setAdapter(new ContentAdapter(this, contentList, mListener));

mListView.setOnItemClickListener(this);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

//響應item點選事件

@Override

public void onItemClick(AdapterView> arg0, View v, int position, long id) {

Toast.makeText(this, "listview的item被點選了!,點選的位置是-->" + position,

Toast.LENGTH_SHORT).show();

}

private MyClickListener mListener = new MyClickListener() {

@Override

public void myOnClick(int position, View v) {

Toast.makeText(

MainActivity.this,

"listview的内部的按鈕被點選了!,位置是-->" + position + ",内容是-->"

+ contentList.get(position), Toast.LENGTH_SHORT)

.show();

}

};

}

兩種方式的差別在于,抽象類在Activity中實作的時候,隻能定義一個成員變量來實作,不能由Activity直接實作,因為Java不支援多繼承。而接口既可以由Activity直接實作,也可以由其成員變量來實作。

原文連結:http://blog.csdn.net/u011895534/article/details/50439547

以上就是本文的全部内容,希望對大家的學習有所幫助,也希望大家多多支援腳本之家。