这次讲的是activity通过实现接口来回调adapter中的数据
我遇到过一个问题才促使我写了这样一篇文章,第一次写,如果写的不好多多谅解。
在这我把我的问题简化了:点击listview的adapter中子布局里的控件时,使activity里的控件发生变化,如图:
红色部分是一个TextView,下边的是一个listView,而回调实现的是当点击某一个测试时,红色部分显示的则是该测试按钮前面的文字,实现效果图:
那么怎样实现回调呢?
首先写一个回调接口,接口里边写一个抽象方法,抽象方法的参数是你想回调的数据
然后在Adapter里声明你写的回调接口,并写一个set方法,在set方法里给声明的回调接口赋值;
然后在小布局里调用接口中的抽象方法。
最后是在activity里调用adapter里的set方法。
这里回调实际上是在Activity中实现回调接口中的抽象方法,当在listView的子布局中运行该抽象方法时,实际上运行的是在Activity中实现的抽象方法,其实这也是多态的一种。
在这里讲的可能不是很清晰,直接上代码:
MainActivity:
package com.example.user.exam;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private ListView mListView;
private ListViewAdapter adapter;
private List<String> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
mTextView = (TextView) findViewById(R.id.textview);
mListView = (ListView) findViewById(R.id.listview);
adapter = new ListViewAdapter(list,this);
//在adapter里写的set方法,在Activity里调用
adapter.setOnInItemClickListener(new OnInItemClickListener() {
@Override
public void onInItemClick(int position) {
mTextView.setText("这是第" + (position + 1) + "项");
}
});
mListView.setAdapter(adapter);
}
private void initData() {
for (int i = 0; i < 10; i++) {
list.add("这是第" + (i + 1) + "项");
}
}
}
activity_main:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/holo_red_dark"
android:gravity="center"
android:textColor="@android:color/black"
android:textSize="20sp" />
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
ListViewAdapter:
package com.example.user.exam;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;
public class ListViewAdapter extends BaseAdapter {
private List<String> list;
private LayoutInflater mInflater;
//声明回调接口
private OnInItemClickListener onInItemClickListener;
public ListViewAdapter(List<String> list, Context context) {
this.list = list;
mInflater = LayoutInflater.from(context);
}
//回调接口的set方法
public void setOnInItemClickListener(OnInItemClickListener onInItemClickListener) {
this.onInItemClickListener = onInItemClickListener;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.adapter_listview, parent, false);
holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.txt);
holder.button = (Button) convertView.findViewById(R.id.test);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(list.get(position));
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//子布局里调用回调接口中的抽象方法
onInItemClickListener.onInItemClick(position);
}
});
return convertView;
}
class ViewHolder {
TextView textView;
Button button;
}
}
adapter_listview:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:textColor="@android:color/black"
android:textSize="20sp" />
<Button
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:text="测试" />
</RelativeLayout>
OnInItemClickListener:
//回调接口(自己写的)
public interface OnInItemClickListener {
void onInItemClick(int position);
}