在安卓系统中如何刷新所有视图?

10
我正在开发一个类似于Whatsapp的消息平台。当我发送消息时,必须更新屏幕,因为我从数据库中获取数据。当我按下发送按钮时,我必须更新视图。我已经搜索了谷歌,但是没有找到确切的解决方案。有人能帮帮我吗?
编辑:
我的代码:
RelativeLayout layout=new RelativeLayout(this);
                LayoutParams lparams = new LayoutParams(
                        1200,LayoutParams.WRAP_CONTENT);
                layout.setLayoutParams(lparams);
                //layout.setBackgroundResource(R.drawable.bubble);
                // Creating a new TextView
                TextView tv = new TextView(this);
                tv.setText(msgdesc[i]);
                layout.setGravity(Gravity.RIGHT);
                tv.setPadding(30, 10, 0, 0); 
                layout.addView(tv);
                bubbleLayout.addView(layout);

我在这里回答了相同的问题:https://stackoverflow.com/a/56140050/6884103 - Momen Zaqout
6个回答

10

你需要根据你在视图中更新的内容,调用requestLayout()invalidate()其中之一。

如果你只需要让View重新绘制,请调用invalidate()

如果你改变了View的边界(比如大小)请调用requestLayout()


3
如果您使用的是带有ListAdapter的ListView,则需要使用listAdapter.notifyDataSetChanged();来更新列表视图中的新数据。

1

如果您的布局中只有一个TextView,请尝试以下操作:

//Supposing that msgdesc is a class field.

void myRefreshFunction(RelativeLayout l)
{
                if(l != null)
                {
                  l.removeAllViews();  
                  TextView tv = new TextView(this);
                  tv.setText(msgdesc[i]);
                  layout.setGravity(Gravity.RIGHT);
                  tv.setPadding(30, 10, 0, 0); 
                  layout.addView(tv);
                }
}

1

你尝试过使用 view.invalidate() 吗?http://developer.android.com/reference/android/view/View.html

绘制

通过遍历树并渲染与无效区域相交的每个视图来处理绘制。由于树是按顺序遍历的,这意味着父级将在其子级之前(即在其后面)绘制,兄弟将按它们在树中出现的顺序绘制。如果为视图设置了背景可绘制项,则该视图将在调用其 onDraw() 方法之前为您绘制它。

请注意,框架不会绘制不在无效区域内的视图。

要强制视图进行绘制,请调用 invalidate()

你可以像这篇帖子中的回复一样使 viewgroup 无效:How to force an entire layout View refresh?


请注意:如果您正在使用 listView,您可以在适配器中使用 notifysetDataChanged()。 - ƒernando Valle
我正在编辑我的代码。哪一个是我的视图?我动态添加了我的布局? - DuyguK
将RelativeLayout布局设置为类中的字段。当您想要刷新它时,请尝试使用layout.invalidate(); - ƒernando Valle
我在bubbleLayout.addView(layout);下添加了layout.invalidate; 但它似乎不起作用:/ - DuyguK
确保你只在onCreate方法中为RelativeLayout赋值一次,即:RelativeLayout layout=new RelativeLayout(this); - ƒernando Valle

1

0
如果您正在构建一个消息应用程序,并且需要将项目添加到某种列表中,我建议使用RecyclerView和Recyclerview Adapter来实现您想要的效果。当列表增长时,相对布局将不会是可滚动的,但是RecyclerView就可以实现。除此之外,从名称~Recycle~rView中可以看出,RecyclerView在非常长的列表上具有更好的性能,因为它回收以前的项,从而提高了性能。
这里有一个不错的教程,可以帮助您实现您想要的效果:https://blog.sendbird.com/android-chat-tutorial-building-a-messaging-ui (我与SendBird或其他任何人都没有关联,这只是当您在谷歌搜索“RecyclerView聊天示例”时的第一个结果)

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