使用Handler来实现adapter数据回调。

上一篇文章讲解了接口回调来实现数据传递,这里其实还可以使用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的。


猜你喜欢

转载自blog.csdn.net/sunbinkang/article/details/78293360
今日推荐