Android ListView回收 - 可扩展项目

时间:2014-10-18 16:02:33

标签: android expandable recycle

我为ListView创建了一个可展开的项目,并且视图已正确回收。 问题是当我展开其中一个项目时,一些隐藏的项目也会被扩展,这显然是我不想要的。

例如,如果我在列表中的第二个位置展开项目,则第8个也会展开。反之亦然。 这看起来是一个未正确折叠的循环视图。

以下是展开/折叠项目的快速屏幕。

enter image description here

enter image description here

以下是我用来创建这些项目的代码:

LayoutInflater inflater = (LayoutInflater) fragment.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    final MessageHolder holder;
    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.test_message, parent, false);
        holder = new MessageHolder();

        // Retrieve layout elements
        holder.card = new WeakReference<ExpandableCardLayout>((ExpandableCardLayout) convertView.findViewById(R.id.card));
        holder.layout_comments = new WeakReference<LinearLayout>((LinearLayout) convertView.findViewById(R.id.layout_comments));
        holder.layout_loading = new WeakReference<LinearLayout>((LinearLayout) convertView.findViewById(R.id.layout_loading));
        holder.spinner_loading = new WeakReference<FlatLoadingSpinner>((FlatLoadingSpinner) convertView.findViewById(R.id.spinner_loading));

        // Attach holder
        convertView.setTag(holder);
    }
    else
    {
        holder = (MessageHolder) convertView.getTag();
    }

    // Attach listener
    holder.card.get().setOnExpandListener(new OnExpandListener() {
        @Override
        public void onExpand()
        {
            handler.postDelayed(new Runnable() {
                @Override
                public void run()
                {
                    // Hide loading
                    holder.layout_loading.get().setVisibility(View.GONE);

                    // Add comments
                    List<View> comments = buildComments(null);
                    for (int i=0; i<comments.size(); i++) holder.layout_comments.get().addView( comments.get(i) );
                }
            }, 1000);
        }

        @Override
        public void onCollapse()
        {               
            // Remove everything
            while (holder.layout_comments.get().getChildCount() > 0) holder.layout_comments.get().removeViewAt(0);

            // Show loading
            holder.layout_loading.get().setVisibility(View.VISIBLE);
        }
    });

    return convertView;

我的问题是:如何避免在循环使用的元素上展开折叠视图?

1 个答案:

答案 0 :(得分:0)

您必须手动删除onExpand()中添加的视图。 ListView不了解您的扩展逻辑和缓存,并按原样重复使用列表项视图。

或者您应该考虑使用ExpandableListView,因为此组件的设计完全适用于您的情况。

PS。我不明白为什么你在小时持有者对象中使用WeakReferences。