ListView ArrayAdapter, скрывающий детей внутри строки? - PullRequest
0 голосов
/ 04 февраля 2011

Я чувствую себя немного глупо, так как не могу найти ответ на этот вопрос, из-за чего я думаю, что на самом деле задаю неправильный вопрос. Тем не менее, здесь идет ...

У меня есть представление списка и элемент списка, определенный в 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;
    }
}

Мой обязательный код

    // 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));

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

1 Ответ

6 голосов
/ 04 февраля 2011

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

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

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

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

...