上一篇文章讲解了接口回调来实现数据传递,这里其实还可以使用Handler来实现数据回调。
Demo代码:
public class SecondActivity extends AppCompatActivity { private ListView mlistview; private ArrayList<String> mlist; private int mposition; private MyAdapter2 myAdapter2; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 回传的是此item的bean,对当前bean中的数据能够进行操作,位置传过来之后还能将数据进行操作 Bundle bundle = msg.getData(); mposition = bundle.getInt(MyAdapter2.POSITION); switch (msg.what) { case MyAdapter2.DELETE: { String str = mlist.get(mposition); Toast.makeText(SecondActivity.this, str, Toast.LENGTH_LONG).show(); break; } default: { break; } } } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mlistview = (ListView) findViewById(R.id.listview); initData(); myAdapter2 = new MyAdapter2(mlist, SecondActivity.this, handler); mlistview.setAdapter(myAdapter2); } private void initData() { mlist = new ArrayList<>(); for (int i = 0; i < 20; i++) { mlist.add("这是第di" + i); } } }
public class MyAdapter2 extends BaseAdapter { public static final String POSITION = "POSITION"; public static final int DELETE = 1; private List<String> list; private LayoutInflater layoutInflater; private Context context; private Handler handler; public MyAdapter2(List<String> list, Context context, Handler handler) { layoutInflater = 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(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.list_item, null); viewHolder.textView = (TextView) convertView.findViewById(R.id.text); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.textView.setText(list.get(position)); viewHolder.textView.setOnClickListener(new OnItemChildClickListener(DELETE, position)); return convertView; } public 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 message = new Message(); message.what = clickIndex; message.arg1 = position; Bundle bundle = new Bundle(); bundle.putInt(POSITION, position); message.setData(bundle); handler.sendMessage(message); } } }布局代码activity:<?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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.adaptercallbackdemo.MainActivity"> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none"></ListView> </RelativeLayout>list_item.xml:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" android:text="111" /> </LinearLayout>Handler的代码就非常好理解了,只要是通过Handler发送数据message和接收处理数据message,message被发送之后中包含了数据信息。但是要注意的是,发送message的Handler和处理message的Handler必须是同一个。所以adapter是通过构造函数传递handler的。