【问题标题】:How to get the selected item from ListView?如何从 ListView 中获取所选项目?
【发布时间】:2011-01-29 02:28:48
【问题描述】:

在我的 Android 应用程序中,我创建了一个名为 myList 的 ListView 组件,并用我自己的自定义类型的对象填充它:

class MyClass{

    private String displayName;
    private String theValue;
... //here constructor, getters, setters and toString() are implemented

}

我使用 ArrayAdapter 将 ArrayList theObjects 与 myList 绑定:

ArrayAdapter<MyClass> adapter= 
                new ArrayAdapter<MyClass>(this, R.layout.lay_item, theObjects);
myList.setAdapter(adapter);

这很好用,列表已填充等,但是当我尝试访问所选项目时,我收到一个 Null 对象。我已经使用

myList.setOnItemClickListener(new OnItemClickListener() {

   public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {

MyClass selItem = (MyClass) myList.getSelectedItem(); //
String value= selItem.getTheValue(); //getter method

}

似乎是什么问题?谢谢

【问题讨论】:

    标签: android listview


    【解决方案1】:

    默认情况下,当您单击 ListView 项目时,它不会将其状态更改为“已选择”。因此,当事件触发并且您这样做时:

    myList.getSelectedItem();
    

    该方法没有任何返回值。您要做的是使用位置并通过执行以下操作获取底层对象:

    myList.getItemAtPosition(position);
    

    【讨论】:

    • 这对查找所选项目的索引有何帮助?首先,您将如何获得该职位?
    • @Zelphir 位置传入onItemClick(AdapterView> adapter, View v, int position, long id)方法
    【解决方案2】:

    您正在实现单击处理程序而不是选择处理程序。默认情况下,列表不应该有选择。

    在上面的示例中,您应该更改的是

    public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
        MyClass item = (MyClass) adapter.getItem(position);
    }
    

    【讨论】:

      【解决方案3】:

      由于onItemClickLitener() 本身会为您提供所选项目的索引,您可以简单地执行getItemAtPosition(i).toString()。代码 sn-p 如下:-

          listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
      
                  String s = listView.getItemAtPosition(i).toString();
      
                  Toast.makeText(activity.getApplicationContext(), s, Toast.LENGTH_LONG).show();
                  adapter.dismiss(); // If you want to close the adapter
              }
          });
      

      在上面的方法中,i 参数实际上给出了所选项目的位置。

      【讨论】:

        【解决方案4】:

        onItemClick 上:

        String text = parent.getItemAtPosition(position).toString();
        

        【讨论】:

        • 适用于 xamarin :)
        【解决方案5】:
        myList.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
              MyClass selItem = (MyClass) adapter.getItem(position);
           }
        }
        

        【讨论】:

          【解决方案6】:

          使用 setOnItemClickListener 是正确的答案,但是如果您有键盘,即使使用箭头也可以更改选择(不执行单击),因此,您还需要实现 setOnItemSelectedListener :

          myListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                      @Override
                      public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
               MyObject tmp=(MyObject) adapterView.getItemAtPosition(position);
                   }
                      @Override
                      public void onNothingSelected(AdapterView<?> adapterView) {
                          // your stuff
                      }
                  });
          

          【讨论】:

            【解决方案7】:

            touch mode 中,没有焦点,也没有选择。您的 UI 应使用不同类型的小部件(例如单选按钮)进行选择。

            ListView 上关于这方面的文档很糟糕,setSelection 上只有一个模糊的提及。

            【讨论】:

              【解决方案8】:

              虽然我使用的是 kotlin,但以下代码回答了您的问题。此返回选中项:

              val item = myListView.adapter.getItem(i).toString()
              

              以下是整个selecteditem Listener

              myListView.setOnItemClickListener(object : OnItemClickListener {
                     override fun onItemClick(parent: AdapterView<*>, view: View, i: Int,
                                      id: Long) {
                         val item = myListView.adapter.getItem(i).toString()
              
                     }
                  })
              

              代码返回其索引i点击的项目,如代码所示

              【讨论】:

                【解决方案9】:

                MyClass selItem = (MyClass) myList.getSelectedItem(); //

                你从来没有实例化你的类。

                【讨论】:

                • 他说他可以查看东西,所以类肯定已经实例化了。
                猜你喜欢
                • 1970-01-01
                • 2011-06-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-05-29
                相关资源
                最近更新 更多