android.widget.SimpleAdapter.ViewBinder

本文介绍了如何使用 SimpleAdapter 来填充 ListView,并展示了不需设置 ViewBinder 的情况及自定义 ViewBinder 的示例。通过实例代码解释了 SimpleAdapter 的基本用法及其与 ViewBinder 的交互方式。

一般情况下,我们使用simpleAdapter时无须设置ViewBinder,比如下面的代码。因为每个item的元素都是可以用String作为参数来设置。

SimpleAdapter中的public void setViewImage (ImageView v, String value)和public void setTextView(TextView tv,String value)均是调用bindView去给ImageView设置图像或是给TextView设置文本值,但只有当ViewBinder不存在或者如果存在的ViewBinder无法处理绑定到ImageView或者TextView时才调用上述的那两个方法。

public class SimpleAdapterTest extends Activity
{
 private String[] names = new String[]
  { "虎头", "弄玉", "李清照", "李白"};
 private String[] descs = new String[]
  { "可爱的小孩", "一个擅长音乐的女孩"
   , "一个擅长的文学的女性", "浪漫主义诗人"}; 
 private int[] imageIds = new int[]
  { R.drawable.tiger , R.drawable.nongyu
  , R.drawable.qingzhao , R.drawable.libai};

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  // 创建一个List集合,List集合的元素是Map
  List<Map<String, Object>> listItems =
    new ArrayList<Map<String, Object>>();
  for (int i = 0; i < names.length; i++)
  {
   Map<String, Object> listItem = new HashMap<String, Object>();
   listItem.put("header", imageIds[i]);
   listItem.put("personName", names[i]);
   listItem.put("desc", descs[i]);
   listItems.add(listItem);
  }
  // 创建一个SimpleAdapter
  SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
   R.layout.simple_item,
   new String[] { "personName", "header" , "desc"},
   new int[] { R.id.name, R.id.header , R.id.desc });
  ListView list = (ListView) findViewById(R.id.mylist);
  // 为ListView设置Adapter
  list.setAdapter(simpleAdapter);
  // 为ListView的列表项单击事件绑定事件监听器
  list.setOnItemClickListener(new OnItemClickListener()
  {
   // 第position项被单击时激发该方法。
   @Override
   public void onItemClick(AdapterView<?> parent, View view,
     int position, long id)
   {
    System.out.println(names[position]
     + "被单击了");
   }
  });
  list.setOnItemSelectedListener(new OnItemSelectedListener()
  {
   // 第position项被选中时激发该方法。
   @Override
   public void onItemSelected(AdapterView<?> parent, View view,
     int position, long id)
   {
    System.out.println(names[position]
      + "被选中了");
   }
   @Override
   public void onNothingSelected(AdapterView<?> parent)
   {
   }
  });
 }
}

 

如果item中的元素不是通过String类型的参数设置,就需要提供ViewBinder接口。如下:

SimpleAdapter simpleAdapter = new SimpleAdapter(this, getData(),
                R.layout.backup_restore_result_item, strings, ids);
        mListView.setAdapter(simpleAdapter);
        simpleAdapter.setViewBinder(new ViewBinder() {

            @Override
            public boolean setViewValue(View arg0, Object arg1, String arg2) {
                // TODO Auto-generated method stub
                if (arg0 instanceof ImageView && arg1 instanceof Drawable) {
                    ImageView view = (ImageView) arg0;
                    view.setImageDrawable((Drawable) arg1);
                    return true;
                }
                return false;

            }

        });

setViewValue有三个参数view,data,textRepresentation。

view 是你自定义布局中所有的组件,程序会遍历一边布局中的组件。

data是你传的list<map< ,="">>,程序会遍历每一项数据。

 

