【问题标题】:ListView and it's "weird" behavior. How can i solve this situation?ListView 和它的“奇怪”行为。我该如何解决这种情况?
【发布时间】:2015-12-17 22:00:36
【问题描述】:

您应该知道,ListView 回收视图。但我想使用可以单击和展开的元素。就像我已经做过的那样:

但它完全搞砸了,即使使用:

View checklayout = convertView;
if(checklayout == null){
        checklayout = inflater.inflate(R.layout.home_cell, null);
    }

当一些打开的可扩展视图离开屏幕时,不应扩展的回收视图会接收消失的布局。仅应打开具有“1 AVALIAÇÃO LANÇADA”的视图并显示其内容。我使用 if(qtdAvaliacoes > 0) 添加此内容,这是我的 Object 的属性,来自 ArrayList。

我通过以下方式“解决”了禁用回收器的问题:

@Override
public int getViewTypeCount() {
    return getCount();
}

@Override
public int getItemViewType(int position) {
    return position;
}

一旦我的 listView 将只接收 5~10 行。但我知道这不是一个好习惯。当我写这个问题时,我找到了一个解决方案,在膨胀任何视图之前调用我的对象,然后检查属性:

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

    View checklayout = convertView;
    final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final Disciplina disciplina = lista.get(position);

    if(checklayout == null || disciplina.getQtdAvaliacoes() == 0){
        checklayout = inflater.inflate(R.layout.home_cell, null);
    }

    final View layout = checklayout;

但我认为这不是最好的方法。我读了一些关于标签的东西,但有点困惑。我认为如果我可以将这些 onClick 方法绑定到行位置会更好。

有什么想法吗?或者我的解决方案是否适合你,开发人员的观点。 谢谢。

【问题讨论】:

    标签: android listview android-listview android-recyclerview


    【解决方案1】:

    最简单的方法是不在列表项中进行 subinflate。而是通过视图可见性来执行此操作,如果您不希望它显示,则使膨胀的部分消失。您只需在每次调用 getView 时明确设置该视图的可见性

    【讨论】:

    • 不会让我的应用加载更多数据吗?因为用户并不总是需要这些表。此外,该表是动态填充的。谢谢!
    • 这需要你有更多的浏览量。实际数据差异很小,尽管初始膨胀时间会增加一点。 perf 可能会受到轻微影响,但您找到的几乎任何解决方案都会遇到 perf-inflating 到可回收视图通常很难做到。另一种方法是使用 2 种视图类型——完全膨胀的视图类型和未膨胀的视图类型,并跟踪哪些项目应该膨胀或不膨胀。这需要更多的工作,但会减少大部分性能命中(尽管最终可能需要更多数据,具体取决于回收商持有多少)。
    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2011-04-19
    • 2015-08-05
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多