Android开发中回调方法的简单应用

“回调/回调方法”这个词语对我们程序员来说肯定不陌生。在Android的学习及开发过程中,我们经常会听到也会用到“回调(回调方法)”这个词,那么什么是回调呢:在类A中定义了一个方法,这个方法中用到了一个接口(Interface)和该接口中的方法,但是这个方法方法没有具体的实现,需要在类B中去实现,类B实现该方法具体业务处理后,再传递给A类,供A类去调用,这种机制就称为回调。A来B去听起来有点拗口,下面我们用个简单的例子来实现。

我们在Activity中定义了一个ListView列表,列表的每一Item上有一个按钮Button,我们本可以在ListView的适配器类中直接实现Button的点击事件,但是我们没有,我们而是定义了个接口(Interface),调用接口中定义的方法,而方法本身是在Activity中实现的,再传递给ListView的Item,就实现了对Item上Button的点击事件。为什么可以直接在适配器为右点击操作,又何要无缘无故增加接口呢?一般情况下我们不需要这样操作,但很多时候我们要对数据进行灵活处理,如果直接在Item中实现点击的话达不到效果,用回调操作就显示很方便。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

------------------小例子之xml-----------------------------------

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#f0f0f0" >

<ListView

android:id="@+id/test_lv"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:divider="@null"

android:scrollbars="none">

</ListView>

</RelativeLayout>

--------------------listView的item布局----------------------

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#ffffff" >

<TextView

android:id="@+id/item_name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_centerInParent="true"

android:layout_marginLeft="10dp" />

<Button

android:id="@+id/item_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_centerInParent="true"

android:layout_marginRight="10dp"

android:text="点击我" />

</RelativeLayout>

--------------------Activity-------------------------------------------

public class MainActivity extends ActionBarActivity implements ITestImpl {

private ListView mTestLv;

private TestAdapter mAdapter;

private ArrayList<String> dataList;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initData();

initViewsById();

}

private void initViewsById() {

mTestLv = (ListView) findViewById(R.id.test_lv);

mAdapter = new TestAdapter(this, dataList, this);

mTestLv.setAdapter(mAdapter);

}

private void initData() {

dataList = new ArrayList<String>();

for (int i = 0; i < 10; i++) {

dataList.add("第" + i + "行数据");

}

}

@Override

public void onItemDo(int position) {

int index = position;

Toast.makeText(MainActivity.this, "您点击的是第" + index + "行", Toast.LENGTH_SHORT).show();

}

}

----------适配器---------------------------

ublic class TestAdapter extends BaseAdapter {

private Context context;

private ArrayList<String> dataList;

private ITestImpl mTestImpl;

public TestAdapter(Context context, ArrayList<String> dataList, ITestImpl mTestImpl) {

this.context = context;

this.dataList = dataList;

this.mTestImpl=mTestImpl;

}

@Override

public int getCount() {

return dataList.size();

}

@Override

public Object getItem(int position) {

return dataList.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(final int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

if (null == convertView) {

holder = new ViewHolder();

convertView = LayoutInflater.from(context).inflate(R.layout.test_item, null);

holder.tv = (TextView) convertView.findViewById(R.id.item_name);

holder.btn = (Button) convertView.findViewById(R.id.item_btn);

convertView.setTag(holder);

}else{

holder=(ViewHolder) convertView.getTag();

}

holder.tv.setText(dataList.get(position));

holder.btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//此处我们利用回调方法,在Activity中来操作

mTestImpl.onItemDo(position);

}

});

return convertView;

}

public class ViewHolder {

private TextView tv;

private Button btn;

}

}

----------定义的接口--------------------------------

public interface ITestImpl {

void onItemDo(int position);

}

不过现在Android组件间通信库框架如EventBus的应用,很时候不用自己实现回调,也能实现我们想要的效果,而且更方便更有效。

时间: 2024-11-06 03:34:54

Android开发中回调方法的简单应用的相关文章

android开发中的5种存储数据方式

数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstance State保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整

Android开发中,那些让你觉得相见恨晚的方法、类或接口

本篇文章内容提取自知乎android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常见.大多数的函数自己还是见过的,这里记录一下备忘.同时呢,也推荐一个github项目,里面记录了自己日常开发中见过的比较有用的东西开发中常用的工具.链接 Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方法g

在Android开发中,定时器一般有以下3种实现方法

在Android开发中,定时器一般有以下3种实现方法: 原文地址http://www.360doc.com/content/12/0619/13/87000_219180978.shtml 一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方法 下面逐一介绍: 一.采用Handle与线程的sleep(long)方法 Handler主要用来处理接受到的

android开发中监听器的三种实现方法(OnClickListener)

Android开发中监听器的实现有三种方法,对于初学者来说,能够很好地理解这三种方法,将能更好地增进自己对android中监听器的理解. 一.什么是监听器. 监听器是一个存在于View类下的接口,一般以On******Llistener命名,实现该接口需要复写相应的on****(View v)方法(如onClick(View v)). 二.监听器的三种实现方法 (以OnClickListener为例) 方法一:在Activity中定义一个内部类继承监听器接口(这里是OnClickListener

android开发中关于继承activity类中方法的调用

android开发中关于继承activity类中的函数,不能在其他类中调用其方法. MainActivity.java package com.example.testmain; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState)

Android开发中使用七牛云存储进行图片上传下载

Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了.可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端S

由浅入深讲解android开发中listview的性能优化

ListView是一种可以显示一系列项目并能进行滚动显示的View.在每行里,既可以是简单的文本,也可以是复杂的结构.一般情况下,你都需要保证ListView运行得很好(即:渲染更快,滚动流畅).在接下来的内容里,我将就ListView的使用,向大家提供几种解决不同性能问题的解决方案. 如果你想使用ListView,你就不得不使用ListAdapter来显示内容.SDK中,已经有了几种简单实现的Adapter: ·         ArrayAdapter<T> (显示数组对象,使用toStr

MVP模式在Android开发中的最佳实践

这篇文章拖了好久了,一直存在草稿箱里没有继续写,趁今天有空,撸撸完. 回想一下,你刚刚学习Android的时候,总会看到一些书上写着,Android使用的是MVC模式,Activity就是一个Controller,或许那个时候,你没有什么深刻的体会.随着经验的积累.你发现,Activity既是Controller,掌管着许许多多的业务逻辑,同时它也作为View的一部分,控制着视图层的显示.久而久之,这个Controller便显得过于重,职责不再那么单一. 于是,再后来,为了使Activity的职

Android开发中无处不在的设计模式——动态代理模式

继续更新设计模式系列,写这个模式的主要原因是最近看到了动态代理的代码. 先来回顾一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式--Builder模式 - Android开发中无处不在的设计模式--观察者模式 - Android开发中无处不在的设计模式--原型模式 - Android开发中无处不在的设计模式--策略模式 动态代理模式在Java WEB中的应用简直是随处可见,尤其在Spring框架中大量的用到了动态代理:算是最重要