我使用ListView
来显示TextViews
。我的应用程序如下所示:
当我点击某个单词时,它会消失:
但是ListView
仍保留空行。点击后,我希望我的应用看起来像这样:
有谁知道为什么空行保持不变。为什么不完全删除?我使用setVisibility(View.GONE)
使TextViews
消失。
当我将Textviews
与LinearLayouts
一起使用并将可见度设置为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)
答案 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()