【问题标题】:Expandable List View Duplicate Views可扩展列表视图重复视图
【发布时间】:2015-07-06 15:33:39
【问题描述】:

只是我的问题如下。
我正在实现一个 ExapndableListView,第一组的孩子有一个由这 3 个组成的布局:TextView、ImageView、ImageView。
现在,当单击一个孩子时,我使用 v.findViewById().setVisibility() 设置两个图像视图之一的可见性,并且它的工作效果与我想象的一样好。
问题是当列表有超过 10 个孩子时,android系统在向下滚动时使用顶部最后一个隐藏的视图回收视图,现在当我单击位置“0”的子级时,我只切换那个视图的图像,而其他视图没有改变,到目前为止很好,但是当我向下滚动并且android系统使用位置“11”的子级中的子级“0”视图回收视图时,它会更改对应于子级“11”的textView,但用于子级“11”的视图是孩子“0”的视图,因此与之前切换的相同图像出现在孩子“11”的视图上,就好像它也被点击了一样,但事实并非如此! 我正在这样做:

@Override
    public View getChildView(final int parentPosition, final int childPosition,  boolean isLastChild, View convertView, ViewGroup parent) {

    Log.d("status","parent : "+parentPosition + " child : " + childPosition + " View : "+convertView + " ViewGroup : "+parent);
    int itemType = 25;
    itemType = getChildType(parentPosition, childPosition);
    String child_title = (String) getChild(parentPosition,childPosition);
    if (convertView == null)
    {
        if (itemType == 0)
        {
            LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.activities2_child_layout, parent, false);

        } else if (itemType == 1) {
            LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.activities2_child2_layout, parent, false);
        } else if (itemType == 2) {
            LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.activities2_child2_layout, parent, false);
        }
    }
    if (itemType == 0)
    //region parent 0 child handling
    {
        Log.d("Child", childPosition + " : " + child_title);

        final TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child_txt);
        final ImageView img_Likes = (ImageView) convertView.findViewById(R.id.activities2_img_like);
        final ImageView img_Dislikes = (ImageView) convertView.findViewById(R.id.activities2_img_dislike);
        child_textview.setText(child_title);

        child_textview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                switch (AAChildClicks[childPosition]) {
                    case 0:
                        AAChildClicks[childPosition]++;
                        img_Likes.setVisibility(View.VISIBLE);
                        //add to total
                        All_Likes.add(child_textview.getText().toString());
                        Log.d("Likes", "Likes + " + child_textview.getText().toString());
                        break;
                    case 1:
                        AAChildClicks[childPosition]++;
                        img_Likes.setVisibility(View.GONE);
                        img_Dislikes.setVisibility(View.VISIBLE);
                        String child = child_textview.getText().toString();
                        //remove from total
                        All_Likes.remove(child_textview.getText().toString());
                        Log.d("Likes", "Likes - " + child_textview.getText().toString());
                        //add to total
                        All_Dislikes.add(child_textview.getText().toString());
                        Log.d("Likes", "Dislikes + " + child_textview.getText().toString());
                        break;
                    case 2:
                        AAChildClicks[childPosition] = 0;
                        img_Likes.setVisibility(View.GONE);
                        img_Dislikes.setVisibility(View.GONE);
                        String child2 = child_textview.getText().toString();
                        //remove from total
                        All_Dislikes.remove(child_textview.getText().toString());
                        Log.d("Likes", "Dislikes - " + child_textview.getText().toString());
                        break;
                }
            }

        });
    }
    //endregion

    if (itemType == 1)
    //region parent 1 child handling
    {
        TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child2_txt);
        child_textview.setText(child_title);
    }
    //endregion

    if (itemType == 2)
    //region parent 2 child handling
    {
        TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child2_txt);
        child_textview.setText(child_title);
    }
    //endregion

    return convertView;
}

如何避免这种重复/错误?!

【问题讨论】:

  • 请发布整个getChildView方法。
  • @NameSpace 我刚刚为你调整了代码

标签: android listview expandablelistview


【解决方案1】:

当视图被回收时,其组件将保持与之前相同的可见性状态。因此,如果您隐藏了 View 的某些部分,那么当它被回收时,它们将被隐藏。

因此,你需要做两件事:

  1. 在每次调用 GetChildView 时将视图的可见性设置为正确的状态。

  2. 您需要跟踪视图之外的位置数据。现在,您对视图可见性的唯一记录是视图本身。当那个视图被回收时,你的记录就会丢失(视图的状态变成了其他位置的起始状态——这就是我们必须在#1中覆盖它的原因)。

您应该在某种 List 或 Node 类型架构中跟踪视图可见性——您不能将这些数据存储在视图上,因为它们不会与任何一个位置永久关联。

【讨论】:

  • 好吧,我觉得我理解了你的话,我会试一试,在一些试验告诉你我达到了什么后回复你..感谢你的支持!
  • 感激不尽!!!起初我认为你的话不足以让我解决它,但我想我只是再次感谢 xD ....@namespace
【解决方案2】:

目前您将状态存储在 itemView img_Likes.setVisibility(View.VISIBLE);

你也必须将它存储在你的模型中

  ((MyType) getChild(parentPosition,childPosition)).setIsVisible(true)

如果您(重新)创建列表视图项,您将使用该信息来(启用/禁用)可见性

 img_Likes.setVisibility((((MyType) getChild(parentPosition,childPosition)).getIsVisible()) ? View.VISIBLE : View.GONE);

【讨论】:

  • 我真的很喜欢这个声音!! xD你能不能再说明一下?!我的类型是什么?在哪里“存储在我的模型中”??
  • 我在过去 2 个小时里一直在尝试应用它,但我真的不知道该怎么做.. 我真的需要你的帮助 @k3b
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多