ListView ArrayAdapter,将子项隐藏在 Row 中?

Posted

技术标签:

【中文标题】ListView ArrayAdapter,将子项隐藏在 Row 中?【英文标题】:ListView ArrayAdapter, hiding children inside Row? 【发布时间】:2011-06-21 07:32:36 【问题描述】:

我觉得有点愚蠢,因为我找不到这个问题的答案,这让我觉得我实际上在问 错误 问题。但是,这里是...

我有一个列表视图和一个在 xml 中定义的 listviewitem,有几个字段,没什么特别的。全部设置为可见。

然后我使用自定义 ArrayAdapter 绑定到我的 ListView,并希望在第 5 行隐藏我的一个文本视图。但是,它似乎在项目 0 和项目 5 上隐藏了我的 TextView。这有点奇怪?我已经简化了代码,以重现 问题,希望有人能够帮助我...

我的适配器

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】:

由于 ArrayAdapter 重用行视图,一旦设置了 View.GONE,它将继续到下一行,该视图将被重用。在您的情况下,您在第五行将 View.GONE 设置为 textview,稍微移动了列表,并且 arrayadapter 决定重用您的第五行布局来显示第一行,因为没有对其进行任何更改,所以 textView 仍然保持隐藏状态。

只要做:

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

附:如果您还没有,请观看来自 google 的有关 ListViews 的演示文稿。那里有大量有用的信息。 ListViews

【讨论】:

太棒了,很高兴这只是我对 ListView 工作方式的误解。感谢您的帮助。

以上是关于ListView ArrayAdapter,将子项隐藏在 Row 中?的主要内容,如果未能解决你的问题,请参考以下文章

ListView 与 ArrayAdapter 和 ViewHolder 将图标添加到错误的项目

将数据填充到 Listview 但 Arrayadapter 不工作

使用 ArrayAdapter 将 volley 响应传递给 listview

Android:将数据添加到 ArrayAdapter 时可见的 ListView 图像闪烁

Android View 不会通过滑动手势滚动,也不会滚动。将 ListView 与 ArrayAdapter 一起使用

使用按钮删除 Listview w/ArrayAdapter 中的选定项目