可扩展列表视图重复视图

时间:2015-07-06 15:33:39

标签: android listview expandablelistview

我的问题如下。
我正在实现一个ExapndableListView,第一个组有子项,其中包含一个由3个组成的布局:TextView,ImageView,ImageView。
现在,当点击一个孩子时,我使用v.findViewById()。setVisibility()设置两个图像视图之一的可见性,并且它的工作效果与我想象的一样。
问题是当列表超过10时孩子们,安卓系统在向下滚动时使用顶部最后一个隐藏的视图回收视图,现在当我点击位置" 0"时,我只切换那个视图的图像而其他人不是到目前为止改变了,但是当我向下滚动并且android系统使用孩子" 0"回收视图时在位置" 11"的子视图中,它改变了对应于子" 11"的文本视图。因为它应该用于儿童" 11"是孩子的观点" 0"因此,相同的图像在之前切换,它出现在儿童的视图中#11; 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;
}

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

2 个答案:

答案 0 :(得分:1)

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

你必须将它存储在你的模式中

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

如果您(重新)创建列表视图项目,则将该信息用于(en / dis)能见度

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

答案 1 :(得分:1)

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

因此,您需要做两件事:

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

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

  3. 您应该在某种列表或节点类型架构中跟踪视图可见性 - 您无法将这些数据存储在视图上,因为它们不会与任何一个位置永久关联。