在添加视图后无法刷新布局(仅在自定义适配器中发生)

4
注意:这与库无关,我只是包含它们以提供细节。
问题:这个库https://github.com/Diolor/Swipecards中有一个名为FlingContainer的布局。它需要另一个布局作为参数(要被抛出的卡片),在卡片内部我有一个按钮用于向卡片添加标签。在用于Fling Container的CustomAdapter中,我在GetView方法中有以下代码。我知道它能正常工作,因为我可以在调试模式下看到电视机被添加了,但它们没有显示出来。
我尝试过:我尝试在没有flingContainer的活动中完成此操作,视图会立即添加,没有任何问题。我尝试从mainActivity搜索R.id.addTag,但是我得到nullPointer异常,我认为这是因为addTag嵌入到另一个布局中。
结论:您对此有什么想法? 我怎样才能让addView在卡片中起作用?
谢谢。
编辑:以下是整个getView。
    public View getView(int position, View convertView, final ViewGroup parent) {
    final View vi = inflater.inflate(layoutResource, parent, false);
    TextView tv = (TextView) vi.findViewById(R.id.card_one_line);
    flowLayout = (FlowLayout) vi.findViewById(R.id.flow_container);

    final TextView typeTag = new TextView(getContext());
    final TextView typeTag2 = new TextView(getContext());
    TextView addTag = (TextView) vi.findViewById(R.id.addTag);


    typeTag.setText(lines.get(position).getType());

    typeTag.setBackgroundColor(getContext().getResources().getColor(R.color.nice_blue));
    typeTag.setTextColor(getContext().getResources().getColor(R.color.lightening_yellow));
    typeTag.setTextSize(25);
    typeTag.setPadding(5, 5, 5, 5);


    flowLayout.addView(typeTag);


    addTag.setOnClickListener(new View.OnClickListener() {
        int i = 0;
        @Override
        public void onClick(View v) {
            TextView tv = new TextView(getContext());
            tv.setBackgroundColor(getContext().getResources().getColor(R.color.nice_blue));
            tv.setTextColor(getContext().getResources().getColor(R.color.lightening_yellow));
            String text = "Goofy"+i++;
            tv.setText(text);
            tv.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
            flowLayout.addView(tv);
            parent.invalidate();
            parent.requestLayout();
            Toast.makeText(getContext(), "heyheyhey", Toast.LENGTH_SHORT).show();

        }
    });


    tv.setText((lines.get(position).getLine()));
    return vi;
}

在这张图片中,我正在flingcontainer内点击+按钮,g是默认类型添加到onClick之外的,试图使onClick在此处起作用。


1
您正在尝试向一个应该由适配器控制的视图添加视图,是这样吗? - Daniel Mendel
是的!我非常确信那就是情况。 - Tintinabulator Zea
好的,我加入了整个getView。 - Tintinabulator Zea
您想向用户的输入展示某种反应。该输入是否对底层数据产生影响,还是更像在列表中检查所需项目(多选)?因为即使您设法通过“onClick”更改单个布局元素的外观,这些表面上的更改有时会导致随机行为(例如滚动),因为适配器的制作方式(出于性能原因回收布局)。 - Bö macht Blau
这只是将动态创建的textView添加到flowLayout中。因此,它不会被添加到任何后台数据存储中等。 - Tintinabulator Zea
显示剩余2条评论
3个回答

4

LayoutParams

无论何时您以编程方式创建视图,请不要忘记这一点。只需插入WRAP_CONTENT,生活就美好了。

同时还要使用

Parent.invalidate();
Parent.requestLayout();

这里的父级(parent)是你要添加到的 ViewGroup

编辑(EDIT)

做一些调整,addTag.setOnClickListener() 是一个不依赖于你的 getView() 方法的方法,所以硬编码引用并不是很好。可以这样做:

 addTag.setClickable(true);
 addTag.setOnClickListener(new View.OnClickListener() {
    int i = 0;
    @Override
    public void onClick(View v) {
        TextView tv = new TextView(getContext());
        tv.setBackgroundColor(getContext().getResources().getColor(R.color.nice_blue));
        tv.setTextColor(getContext().getResources().getColor(R.color.lightening_yellow));
        String text = "Goofy"+i++;
        tv.setText(text);
        tv.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        ((ViewGroup)v.getParent()).addView(tv)
        parent.invalidate();// do you know this "parent" guy?
        //i feel it is suppose to be flowlayout
        parent.requestLayout();
        Toast.makeText(getContext(), "heyheyhey", Toast.LENGTH_SHORT).show();

    }
});

嘿,我尝试了你的建议,但它没有起作用。当视图添加到普通活动中的流式布局时,它可以工作,但是当流式布局位于fling容器内时,它无法工作。我知道按钮可以工作,因为弹出了toast消息。我还添加了图片并更新了代码。 - Tintinabulator Zea
你确定textView没有自动拥有layoutParams吗?当我在activity中添加它时,它可以正常工作,而不需要layoutParams。 - Tintinabulator Zea
在我的初始代码中,我提到了父级,并且我在您的代码中看到了父级,所以如果我可以问一下,父级是谁,因为对我来说它应该是您的flowlayout。请检查我的编辑并查看是否解决了问题。此外,layoutparams 告诉父级子项希望如何处理,因此如果您正在使用自定义 Viewgroup,则需要使用它。另外,不要使用 ViewGroup.Layoutparams,请检查该库是否有 FlowLayout.LayoutParams,如果没有,请坚持使用您已经拥有的。@TintinabulatorZea - Elltz
父级对象被传递到自定义适配器中,如下所示 --- public View getView(int position, View convertView, final ViewGroup parent) - Tintinabulator Zea
它仍然没有工作。很有趣的是,它在一个简单的活动中可以工作。我甚至尝试在FlingContainer之外添加一个按钮,执行flingContainer.invalidate(),但它也没有起作用:( 我认为这个库不可能实现,我将不得不每次重新创建活动。 - Tintinabulator Zea

3
找不到答案,库已损坏。

真的吗?还是猜测?我的意思是,看起来是这样的。 - Elltz

0

我最近遇到了同样的问题。我尝试了很多方法,最终解决方法是在新添加的子项上调用requestLayout()而不是在父项上调用。在我的情况下,我是在特定索引处添加子项。 parent.addView(child, index) parent.getChildAt(index).requestLayout()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接