消息传递之接口回调

Android实现消息传递的基本方式有三种,分别是广播消息、Handler线程间通信、接口回调,这几种方法都是最基本的,现在GitHub上可能还有一些像EventBus等优秀的事件传递框架,既可以降低程序的耦合性,又可以更加方便优雅的进行消息的传递,今天通过一些小案例,举例一下接口回调在开发中的应用。

现在考虑这样一个场景,一个列表,点击列表的不同Item,然后获取Item的相关信息进行显示,或者执行别的业务逻辑均可,就是说要把Adapter中的点击事件传递到Activity中,然后接到消息后在Activity中执行一些别的业务逻辑。

定义接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.toby.myapplication;

/**
* author : toby
* e-mail : 13128826083@163.com
* time : 2018/6/20
* desc :
*/

public interface OnItemClicked {

void showMessage(int index);

}

在Activity中实现接口

1
2
3
4
5
6
7
private class OnItemClickedIml implements OnItemClicked {
@Override
public void showMessage(int index) {
Toast.makeText(ListViewActivity.this, dataList.get(index), Toast.LENGTH_SHORT).show();
Log.d("------>", "----showMessage-->" + dataList.get(index));
}
}

Adapter中的相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package com.example.toby.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

/**
* author : toby
* e-mail : 13128826083@163.com
* time : 2018/6/20
* desc :
*/

public class MyAdapter extends BaseAdapter {

private Context context;
private List<String> dataList;
private OnItemClicked onItemClicked;

public MyAdapter(Context context, List<String> dataList, OnItemClicked onItemClicked) {
this.context = context;
this.dataList = dataList;
this.onItemClicked = onItemClicked;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public int getCount() {
return dataList.size();
}

@Override
public Object getItem(int position) {
return dataList.get(position);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_list_view_layout, null);
viewHolder = new ViewHolder();
viewHolder.layoutItem = convertView.findViewById(R.id.layoutItem);
viewHolder.txtView = convertView.findViewById(R.id.txtView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.txtView.setText(dataList.get(position));
viewHolder.layoutItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClicked.showMessage(position);
}
});
return convertView;
}

protected static class ViewHolder {
LinearLayout layoutItem;
TextView txtView;
}

}

初始化Adapter与ListView,并将接口的引用传递给Adapter,然后在Adapter中的点击事件中调用接口方法,并把相关的参数position传递进来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.example.toby.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class ListViewActivity extends AppCompatActivity {

private ListView listView;
private MyAdapter adapter;
private List<String> dataList;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
listView = findViewById(R.id.listView);
initData();
}

private void initData() {
if (dataList == null) {
dataList = new ArrayList<>();
} else {
dataList.clear();
}
for (int i = 0; i < 20; i++) {
dataList.add("长河老表" + i);
}
adapter = new MyAdapter(this, dataList, new OnItemClickedIml());
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}

private class OnItemClickedIml implements OnItemClicked {
@Override
public void showMessage(int index) {
Toast.makeText(ListViewActivity.this, dataList.get(index), Toast.LENGTH_SHORT).show();
Log.d("------>", "----showMessage-->" + dataList.get(index));
}
}

}

这样一来,点击ListView的相关Item后,在Adapter通过即接口回调把点击事件及相关参数回传到Activity中的接口实现就已经完成了。