Android 使用adapter的两种回调数据方式

原创 2016年08月31日 11:48:42

1、首先创建一个listView列表,用于显示数据:

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
     />

item布局使用简单的一行文字显示,主要是将点击的位置回调回使用listView的类文件之中,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">

<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:padding="10dp" />

</RelativeLayout>

2、回调数据分为两种方式,第一种是在adapter之中写一个回调接口,在点击item的时候使用接口回调,将点击的position传递给activity之中使用的adapter,在adapter中使用定义的回调方法获取到传递的position。第二种是在activity之中传递数据到adapter的时候将handler一并传进去,使用handler获取到点listView点击之时的position传递。

(1)使用接口回调:

i、自定义适配器MyAdapter:

public class MyAdapter extends BaseAdapter {

private List<String> list;
private Context context;
private LayoutInflater inflater;
private onClickMyTextView onClickMyTextView;

public MyAdapter(Context context, List<String> list) {
    super();
    inflater = LayoutInflater.from(context);
    this.list = list;
    this.context = context;
}

//接口回调
public interface onClickMyTextView{
    public void myTextViewClick(int id);
}
public void setOnClickMyTextView(onClickMyTextView onClickMyTextView) {
    this.onClickMyTextView = onClickMyTextView;
}


@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) {

    ViewHolder viewHolder = null;
    if (viewHolder==null) {
        viewHolder = new ViewHolder();
        convertView = inflater.inflate(R.layout.item, null);
        viewHolder.textView = (TextView) convertView.findViewById(R.id.textView);

        convertView.setTag(viewHolder);
    }else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.textView.setText(list.get(position).toString());

    if (onClickMyTextView!=null) {
        viewHolder.textView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                onClickMyTextView.myTextViewClick(position);

            }
        });
    }


    return convertView;
}

    class ViewHolder{
        TextView textView;
    }

}

使用自定义接口设置:

public interface onClickMyTextView{
    public void myTextViewClick(int id);
}
public void setOnClickMyTextView(onClickMyTextView onClickMyTextView) {
    this.onClickMyTextView = onClickMyTextView;
}

点击的时候使用接口传递数据:

if (onClickMyTextView!=null) {
        viewHolder.textView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                onClickMyTextView.myTextViewClick(position);

            }
        });
    }

ii、在MainActivity之中使用adapter:

public class MainActivity extends Activity {

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.listView);

    initData();

    adapter = new MyAdapter(MainActivity.this, list);
    listView.setAdapter(adapter);
    //接口的调用,获取传递的id
    adapter.setOnClickMyTextView(new onClickMyTextView() {

        @Override
        public void myTextViewClick(int id) {
            Toast.makeText(MainActivity.this, list.get(id).toString(), Toast.LENGTH_SHORT).show();

        }
    });
}

    // 列表模拟数据
    private void initData() {
        list = new ArrayList<String>();
        for (int i = 0; i < 20; i++) {
            list.add("添加的数据条目=" + i);
        }

    }

}

(2)、使用Handler回调数据:
i、自定义适配器MyAdapter:

public class MyAdapter extends BaseAdapter {

public static final String POSITION = "POSITION";
public static final int DELETE = 1;

private List<String> list;
private Context context;
private LayoutInflater inflater;
private Handler handler;

public MyAdapter(Context context, List<String> list, Handler handler) {
    super();
    inflater = LayoutInflater.from(context);
    this.list = list;
    this.context = context;
    this.handler = handler;
}

@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) {

    ViewHolder viewHolder = null;
    if (viewHolder == null) {
        viewHolder = new ViewHolder();
        convertView = inflater.inflate(R.layout.item, null);
        viewHolder.textView = (TextView) convertView.findViewById(R.id.textView);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.textView.setOnClickListener(new OnItemChildClickListener(DELETE, position));

    return convertView;
}

class ViewHolder {
    TextView textView;
}

// handler的点击事件
private class OnItemChildClickListener implements View.OnClickListener {
    // 点击类型索引,对应前面的CLICK_INDEX
    private int clickIndex;
    // 点击列表位置
    private int position;

    public OnItemChildClickListener(int clickIndex, int position) {
        this.clickIndex = clickIndex;
        this.position = position;
    }

    @Override
    public void onClick(View v) {
        // 创建Message并填充数据,通过handle联系Activity接收处理
        Message msg = new Message();
        msg.what = clickIndex;
        msg.arg1 = position;
        Bundle b = new Bundle();
        b.putInt(POSITION, position);
        msg.setData(b);
        handler.sendMessage(msg);
        }

    }

}

点击事件的使用:
viewHolder.textView.setOnClickListener(new OnItemChildClickListener(DELETE, position));

点击方法,将position传递到handler之中:

// handler的点击事件
private class OnItemChildClickListener implements View.OnClickListener {
    // 点击类型索引,对应前面的CLICK_INDEX
    private int clickIndex;
    // 点击列表位置
    private int position;

