Android:让ListView只显示所选项目?

时间:2014-11-04 19:49:53

标签: android listview

我试图找到是否有一种方法让ListView仅显示单个选定项目(或我的案例的激活项目)。我想要的是一个ListView(不是ExpandableListView),它显示了一个选项列表。单击其中一个项目后,该项目将被选中/激活,视图将折叠为仅显示单个突出显示的行。再次单击该项目将取消选择/取消激活,并将导致列表展开以再次显示所有选项。

/* Setup the ListView */
    List mItems = getItems(someCriteria);

    ListView lview = (ListView)findViewById(R.id.my_listview);
    ArrayAdapter<SomeItem> anAdaptor =
            new ArrayAdapter<SomeItem>(this, android.R.layout.simple_list_item_activated_1, mItems);

    lview.setAdapter(anAdaptor);
    /* Handles the item selection using Activated property */
    lview.setSelector(R.drawable.list_selector);
    lview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

我有一个list_selector资源(\ res \ drawable \ list_selector.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:state_activated="true"
    android:drawable="@drawable/selected" />

<item
    android:state_selected="true"
    android:drawable="@drawable/selected" />

<item
    android:state_focused="true"
    android:drawable="@drawable/selected" /> <!--  @drawable/tab_focus -->

<!-- Pressed -->
<item
    android:state_pressed="true"
    android:drawable="@drawable/pressed" /> <!--  @drawable/tab_press -->

</selector>

按下或选择的资源看起来像(\ res \ drawable \ pressed.xml):

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/DarkGray"/>
</shape>

我的ListView的setOnItemClickListener:

     lview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {

            ListView lview = (ListView) findViewById(R.id.my_listview);

            SomeItem an_item = (SomeItem) adapter.getItemAtPosition(position);

            lview.setSelection(position);
            lview.setItemChecked(position, true);
            lview.invalidateViews();


        }
    });

2 个答案:

答案 0 :(得分:1)

您可以在单独的变量中缓存选定的“SomeItem”。

然后在适配器的getCount()和getItem(...)中,检查变量是否为null,只显示该项(或正常项if为null)

@Override
public int getCount()
{
   if(selectedItem != null)
   {
       return 1;
   }

   return super.getCount(); 
}

@Override
public Object getItem(int position)
{
   if(selectedItem != null)
   {
       return selectedItem ;
   }

   return super.getItem(position); 
}

答案 1 :(得分:0)

您需要做的是使用要包含的新数据更改适配器(以编程方式删除不需要的项目)。

完成后,您需要再次绘制完整列表(将新适配器添加到列表中)。

可能你在listview中包含了一个“onClick”答案来对这个事件作出反应,我建议你在你的活动中创建一个方法来执行新的适配器添加和onClick方法(使用主机)调用那种方法。