<think>好的,我现在需要帮助用户解决关于Android中ListView和ArrayAdapter的使用示例的问题。首先,用户提供的引用内容里有很多代码示例和配置方法,我需要仔细分析这些引用,提取有用的信息。 用户的问题是关于Android ListView和ArrayAdapter的例子,所以我应该先回顾一下用户提供的引用。引用1和引用4提到了如何设置ArrayAdapter,其中引用1中的代码使用了simple_list_item_checked布局,并设置了多选模式。引用4则展示了主布局文件中ListView的基本结构。引用2和引用3则提到了布局文件的编写和SimpleAdapter的使用,但用户主要关注的是ArrayAdapter,所以可能需要集中在引用1和4的内容上。 接下来,我需要确定用户的需求可能包括如何创建一个简单的ListView,使用ArrayAdapter来填充数据,以及可能的自定义布局和交互功能。根据引用中的例子,基本的步骤包括:在XML布局中添加ListView,创建数据源,初始化ArrayAdapter并绑定到ListView,以及处理事件如点击项。 需要注意的是,用户可能希望看到完整的代码示例,包括Java/Kotlin代码和XML布局,以及可能的配置说明。此外,用户可能对不同的布局(如简单的列表项或带有复选框的项)感兴趣,如引用1中的checked模式。 另外,用户提供的引用中提到了不同的布局资源,比如android.R.layout.simple_list_item_1,这也是常用的内置布局,可能需要解释这些布局的区别和适用场景。例如,simple_list_item_checked支持多选,而simple_list_item_1是普通的文本项。 还有,在引用3中虽然讲的是SimpleAdapter,但用户的问题是关于ArrayAdapter的,所以可能需要对比说明两者的不同,但主要聚焦在ArrayAdapter的使用上。不过用户没有提到SimpleAdapter,所以可能不需要深入讨论,除非有相关问题。 最后,用户可能需要知道如何自定义ArrayAdapter,例如使用自定义的布局文件,而不仅仅是内置的布局。这需要展示如何创建自定义的XML布局,并在适配器中引用它。不过根据引用中的示例,可能需要结合引用3中的自定义布局方法,但使用ArrayAdapter的话可能有所不同,因为ArrayAdapter通常用于简单的文本列表,而自定义可能需要继承ArrayAdapter并重写getView方法。 总结步骤: 1. 创建ListView的XML布局。 2. 准备数据源,如字符串数组。 3. 初始化ArrayAdapter,选择合适的布局。 4. 将适配器设置给ListView。 5. 处理事件监听,如点击事件。 6. 可能的多选模式配置,如引用1中的setChoiceMode。 同时需要检查是否有遗漏的细节,例如是否需要Activity中setContentView,如何引用ListView的ID等。需要确保代码示例的完整性和正确性,符合用户提供的引用中的结构,例如布局文件中的ListView ID和代码中的findViewById一致。 现在需要将这些步骤整理成清晰的回答,包括代码示例和解释,并引用提供的引用来源。例如,引用1中的代码展示了如何设置带有复选框的列表项,而引用4展示了基本的ListView布局。在回答中,需要分步骤说明,并确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,但需要遵循用户的系统级指令。 另外,用户要求生成相关问题,所以需要根据回答内容提出几个相关问题,例如如何自定义ArrayAdapter的布局,如何处理多选,或者ArrayAdapter与SimpleAdapter的区别等。 最后,确保回答结构清晰,步骤明确,代码正确,并且引用标识正确添加,例如在提到多选模式时引用[^1],在布局文件示例时引用[^4]等。</think>### Android ListView与ArrayAdapter使用示例 #### 1. 基础实现步骤 **布局文件**:在XML中定义ListView组件 ```xml <!-- 主布局文件 activity_main.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" android:orientation="vertical"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> ``` [^4] **Java/Kotlin代码**:绑定数据并设置适配器 ```java // MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = findViewById(R.id.listView); String[] data = {"Apple", "Banana", "Orange"}; // 使用系统预定义布局 ArrayAdapter<String> adapter = new ArrayAdapter<>( this, android.R.layout.simple_list_item_1, data ); listView.setAdapter(adapter); // 点击事件处理 listView.setOnItemClickListener((parent, view, position, id) -> { Toast.makeText(this, "选中: " + data[position], Toast.LENGTH_SHORT).show(); }); } } ``` --- #### 2. 进阶功能实现 **多选模式配置** ```java // 使用带复选框的布局 listView.setAdapter(new ArrayAdapter<>( this, android.R.layout.simple_list_item_checked, data )); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); // 启用多选 ``` [^1] **自定义布局** 1. 创建自定义项布局 `item_custom.xml`: ```xml <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="48dp" android:textSize="18sp" android:paddingStart="16dp" android:textColor="#FF5722"/> ``` 2. 适配器绑定自定义布局: ```java ArrayAdapter<String> adapter = new ArrayAdapter<>( this, R.layout.item_custom, // 自定义布局 R.id.textView, // TextView的ID data ); ``` --- #### 3. 关键参数说明 | 参数 | 作用 | |-----------------------|--------------------------------------------------------------------| | `android.R.layout.simple_list_item_1` | 系统预置单行文本布局 | | `CHOICE_MODE_MULTIPLE` | 允许列表项多选模式 | | `ArrayAdapter`构造方法第三个参数 | 指定数据源,支持`List<T>`或数组 | --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值