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<String> mContentList;
  private LayoutInflater mInflater;
  private Callback mCallback; 

  /**
   * 自定义接口,用于回调按钮点击事件到Activity
   * @author Ivan Xu
   * 2014-11-26
   */
  public interface Callback {
    public void click(View v);
  } 

  public ContentAdapter(Context context, List<String> 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<String> 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<String>();
    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;
  } 

  /**
   * 响应ListView中item的点击事件
   */
  @Override
  public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
    Toast.makeText(this, "listview的item被点击了!,点击的位置是-->" + position,
        Toast.LENGTH_SHORT).show();
  } 

  /**
   * 接口方法,响应ListView按钮点击事件
   */
  @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<String> mContentList;
  private LayoutInflater mInflater;
  private MyClickListener mListener; 

  public ContentAdapter(Context context, List<String> 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;
  } 

  /**
   * 用于回调的抽象类
   * @author Ivan Xu
   * 2014-11-26
   */
  public static abstract class MyClickListener implements OnClickListener {
    /**
     * 基类的onClick方法
     */
    @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<String> 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<String>();
    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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android防止按钮过快点击造成多次事件的解决方法

    问题 onClick事件是Android开发中最常见的事件.比如,一个submitButton,功能是点击之后会提交一个订单, 则一般代码如下,其中submitOrder()函数会跳转到下一页进行处理 : //代码0 submitButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { submitOrder(); } }); 正常情况下这段代码是没什么问题的,但是Andro

  • 实例详解Android解决按钮重复点击问题

    为了防止用户或者测试MM疯狂的点击某个button,写个方法防止按钮连续点击.具体实例代码如下所示: public class BaseActivity extends Activity { protected boolean isDestroy; //防止重复点击设置的标志,涉及到点击打开其他Activity时,将该标志设置为false,在onResume事件中设置为true private boolean clickable=true; @Override protected void on

  • 基于Android实现点击某个按钮让菜单选项从按钮周围指定位置弹出

    Android Material Design:PopupMenu Android Material Design 引入的PopupMenu类似过去的上下文菜单,但是更灵活. 如图所示: 现在给出实现上图PopupMenu的代码. 本例是一个普通的Button触发弹出PopupMenu. 测试的MainActivity.java : package zhangphil.materialdesign; import android.app.Activity; import android.os.B

  • Android Button按钮的四种点击事件

    本文实例为大家分享了安卓Button按钮的四种点击事件,供大家参考,具体内容如下 第一种:内部类实现 1.xml里面先设置Button属性 <Button android:id="+@id/button1"; android:layout_width="wrap_parent"; android:layout_height="wrap_parent" android:text="按钮"/> 2.找到按钮 Butto

  • Android悬浮按钮点击返回顶部FloatingActionButton

    先看一下Android悬浮按钮点击回到顶部的效果: FloatingActionButton是Design Support库中提供的一个控件,这个控件可以轻松实现悬浮按钮的效果 首先,要在项目中使用这个悬浮按钮就要先把design这个包导入项目 gradle中加入依赖 compile 'com.android.support:design:25.0.0' 接下来就是在xml中使用: 我这里是放置一个listView模拟返回顶部 <?xml version="1.0" encodi

  • Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解

    先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几天发现知乎关注的点击效果确实赞,查了一下实现方式,刚好看到这个问题,花了一天时间终于把这个效果实现了,现在来回答一下,很不幸,楼上各位的答案都不全对,且听我一一道来. 首先,我先详细观察了一些知乎的效果,其中有一个很神奇的地方,如图: 注意看第二张图,这个圆形在扩散的时候,圆形底下的字还在,而且新的

  • Android点击按钮返回顶部实现代码

    点击按钮返回顶部,直接上代码吧 布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent

  • Android实现按钮点击效果

    1.首先创建一个按钮 <Button android:id="@+id/click" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="点击变色" android:background="@drawable/btn_st" android:gravity="center&

  • Android模拟开关按钮点击打开动画(属性动画之平移动画)

    在Android里面,一些炫酷的动画确实是很吸引人的地方,让然看了就赏心悦目,一个好看的动画可能会提高用户对软件的使用率.另外说到动画,在Android里面支持两种动画:补间动画和属性动画,至于这两种动画的区别这里不再介绍,希望开发者都能在使用的过程中体会两者的不同. 本文使用属性动画完成,说到属性动画,肯定要提到 JakeWharton大神写的NineOldAndroids动画库,如果你的app需要在android3.0以下使用属性动画,那么这个库就很有作用了,如果只需要在高版本使用,那么直接

  • Android实现点击AlertDialog上按钮时不关闭对话框的方法

    本文实例讲述了Android实现点击AlertDialog上按钮时不关闭对话框的方法.分享给大家供大家参考.具体如下: 开发过程中,有时候会有这样的需求: 点击某个按钮之后显示一个对话框,对话框上面有一个输入框,并且有"确认"和"取消"两个按钮.当用户点击确认按钮时,需要对输入框的内容进行判断.如果内容为空则不关闭对话框,并toast提示. 使用AlertDialog.Builder创建对话框时,可以使用builder.setNegativeButton和build

随机推荐