2014-12-18 2 views
1

Я использую ListView для отображения TextViews. Мое приложение выглядит следующим образом:Видимость GONE в ListView

enter image description here

Когда я нажимаю на слово исчезает:

enter image description here

Но ListView все еще держит пустую строку. Я хочу, чтобы мое приложение, чтобы выглядеть после щелчка:

enter image description here

Кто-нибудь знает, почему пустая строка остается на месте. Почему он не полностью удаляется? Я использую setVisibility(View.GONE), чтобы исчезнуть TextViews.

Когда я просто использую с LinearLayouts и устанавливаю visibilty в GONE, вся строка исчезает, а строки под автоматически корректируются соответственно.

EDIT: Я отредактировал код, который теперь включает 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) 

ответ

1

Вы могли бы сделать

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

обновление: поскольку упоминает Гейб, если вам нужно, чтобы показать/скрыть эти элементы, основанные на других событиях, вы, вероятно, хотите создать пользовательский адаптер и отслеживать чтобы вы могли правильно определять видимость строк во время цикла. Есть также много библиотек, которые могут помочь, например, FunGapter, простой адаптер и другие.

обновление 2: remove() будет работать только если список поддержки поддерживает .remove() операцию ... так что вы могли бы сделать new ArrayAdapter<String>(this, R.layout.items, new ArrayList(Arrays.asList(myItems)));

+0

адаптер.remove (адаптор.getItem (позиция)) сбой моей заявки – user2456977

+0

С какой ошибкой? – danb

+0

Я отредактировал свое оригинальное сообщение с журналом ошибок и методом adapter.remove. Пожалуйста, взгляните и сообщите мне, можете ли вы помочь. Спасибо за вашу помощь до сих пор. – user2456977

0

Вы меняете видимость TextView и не его родительский вид - элемент строки. Идеальный способ сделать это - удалить выбранный элемент из вашего list, а затем вызвать notifyDatasetChanged() на адаптере

1

Я вижу много людей, предлагающих удалить строку из вашего набора данных. Я бы не предложил этого, особенно если вам когда-либо понадобилась версия, в которой элементы могут иметь видимость, измененную другими событиями. Общий способ сделать это - создать настраиваемый адаптер, который отслеживает как строковое значение для каждого индекса, так и видимость элемента. Затем в getView вы должны правильно установить видимость текстового представления для данного индекса.

Просто настройка видимости текстового изображения плохая, поскольку в списках используется просмотр в режиме просмотра. Это приводит к тому, что индекс, отображаемый в каждом текстовом виде, изменяется во время выполнения, поэтому непосредственное изменение видимости текстового поля без правильной установки его в getView вызывает проблемы при изменении отображения.

+0

Согласовано. Если строки будут индивидуально удалены и добавлены, вам будет хорошо предложено реализовать адаптер. Если это не является обязательным требованием, тогда реализация пользовательского адаптера будет излишней, и вам лучше использовать только API, который доступен. Вы можете сбросить все содержимое адаптера с помощью адаптера.clear() adapter.addAll (myItems) – danb

Смежные вопросы