ListView實現Item中關於點選事件的例子
阿新 • • 發佈:2019-02-01
場景
場景1
Item中包含若干個Button,且Button需要響應點選事件。
此時實現思路可以是通過介面回撥或者抽象類的形式來實現Button的點選事件。
場景2
Item和Item中的Button均需要響應點選事件。
此時需要在item.xml中根目錄設定屬性android:descendantFocusability=”blocksDescendants”,並且設定Button按鈕
android:focusable=”false”屬性,這樣可以同時響應item的點選事件和item中Button的點選事件。
實現方式
介面回撥
通過介面回撥實現Item中Button的點選事件,思路是在介面卡中定義一個介面,介面中定義一個抽象方法,並在介面卡中實現View.OnClickListener,在過載的onClick方法中呼叫介面中的方法,在Activity層實現介面卡中定義的介面,通過介面回撥的方式實現按鈕點選事件。
原始碼
介面卡
package com.example.a002034.listviewitemclickdemo.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import com.example.a002034.listviewitemclickdemo.R;
import java.util.ArrayList;
import java.util.List;
/**
* 使用介面回撥的方式實現button點選事件.
*
* @author xuzhuyun
*/
@SuppressWarnings("unused")
public class MyAdapter extends BaseAdapter implements View.OnClickListener {
List<String> mStringList = new ArrayList();
private Context mContext;
private Callback mCallback;
public MyAdapter(Context context, Callback callback) {
mContext = context;
mCallback = callback;
}
public void setStringList(List<String> stringList) {
mStringList = stringList;
}
public List<String> getStringList() {
return mStringList;
}
@Override
public int getCount() {
return mStringList.size();
}
@Override
public Object getItem(int i) {
return getCount() == 0 ? null : mStringList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (view == null) {
view = LayoutInflater.from(mContext).inflate(R.layout.lv_test_item, null);
viewHolder = new ViewHolder();
viewHolder.mTvItemName = view.findViewById(R.id.tv_name);
viewHolder.mBtnClick = view.findViewById(R.id.btn_click);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.mTvItemName.setText(mStringList.get(i));
viewHolder.mBtnClick.setOnClickListener(this);
viewHolder.mBtnClick.setTag(i);//儲存當前點選按鈕的位置
return view;
}
class ViewHolder {
TextView mTvItemName;
Button mBtnClick;
}
@Override
public void onClick(View view) {
mCallback.click(view);
}
/**
* 回撥介面.
*/
public interface Callback {
void click(View v);
}
}
Activity
package com.example.a002034.listviewitemclickdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.a002034.listviewitemclickdemo.adapter.MyAdapter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements MyAdapter.Callback, AdapterView.OnItemClickListener {
private ListView mListView;
private MyAdapter mMyAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = findViewById(R.id.lv_test);
List<String> mList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
mList.add("測試item" + i);
}
mMyAdapter = new MyAdapter(this, this);
mMyAdapter.setStringList(mList);
mListView.setAdapter(mMyAdapter);
mListView.setOnItemClickListener(this);
}
@Override
public void click(View v) {
int position = (int) v.getTag();
String clickItemText = mMyAdapter.getStringList().get(position);
Toast.makeText(this, "button click -->"+clickItemText, Toast.LENGTH_SHORT).show();
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(this,"listview item click -- >"
+ mMyAdapter.getStringList().get(i), Toast.LENGTH_SHORT).show();
}
}
使用抽象類回撥
定義一個抽象類繼承自View.OnClickListener,在Activity中例項化該抽象類,並在Adapter例項化的時候傳入adapter,然後Button繫結點選事件時,即可傳入該抽象類,通過抽象類完成點選事件的回撥。
原始碼
介面卡
package com.example.a002034.listviewitemclickdemo.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import com.example.a002034.listviewitemclickdemo.R;
import java.util.ArrayList;
import java.util.List;
/**
* 使用介面回撥的方式實現button點選事件.
*
* @author xuzhuyun
*/
@SuppressWarnings("unused")
public class MyAdapter2 extends BaseAdapter {
List<String> mStringList = new ArrayList();
private Context mContext;
private MyClickListener mMyClickListener;
public MyAdapter2(Context context, MyClickListener myClickListener) {
mContext = context;
mMyClickListener = myClickListener;
}
public void setStringList(List<String> stringList) {
mStringList = stringList;
}
public List<String> getStringList() {
return mStringList;
}
@Override
public int getCount() {
return mStringList.size();
}
@Override
public Object getItem(int i) {
return getCount() == 0 ? null : mStringList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (view == null) {
view = LayoutInflater.from(mContext).inflate(R.layout.lv_test_item, null);
viewHolder = new ViewHolder();
viewHolder.mTvItemName = view.findViewById(R.id.tv_name);
viewHolder.mBtnClick = view.findViewById(R.id.btn_click);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.mTvItemName.setText(mStringList.get(i));
viewHolder.mBtnClick.setTag(i);
viewHolder.mBtnClick.setOnClickListener(mMyClickListener);
return view;
}
class ViewHolder {
TextView mTvItemName;
Button mBtnClick;
}
public static abstract class MyClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
myOnClick((Integer) view.getTag(), view);
}
public abstract void myOnClick(int position, View v);
}
}
Activity
package com.example.a002034.listviewitemclickdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.a002034.listviewitemclickdemo.adapter.MyAdapter;
import com.example.a002034.listviewitemclickdemo.adapter.MyAdapter2;
import java.util.ArrayList;
import java.util.List;
public class MainActivity2 extends AppCompatActivity implements AdapterView.OnItemClickListener {
private ListView mListView;
private MyAdapter2 mMyAdapter2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = findViewById(R.id.lv_test);
List<String> mList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
mList.add("測試item" + i);
}
mMyAdapter2 = new MyAdapter2(this, mMyClickListener);
mMyAdapter2.setStringList(mList);
mListView.setAdapter(mMyAdapter2);
mListView.setOnItemClickListener(this);
}
private MyAdapter2.MyClickListener mMyClickListener = new MyAdapter2.MyClickListener() {
@Override
public void myOnClick(int position, View v) {
Toast.makeText(MainActivity2.this, "button click -- >" + mMyAdapter2.getStringList().get(position), Toast.LENGTH_SHORT).show();
}
};
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(this, "listview item click -- >" + mMyAdapter2.getStringList().get(i), Toast.LENGTH_SHORT).show();
}
}