假设一个场景,在ListView的Item中,点击"+"按钮加入该item的商品到购物车中.给予的解决方案是: 在Adapter中定义一个回调接口,在Activity中实现该接口,从而实现对点击事件的响应。

这个比较简单,我先直接上代码,稍后会稍微说下一些注意事项。

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 MyClickListener mListener;

//自定义接口,用于回调按钮点击事件到Activity

public interface MyClickListener{

public void clickListener(View v);

}

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(this);

holder.button.setTag(position);

return convertView;

}

public class ViewHolder {

public TextView textView;

public Button button;

}

//响应按钮点击事件,调用子定义接口,并传入View

@Override

public void onClick(View v) {

mListener.clickListener(v);

}

}

2.然后是Acitvity中的代码:

package com.naple.listvieweventdemo;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ListView;

import android.widget.Toast;

import com.ivan.adapter.ContentAdapter;

import com.ivan.adapter.ContentAdapter.MyClickListener;

import com.ivan.listvieweventcallback.R;

//MainActivity需要实现自定义接口

public class MainActivity extends Activity implements MyClickListener {

// 模拟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));

}

/**

* 接口方法,响应ListView按钮点击事件

*/

@Override

public void clickListener(View v) {

// 点击之后的操作在这里写

Toast.makeText(

MainActivity.this,

"listview的内部的按钮被点击了!,位置是-->" + (Integer) v.getTag() + ",内容是-->"

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

Toast.LENGTH_SHORT).show();

}

}

实现的步骤(以下代码片段都可以在上面的代码中找到):

Adpater中:

实现(implements) OnClickListener 方法

public class ContentAdapter extends BaseAdapter implements OnClickListener

自定义接口(MyClickListener),用于回调按钮点击事件到Activity

private MyClickListener mListener; //自定义接口,用于回调按钮点击事件到 Activity public interface MyClickListener{ public void click(View v); }

有参的构造方法

public ContentAdapter(Context context, List contentList, MyClickListener listener) {

mContentList = contentList;

mInflater = LayoutInflater.from(context);

mListener = listener;

}

在实现的 void onClick(View v) 方法 中调用子定义接口,传入View

public void onClick(View v) { mListener.click(v); }

最后 控件增加点击事件

button.setOnClickListener(this);

记住 一定要setTag不然会报空指针

button.setTag(position);

Activity中

实现自定义的接口(implements) MyClickListener 方法

public class MainActivity extends Activity implements MyClickListener

实例化ContentAdapter类,并传入实现类

new ContentAdapter(this, contentList, this)

在实现的自定义接口的 void clickListener(View v) 方法

public void clickListener(View v) { // 点击控件要实现的操作在这里写 }

这种方法是使用接口实现的回调。

还有一种是使用抽象类回调。

该方法需要自己在adapter中写一个用于回调的抽象类

public static abstract class MyClickListener implements View.OnClickListener {

//基类的onClick方法

@Override

public void onClick(View v) {

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

}

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

}

然后

在activity中实现

//实现类,响应按钮点击事件

private MyClickListener mListener = new MyClickListener() {

@Override

public void myOnClick(int position, View v) {

}

};

其他的和接口回调一样使用

Tips:两种方式的区别在于,抽象类在Activity中实现的时候,只能定义一个成员变量来实现,不能由Activity直接实现,因为Java不支持多继承。而接口既可以由Activity直接实现,也可以由其成员变量来实现。

android adapter点击事件,Activity中响应Adapter的点击回调事件相关推荐

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

    转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在 ...

  2. html增加点击进入,html中实现回车或点击进入-----Mr.Zhang

    首先,允许我这么称呼它们两个为兄弟.之所以这么称呼,是因为它们之间执行的是相同的任务----- 点击按钮. 然而,它们也有不同之处,次不同之处又使得它们貌似有些调用的意思. 接下来,让我来给大家说一下 ...

  3. Android之解决在非Activity中使用startActivity

    今天遇到一个问题就是,如何在非activity里面使用startActivity(); 解决办法如下. 需要我们有context intent.addFlags(Intent.FLAG_ACTIVIT ...

  4. html下拉框onchange事件,javascript 中select标签上放入onchange事件的两种方式分享

    摘要: 下文讲述在html标签select上放入onchange事件的方式分享,如下所示: 例1: maomao365.com js select上直接使用onchange的方法 function s ...

  5. Android中的事件处理之点击事件

    在 Android 的图形界面(UI)开发中,有两个非常重要的内容∶一个是控件的布局,另个就是控件的事件处理.Android中的常用事件有点击事件.长按事件.触摸事件.焦点事件.按键事件-下拉列表的选 ...

  6. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  7. activity中获取fragment布局_安卓开发入门教程Fragment

    什么是Fragment Activity是整个看到的界面,而Activity则可以继续分割出多个Fragment. Fragment最初是为了在平板电脑充分利用空间,但是手机端也经常使用,主要目的是共 ...

  8. Android入门(五) | Activity 的生命周期

    文章目录 Activity 的状态及生命周期 实现管理生命周期 FirstActivity SecondActivity DialogActivity 运行结果 旧活动被回收了还能返回吗? Activ ...

  9. 事件处理程序中event参数的传递

    问题 今天突然要维护一个老古董的项目,里面大部分都是原生js和jquery,用vue之类多了,这些都有些生疏... 代码中有一个HTML事件处理程序,<button onclick=" ...

最新文章

  1. mfc获取鼠标在其他窗口中坐标_C井编程,稍加修改,将之前“会跑的按钮”改成“会跑的窗口”...
  2. SQLSTATE[HY000] [2002] 乱码解决方法
  3. 判定重大风险有哪几种_化工生产安全管理信息化平台可以解决哪些重大问题
  4. codeforces 850 A
  5. 友盟分享小程序_在线学习应用“小打卡”小程序分享
  6. Laravel 配置
  7. java中getup用法_你还在 Java 代码中写 set/get 方法?赶快试试这款插件吧!
  8. php ci xss_clean,php – codeigniter 2以及如何为TinyMCE禁用xss
  9. 浪潮信息能制造超级计算机吗,浪潮信息为中国航天探索事业出力 高性能计算技术领衔...
  10. Google退出中国
  11. MATLAB图像处理(一)——计算机图形学之图像形状识别
  12. Java开发者,我到底要不要学大数据开发?
  13. 移动端图形化报表界面设计_移动端报表设计-帆软
  14. Android Studio使用AIDL技术进行SDK开发
  15. 三个月通过信息系统项目管理师经验帖(2021年11月,新鲜出炉,高项详解)
  16. 四十岁想跳槽,年龄是最大的障碍吗?
  17. 【城北徐公之机器学习】感知机模型
  18. 5G室内覆盖面临四大挑战,如何破?
  19. 【狂神说Java】Docker最新超详细版教程通俗易懂 - 学习笔记
  20. 马斯克喊话员工:淡化病毒影响吧 车祸都比它危险

热门文章

  1. php.ini中文翻译-转载
  2. CSS的一个小案例——模拟soso搜搜导航器
  3. CT一般扫描参数_CT胶片上那些与剂量相关的参数!
  4. 基于Flink百亿数据实时去重
  5. 订单业务流程图(仿淘宝)
  6. 洛谷1373小a和uim之大逃离
  7. 对于javaScript设计模式的认知与学习
  8. 工程技术x计算机科学,TOP期刊Transactions on Industrial Electronics(TIE),投稿流程介绍
  9. android基础 [超级详细android常用控件解析(ScollView控件,ProgressBar进度条,PopupWindow控件)]
  10. HTML_个人简历表