首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加视图后无法刷新布局(仅在CustomAdapter中出现)

添加视图后无法刷新布局(仅在CustomAdapter中出现)
EN

Stack Overflow用户
提问于 2015-09-24 07:31:54
回答 3查看 692关注 0票数 4

注意:这不应该与库有任何关系,我只是为了详细说明而包含它们

问题:这个库https://github.com/Diolor/Swipecards中有一个名为FlingContainer的布局。它接受另一个布局作为参数(要翻转的卡片),在卡片内部我有一个向卡片添加标签的按钮。在用于Fling Container的CustomAdapter中,我在GetView方法中有以下代码。我知道它是有效的,因为我可以看到电视在调试模式下被添加,它们就是不显示。

我尝试过的方法:我尝试在没有flingContainer的activity中执行此操作,视图立即添加,没有任何问题。我尝试从mainActivity中搜索R.id.addTag,但是得到了一个nullPointer异常,我想这是因为addTag嵌入到了另一个布局中

结论:你知道这里出了什么问题吗?我怎样才能让addView在卡中工作?

谢谢

编辑:这是整个getView

代码语言:javascript
复制
    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在这里工作

EN

回答 3

Stack Overflow用户

发布于 2015-09-30 10:18:05

LayoutParams

无论何时以编程方式创建View,都不要忘记这一点。只需插入WRAP_CONTENT,生活就会很美好

还可以使用

代码语言:javascript
复制
Parent.invalidate();
Parent.requestLayout();

此处的父级是您要添加到的ViewGroup

编辑

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

代码语言:javascript
复制
 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();

    }
});
票数 3
EN

Stack Overflow用户

发布于 2015-10-02 12:35:35

找不到答案,库已损坏

票数 3
EN

Stack Overflow用户

发布于 2020-02-06 14:40:09

我最近遇到了同样的问题。我尝试了很多方法,为了解决这个问题,我调用了requestLayout()给刚才添加的那个子对象,而不是父对象。在我的例子中,我在某个索引处添加了一个子代。parent.addView(child, index) parent.getChildAt(index).requestLayout()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32751108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档