我在消息平台上工作,如whatsup.When发送消息ı必须更新屏幕,因为我正在db中获取数据。当我按下发送按钮时,必须更新视图。 我用谷歌搜索,但不能确切的解决方案。任何人都可以帮助我吗?
编辑:
我的代码:
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);
答案 0 :(得分:8)
您需要致电requestLayout()
或invalidate()
,具体取决于您在视图中准确更新的内容
如果您只需要View
重绘,请致电invalidate()
如果您更改View
界限(例如尺寸),请致电requestLayout()
答案 1 :(得分:3)
如果您将listview与listadapter一起使用,那么您必须使用listadapter.notifyDataSetChanged();
这将使用新数据更新您的列表视图
答案 2 :(得分:1)
您是否尝试使用view.invalidate()
? http://developer.android.com/reference/android/view/View.html
<强>图纸强>
通过遍历树并渲染每个视图来处理绘图 与无效区域相交。因为树是按顺序遍历的, 这意味着父母将在他们的之前(即后面)抽签 孩子们,兄弟姐妹按照他们出现在树上的顺序画出来。如果 您为View设置了一个可绘制的背景,然后View将绘制它 在回调它的onDraw()方法之前为你服务。
请注意,框架不会绘制不在的框架 无效区域。
要强制绘制视图,请致电
invalidate()
。
你可以尝试像这篇文章中的回复一样使viewgroup无效: How to force an entire layout View refresh?
答案 3 :(得分: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);
}
}
答案 4 :(得分:1)
请参阅Dianne's answer:
invalidate()只会导致重绘视图:http://developer.android.com/reference/android/view/View.html#invalidate()
requestLayout()要求视图通过新的度量/布局传递(然后重绘):http://developer.android.com/reference/android/view/View.html#requestLayout()
答案 5 :(得分:0)
如果您正在构建消息传递应用程序,并且将项目添加到某种列表中,建议您使用RecyclerView和Recyclerview适配器来实现您要执行的操作。当列表大小增加时,您的相对布局将不会滚动,但是RecyclerView
会滚动。最重要的是,RecyclerView
的清单很长,可以为您带来更高的性能,因为名称~Recycle~rView
可以回收以前的物品,从而提高性能。
这是有关如何实现所需目标的合理教程: https://blog.sendbird.com/android-chat-tutorial-building-a-messaging-ui
(我不隶属于SendBird或其他任何公司,这只是您在Google上搜索到的第一个结果:RecyclerView聊天示例)