    public OnItemChildClickListener(int clickIndex, int position) {
        this.clickIndex = clickIndex;
        this.position = position;
    }

    @Override
    public void onClick(View v) {
        // 创建Message并填充数据,通过handle联系Activity接收处理
        Message msg = new Message();
        msg.what = clickIndex;
        msg.arg1 = position;
        Bundle b = new Bundle();
        b.putInt(POSITION, position);
        msg.setData(b);
        handler.sendMessage(msg);
    }

}

ii、在MainActivity之中使用adapter:

public class MainActivity extends Activity {

/**
 * 显示数据的列表
 */
private ListView listView;
/**
 * 模拟数据的集合
 */
private List<String> list;
/**
 * 自定义的适配器
 */
private MyAdapter adapter;
/**
 * 回传回来的列表位置
 */
private int mPosition;

private Handler handler = new Handler() {
    public void handleMessage(Message msg) {

        // 回传的是此item的bean,对当前bean中的数据能够进行操作,位置传过来之后还能将数据进行操作
        mPosition = msg.getData().getInt(MyAdapter.POSITION);

        switch (msg.what) {
        case MyAdapter.DELETE:
            Toast.makeText(MainActivity.this, "点击回传的是:" + list.get(mPosition), Toast.LENGTH_SHORT).show();
            break;

        default:
            break;
        }
    };
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.listView);

    initData();

    adapter = new MyAdapter(MainActivity.this, list, handler);
    listView.setAdapter(adapter);
}

private void initData() {
    list = new ArrayList<String>();
    for (int i = 0; i < 20; i++) {
        list.add("添加的数据条目=" + i);
        }

    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。若转载请注明出处

Android Adapter回调接口

Andoird中当activity中需要处理adapter中listview的item点击事件,这时候需要用到回调接口,Adapter中定义的接口相当与发布,在activity中实现相当于是响应。 ...
  • b6325955
  • b6325955
  • 2015年04月17日 14:58
  • 3879

Android中接口回调、方法回调

Android中方法的的回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦,现在来举个例子看看它的应用场合,例如在activity中的listview与adapter类之间的传递: 一、...
  • yoonerloop
  • yoonerloop
  • 2016年08月14日 17:48
  • 6196

Adapter传递数据到Activity(接口回调)

Adapter传递数据到Activity(接口回调)
  • qq_34203494
  • qq_34203494
  • 2017年06月17日 12:53
  • 1527

Android Activity和Adapter通过接口交互

之前都是调用系统的接口回调很随意并不知道原理是什么!当自己Activity和Adapter需要写个回调时就蒙圈了!然后的然后就去看系统的点击事件的实现!!!!SO 先看系统是怎么定义回调接口的`~~~...
  • u014360817
  • u014360817
  • 2016年07月01日 10:57
  • 4064

自定义公用Adapter适配器--回调机制

1.回调:我的理解是,一个类A实现一个接口CallBack(该接口可以是B类的内部接口,也可以是独立的接口),类A包含类B的引用b,类B有参数为callBack的方法或构造函数,最后类A调用B中的方法...
  • nzzl54
  • nzzl54
  • 2016年05月04日 14:01
  • 1444

Android Activity之间的跳转与传值(回传)

应用场景: 在Android的开发过程中,有时需要进行Activity之间的跳转,在页面跳转的过程中,有时需要传递指定的参数数据过去,例如:信息发布app返回查询条件的需要,为此,就需要了解这方面的...
  • ma_hoking
  • ma_hoking
  • 2014年05月10日 12:18
  • 2471

Android 通过接口传值

Android 通过接口传值 接口传值简单了说,就是在需要传值的那方定义接口,在接收数据的那方实现接口,数据就在需要实现的那个方法里,千万记住传值方的Listener一定是接收数据方的Listene...
  • JerryWu145
  • JerryWu145
  • 2016年08月02日 13:51
  • 680

关于对adapter中的按钮进行点击传数据回activity的方法

首先,在adapter类中声明一个接口,使用接口回调进行点击事件的回传 private SubClickListener subClickListener;在adapter中对按钮进行点击事件监听,...
  • languobeibei
  • languobeibei
  • 2016年12月13日 15:12
  • 2848

Android-Adapter中使用Intent跳转到一个activity

从Adapter里跳转到Activity 无非就是两点 1,构造方法传递上下文,context 2,上下文开启activity/**Intent intent=new Intent(mContext,...
  • panghaha12138
  • panghaha12138
  • 2017年05月31日 10:42
  • 649

Adapter类型控件之Adapter(数据适配器)

(一)概述 Adapter是作为连接数据跟View之间桥梁的,你可以创建一个View来使用Adapter来对数据直接进行填充; (二)Adapter(适配器)的使用 先来看看他的类结构图...
  • MakeYourChance
  • MakeYourChance
  • 2016年06月24日 21:52
  • 4242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 使用adapter的两种回调数据方式
举报原因:
原因补充:

(最多只允许输入30个字)