0

Я чувствую себя немного глупо, так как я не могу найти ответ на этот вопрос, что заставляет меня думать, что я действительно спрашиваю неправильный вопрос. Однако здесь идет ...ListView ArrayAdapter, скрывающий детей внутри строки?

У меня есть вид списка, а listviewitem, определенный в xml, с несколькими полями, ничего особенного. Все установлено на видимое.

Затем я привязываюсь к своему элементу ListView с использованием настраиваемого ArrayAdapter и хочу скрыть одно из своих текстовых представлений в строке 5. Однако он, кажется, скрывает мой TextView на элементах 0 и пункте 5. Что-то нечетное ? Я упростил код, чтобы воспроизвести проблему и, надеюсь, кто-то сможет мне помочь ...

Мой адаптер

public class MenuScreenAdapter extends ArrayAdapter<String> 
{ 
    private List<String> _items; 
    private Context _context; 

    public MenuScreenAdapter(Context context, List<String> items) 
    { 
     super(context, R.layout.list_menu_item, items); 

     _context = context; 
     _items = items; 
    } 

    private MenuScreenAdapter(Context context, int textViewResourceId) 
    { 
     super(context, textViewResourceId); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View v = convertView; 

     if (v == null) 
     { 
      LayoutInflater vi = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.list_menu_item, null); 
     } 
     String o = _items.get(position);  
     if (o != null) 
     { 
      TextView tt = (TextView) v.findViewById(R.id.list_menu_item_name); 
      if (tt != null) 
       tt.setText(o); 

      if (position == 5) 
       tt.setVisibility(View.GONE); 
     } 
     return v; 
    } 
} 

Мой Binding Код

// Load everything up that we need 
    List<String> items = new ArrayList<String>(); 
    items.add("One"); 
    items.add("Two"); 
    items.add("Three"); 
    items.add("Four"); 
    items.add("Five"); 
    items.add("Six"); 
    items.add("Seven"); 
    items.add("Eight"); 
    items.add("Nine"); 
    items.add("Ten"); 

    // Get the ListView, and set it's adapter. The HomeScreenAdapter 
    // takes care of the rest 
    ListView homeScreenListView = (ListView) _mainActivity.findViewById(R.id.view_home_list); 
    homeScreenListView.setOnItemClickListener(ItemSelected); 
    homeScreenListView.setAdapter(new MenuScreenAdapter(_mainActivity.getBaseContext(), items)); 

Заранее спасибо!

ответ

6

Поскольку представления строк повторно используются ArrayAdapter, как только объект View.GONE установлен, он будет подключен к следующей строке, где это представление будет повторно использоваться. В вашем случае вы установите View.GONE на textview в пятой строке, немного переместили список, и arrayadapter решил повторно использовать макет пятой строки, чтобы отобразить первую строку, так как никаких изменений для нее не было, текстовый файл по-прежнему остается скрытым.

Просто сделайте:

if (position == 5) { 
      tt.setVisibility(View.GONE); 
} else { 
      tt.setVisibility(View.VISIBLE); 
} 

P.S. Если вы еще этого не сделали, посмотрите презентацию о ListViews из Google. Тонны usefult info там. ListViews

+0

Фантастический, рад, что это было просто мое непонимание того, как работает ListView. Спасибо за вашу помощь. –

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