1. 程式人生 > >ListView實現Item中關於點選事件的例子

ListView實現Item中關於點選事件的例子

場景

場景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();
    }
}