ListView中的可见性GONE

时间:2014-12-18 20:44:58

标签: android listview android-arrayadapter visibility

我使用ListView来显示TextViews。我的应用程序如下所示:

enter image description here

当我点击某个单词时,它会消失:

enter image description here

但是ListView仍保留空行。点击后,我希望我的应用看起来像这样:

enter image description here

有谁知道为什么空行保持不变。为什么不完全删除?我使用setVisibility(View.GONE)使TextViews消失。

当我将TextviewsLinearLayouts一起使用并将可见度设置为GONE时,整行会消失,并且下方的行会自动重新调整。

编辑:我编辑了现在包含adapter.remove(adapter.getItem(position))的代码,导致我的应用程序崩溃。我添加了错误日志和编辑过的代码。请帮忙。

已修改代码:

package com.example.listview;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        populateListView();
        registerClickCallback();
    }

    private void populateListView() {

        //Create list of items
        String[] myItems = {"Blue", "Green","Purple","Red"};

        //Build Adapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.items, myItems);

        //Configure the list view
        ListView list = (ListView) findViewById(R.id.listView1);
        list.setAdapter(adapter);
    }

    private void registerClickCallback() {
        ListView list = (ListView) findViewById(R.id.listView1);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                TextView textview = (TextView) view;
                textview.setVisibility(View.GONE);
                adapter.remove(adapter.getItem(position));
            }
    }); 
}

}

错误日志:

12-19 12:04:57.994: E/AndroidRuntime(23120): FATAL EXCEPTION: main
12-19 12:04:57.994: E/AndroidRuntime(23120): Process: com.example.listview, PID: 23120
12-19 12:04:57.994: E/AndroidRuntime(23120): java.lang.UnsupportedOperationException
12-19 12:04:57.994: E/AndroidRuntime(23120):    at java.util.AbstractList.remove(AbstractList.java:638)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:75)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at java.util.AbstractCollection.remove(AbstractCollection.java:229)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.widget.ArrayAdapter.remove(ArrayAdapter.java:244)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at com.example.listview.MainActivity$1.onItemClick(MainActivity.java:50)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.widget.AbsListView$3.run(AbsListView.java:3645)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.os.Handler.handleCallback(Handler.java:733)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.os.Handler.dispatchMessage(Handler.java:95)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.os.Looper.loop(Looper.java:136)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at android.app.ActivityThread.main(ActivityThread.java:5146)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at java.lang.reflect.Method.invokeNative(Native Method)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at java.lang.reflect.Method.invoke(Method.java:515)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
12-19 12:04:57.994: E/AndroidRuntime(23120):    at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:1)

你可以做到

adapter.remove(adapter.getItem(position));

更新:正如Gabe所提到的,如果您需要根据其他事件显示/隐藏这些项目,您可能需要创建自定义适配器并跟踪状态,以便您可以在回收时正确设置行的可见性。还有许多库可能有助于FunDapter,easy-adapter等。

更新2:remove()仅在支持列表支持.remove()操作时才有效...所以你可以new ArrayAdapter<String>(this, R.layout.items, new ArrayList(Arrays.asList(myItems)));

答案 1 :(得分:1)

我看到很多人建议您从数据集中删除字符串。我不建议这样做,特别是如果你想要一个版本,其中的项目可以通过其他事件改变其可见性。执行此操作的常用方法是创建自定义适配器,以跟踪每个索引处的字符串值和项目的可见性。然后在getView中,您必须正确设置给定索引的文本视图的可见性。

设置textview的可见性很糟糕,因为listviews使用视图回收。这会导致每个textview中显示的索引在运行时更改,因此直接更改textview的可见性而不在getView中正确设置它将导致映射更改时出现问题。

答案 2 :(得分:0)

您正在更改textview的可见性,而不是其父视图 - 行项目。执行此操作的理想方法是从list中删除所选项目,然后在适配器上调用notifyDatasetChanged()