android 在activity 监听自定义adapter
1概述
在activity中会使用到adapter,adapter一般为自定义一个MyAdapter继承BaseAdapter类,有时使用场景就是在activity中监听adapter中按钮的点击事件,但是在activity中直接获取adapter的控件使用setOnClickListener方法不能生效,在网上找了下没找到解决方式,最后换种方式成功了,在此记录一下。
2.各个文件
tab.xml文件 activity关联的视图xml文件
tab_item.xml文件 adapter关联的视图xml文件
MyActivity文件 activity文件
MyAdapter文件 Adapter文件
首先说一下:按钮的点击事件可以在activity中设置(即MyActivity获取tab的button进行设置),也可以在Adapter中设置(即MyAdapter获取tab_item的button进行设置),在activity中设置的只能设置Adapter组件外的按钮(例如activity获取tab_item的button进行设置会不生效)。
下列将会使用3种方式交互,使用处有注解标示需要可自取使用
1.在adapter中获取activity传递的值并显示
2.在activity获取adapter中选中的值,进行提交
3.在activity中监听adapter中的点击事件,并作出相应的操作
tab.xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/tab"
android:layout_height="match_parent"
tools:ignore="MissingDefaultResource">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/time"
android:layout_width="125dp"
android:layout_height="match_parent"
android:text="日期"
android:textSize="22sp" />
<TextView
android:id="@+id/name"
android:layout_width="125dp"
android:layout_height="match_parent"
android:text="名称"
android:textSize="22sp" />
<TextView
android:id="@+id/operating"
android:layout_width="125dp"
android:layout_height="match_parent"
android:text="操作"
android:textSize="22sp" />
</LinearLayout>
<Button
android:id="@+id/submit"
android:layout_width="80dp"
android:layout_height="35dp"
android:layout_weight="1"
android:text="提交"
android:layout_alignParentRight="true"
android:textSize="14sp"/>
<ListView
android:id="@+id/tab4_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text"
android:layout_weight="1"
android:paddingTop="36dp"></ListView>
</RelativeLayout>
tab_item.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLaxyout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:ignore="MissingDefaultResource">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="Orientation">
<TextView
android:id="@+id/time_item"
android:layout_width="125dp"
android:layout_height="match_parent"
android:text="日期"
android:textSize="22sp" />
<TextView
android:id="@+id/name_item"
android:layout_width="125dp"
android:layout_height="match_parent"
android:text="名称"
android:textSize="22sp" />
<TextView
android:id="@+id/operating_item"
android:layout_width="125dp"
android:layout_height="match_parent"
android:text="操作"
android:textSize="22sp" />
<Button
android:id="@+id/start"
android:layout_width="52dp"
android:layout_height="wrap_content"
android:text="开始"/>
<CheckBox
android:id="@+id/option"
android:layout_width="30dp"
android:scaleX="3"
android:scaleY="1.5"
android:layout_height="23dp"
android:focusable="false"
android:visibility="visible"
android:clickable="true"/>
</LinearLayout>
</LinearLaxyout>
MyAdapter文件
package com.example.zscj_app_hexin.com.example;
import com.example.zscj_app_hexin.R;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyAdapter extends BaseAdapter {
List<HashMap<String, Object>> listItem ;//用于设置各个列的值
private Context context;//必传 用于关联tab_item
private Map<Integer,Boolean> map=new HashMap<>();//创建map 用于存储按钮列是否被点击的布尔值,checkBox用,可无需要可不用
private Map<Integer,String> map2=new HashMap<>();//创建map列 用于存储点击了的数组,checkBox用,可无需要可不用
private String id;//返回给activity用,可无需要可不用
private OnButtonClickListener listener;//设置监听
//构造方法
public MyAdapter2(List<HashMap<String, Object>> listItem, Context context, OnButtonClickListener listener) {
this.listItem = listItem;
this.context = context;
this.listener=listener;
}
public int getCount() {
return listItem.size();
}
public Object getItem(int i) {
return listItem.get(i);
}
public long getItemId(int i) {
return i;
}
public Map<Integer, String> getMap2() {
return map2;
}
public View getView(final int i, View view, ViewGroup viewGroup) {
ViewHoder hd = new ViewHoder();
if (view == null) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
view = layoutInflater.inflate(R.layout.tab_item, null);
hd.name=view.findViewById(R.id.name);//进行关联
view.setTag(hd);
}
final HashMap<String, Object> mlistItem=listItem.get(i);
hd = (ViewHoder) view.getTag();
hd.name.setText((String)mlistItem.get("name"));//获取activity传入的值并进行设置 即第一种 在adapter中获取activity传递的值并显示
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if (mlistItem.get("time") != null){
hd.time.setText(sdf.format(mlistItem.get("time")));//由于传过来的 mlistItem.get("time") 是日期格式所以转为string
}else {
hd.time.setText("");
}
final ViewHoder finalHd = hd;
hd.start.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("确定要开始吗?").
setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
id=null;
dialogInterface.dismiss();
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
id=(String) mlistItem.get("id");
listener.onButtonClick(finalHd.start,id);
}
});
builder.show();
}
});
hd.checkBox.setChecked((Boolean) mlistItem.get("checkBox"));
final CheckBox checkBox=view.findViewById(R.id.option);
checkBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (checkBox.isChecked()){
map.put(i,true);
map2.put(i,String.valueOf(mlistItem.get("id")));
}else {
map.remove(i);
map2.remove(i);
}
}
});
if(map!=null&&map.containsKey(i)){
checkBox.setChecked(true);
}else {
checkBox.setChecked(false);
}
return view;
}
class ViewHoder{
TextView time;
TextView name;
CheckBox checkBox;
Button start;
}
public interface OnButtonClickListener{
void onButtonClick(View view, String id);
}
}
MyActivity文件(部分)
3.结尾
个人使用安卓不多,有错误欢迎指正,会更正在文中,本次梳理总结是从原有项目中摘抄所需部分出来,MyActivity文件太多只摘取使用部分,可能会有所遗漏,有需要可私信。