热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

android中在Activity中响应ListView内部按钮的点击事件的两种方法

最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在Adapter中响应? 对于这个问题

最近交流群里面有人问到一个问题:如何在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; 
 
  /** 
   * 自定义接口,用于回调按钮点击事件到Activity 
   * @author Ivan Xu 
   * 2014-11-26 
   */ 
  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  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 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; 
  } 
 
  /** 
   * 用于回调的抽象类 
   * @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 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  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

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


推荐阅读
  • 华为捐赠欧拉操作系统,承诺不推商用版
    华为近日宣布将欧拉开源操作系统捐赠给开放原子开源基金会,并承诺不会推出欧拉的商用发行版。此举旨在推动欧拉和鸿蒙操作系统的全场景融合与生态发展。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • MySQL 数据库连接方法
    本文介绍了如何使用 MySQL 命令行工具连接到指定的数据库。 ... [详细]
  • 在 Mac 上配置 NDK
    本文详细介绍了如何在 Mac 上配置 Android NDK,包括设置环境变量和解决常见问题的方法。 ... [详细]
  • 如何解决8080端口被占用问题
    本文介绍了如何通过命令行和任务管理器查找并终止占用8080端口的进程,以确保该端口能够正常使用。 ... [详细]
  • Excel 数据分析基础
    Excel 是数据分析中最基本且强大的工具之一,具备多种实用功能和操作方法。本文将简要介绍 Excel 的不同版本及其兼容性问题,并探讨在处理大数据时的替代方案。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文详细介绍了 Charles 工具的下载、安装、配置及使用方法,特别针对 HTTP 和 HTTPS 协议的数据抓取进行了说明。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • 本文介绍了 AngularJS 中的 $compile 服务及其用法,通过示例代码展示了如何使用 $compile 动态编译和链接 HTML 元素。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 本文详细介绍了 Python 中 thread 和 threading 模块的使用方法,并提供了丰富的示例和解释。文章首发于 HURUWO 的博客小站,本平台进行同步备份发布。如遇图片加载失败或有任何疑问,欢迎前往原博客留言。 ... [详细]
author-avatar
惜靜吾_919
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有