【问题标题】:How to manage Views in a Listview correctly如何正确管理 Listview 中的视图
【发布时间】:2011-03-15 21:48:47
【问题描述】:

我想知道如何管理 ListView 中的视图。

我有一个在 ListView 上设置的自定义 Adapter,这个 Adapter 覆盖了 getView 方法

public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            v = mInflater_.inflate(R.layout.news_newsentry, null);
        }

        final NewsItem newsItem = getItem(position);

        if (newsItem != null) {
            // Do stuff
        }

        return v;

    }

但问题是,当用户点击一个项目时,我会稍微改变视图以使其更大。它工作得很好,但是当项目视图被回收时,它会保持“大”高度来显示另一个项目。

为了防止这种情况,我每次都更改了代码以创建一个新视图

变化:

    View v = convertView;
    if (v == null) {
        v = mInflater_.inflate(R.layout.news_newsentry, null);
    }

    View v = mInflater_.inflate(R.layout.news_newsentry, null);

现在的问题是,当项目从列表中消失并重新出现(列表滚动)时,视图是全新的并且高度设置为“小”。

然后我的问题是:如何管理项目视图以保留其属性,而不会弄乱其他视图和视图回收?

【问题讨论】:

    标签: android listview view


    【解决方案1】:

    我认为您可以通过使用 ListView 内置支持列表中的多个视图类型来获得所需的结果。

    在您的适配器中,您将实现类似于

    的其他方法
        @Override
        public int getItemViewType(int position) {
            int type = 0;
            if (position == mySelectedPosition) {
                type = 1;
            }
            return type;
        }
    
        @Override
        public int getViewTypeCount() {
            return 2;
        }
    

    然后,您的 getView 方法将获得项目位置正确类型的视图。即,所选项目将始终被赋予“大”视图以重复使用。

    出于性能和内存原因,不建议每次都创建新视图。

    【讨论】:

    • 好的,这似乎是一个解决方案,但是:如果每个列表项都可以有任何类型的配置怎么办。我必须自己跟踪所有这些吗?
    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多