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 Arrayadapter 获得数据方法

今天学习了 spinner (下拉选项)和 AutoCompleteTextView (自动提示)组件,分享3种可以给组件传递数值的方法。 1.用静态字符数组常量来给ArrayAdapter 赋值。...

Android控件ListView获取item中EditText值

可以明确,现在没有直接方法可以获得ListView中每一行EditText的值.     解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值. ...
  • zz_mm
  • zz_mm
  • 2014年07月28日 18:44
  • 28769

Android开发adapter与Activity交互

最早的时候我是用Activity实例传递来操作的,或者直接拿 Activity实例来操作(FansActivity.instance = this)       后面我发现这不科学,比如对象回收了呢...

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

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

Android_ListView_Adapter使用和数据动态加载

ListView是比较常用的控件,其存在的最根本的原因在于它的高效,ListView通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经...

Android Activity和Adapter通过接口交互

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

Android Adapter回调接口

Andoird中当activity中需要处理adapter中listview的item点击事件,这时候需要用到回调接口,Adapter中定义的接口相当与发布,在activity中实现相当于是响应。 ...

回调函数教程(二):Android中ListView点击事件回调实例

转自:http://www.cnblogs.com/ivan-xu/p/4124967.html 在Activity中响应ListView内部按钮的点击事件,而不在Adapter中响应的两种方式: ...

自定义Adapter的接口,方便回调。Adapter与Activity之间的回调

1,接口写在Adapter里: ①:private OnCityClickListener onCityClickListener;//定义对象 ②://写接口,并定义方法,根据自己的...

Android adapter中调用activity中的方法

随手记录工作中的点滴,有时我们可能会在adapter中调用activity中的方法,办法很简单,话不多说直接上代码 public class DetectionAdapter extends Rec...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 使用adapter的两种回调数据方式
举报原因:
原因补充:

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