SimpleAdapter

http://www.cnblogs.com/angeldevil

先看一下构造函数: 

public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

参数:

  • context  SimpleAdapter关联的View的运行环境
    data    一个Map组成的List。在列表中的每个条目对应列表中的一行,每一个map中应该包含所有在from参数中指定的键
    resource    一个定义列表项的布局文件的资源ID。布局文件将至少应包含那些在to中定义了的ID
    from          一个将被添加到Map映射上的键名
    to     将绑定数据的视图的ID,跟from参数对应,这些应该全是TextView


public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ListView lv = (ListView) findViewById(R.id.listView1);
        String[] from = { "Text", "Button" };
        int[] to = { R.id.text, R.id.button };
        List<Map<String, ?>> list = new ArrayList<Map<String, ?>>();
        for (int i = 0; i < 10; i++) {
            Map<String, String> m = new HashMap<String, String>();
            m.put("Text", "Text" + i);
            m.put("Button", "Button" + i);
            list.add(m);
        }
        SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.listitem, from, to);
        lv.setAdapter(adapter);
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >


    <TextView
        android:layout_width="wrap_content"
        android:id="@+id/text"
        android:layout_height="wrap_content"
        android:layout_weight="1" />


    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


</LinearLayout>

在上面的例子中每一个ListItem都包含一个TextView与一个Button,但程序运行起来后会发现,按钮可以点击,而ListItem却无法点击,而且没有对每一个Button关联响应事件,ListItem无法点击是因为按钮抢占了ListItem的焦点,在listitem.xml而已文件中对LinearLayout加上一个属性就可解决问题:

   android:descendantFocusability="blocksDescendants"

下面的问题就是Button的响应事件了.

我的们下SimpleAdaper的源码会发现,数据的绑定是能过一个叫bindView的函数实现的

SimpleAdapter.ViewBinder binder = new SimpleAdapter.ViewBinder() {

    @Override
    public boolean setViewValue(View view, Object data, String textRepresentation) {
         if (view instanceof Button) {
            final View button = view;
//            button.setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_launcher));
            view.setOnClickListener(new OnClickListener() {
               LinearLayout listItem = (LinearLayout) button.getParent();
               TextView tv = (TextView) listItem.findViewById(R.id.text);
                @Override
                public void onClick(View v) {
                    Toast.makeText(AdapterDemoActivity.this, tv.getText(), Toast.LENGTH_SHORT).show();
                }
            });
            return false;
        }
        return false;
    }
};
adapter.setViewBinder(binder);
在setViewValue中可以完全自定义我们的实现,比如在Button后加一个TextView,当然可以加任何View,但这样做没任何意义,当你需要这样做时你不需要用SimpleAdater而应该用BaseAdapter:


SimpleAdapter.ViewBinder binder = new SimpleAdapter.ViewBinder() {

    @Override
    public boolean setViewValue(View view, Object data, String textRepresentation) {
        if (view instanceof Button) {
            final View button = view;
            LinearLayout listItem = (LinearLayout) button.getParent();
            TextView textView = new TextView(AdapterDemoActivity.this);
            textView.setText("AA");
            listItem.addView(textView,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            return false;
        }
        return false;
    }
};
 adapter.setViewBinder(binder);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值