我正在从Custom ArrayAdapter调用的Async类中检索一些数据。当我添加新评论时,我更新评论文本视图并且工作正常,但在我重新加载整个列表后,更新不再出现。我可以在logcat中看到有一个新的注释nr,但不在UI上。
不应该这样:answersListView.invalidateViews
够了吗?我试图从列表视图更新该行,以避免一段时间后没有更新注释的问题。
private void updateView(int index) {
System.out.println("index: " + index);
View v = answersListView.getChildAt(index - answersListView.getFirstVisiblePosition());
if (v == null)
return;
final TextView nrComments = (TextView) v.findViewById(com.dub.mobile.R.id.showCommentsTxt);
if (nrComments != null) {
if (nrComments.getText().toString().trim().length() == 0) {
// first comment
nrComments.setText("1 comments");
} else {
// comments exist already
int newNr = Integer.parseInt(nrComments.getText().toString().trim()
.substring(0, nrComments.getText().toString().trim().indexOf("comments")).trim()) + 1;
nrComments.setText(newNr + " comments");
}
System.out.println("final nr of comments: " + nrComments.getText());
nrComments.setVisibility(View.VISIBLE);
}
answersListView.getAdapter().getView(position, v, answersListView);
v.setBackgroundColor(Color.GREEN);
answersListView.invalidateViews();
}
并且:
updateView(position);
adapter.notifyDataSetChanged();
答案 0 :(得分:1)
您需要更新UI线程中的数据。 如果您的Async类中有上下文,请使用
runOnUiThread(new Runnable() {
@Override
public void run() {
//update here
}
});
或
android.os.Handler handler = new android.os.Handler();
handler.post(new Runnable() {
@Override
public void run() {
//update here
}
});
答案 1 :(得分:1)
答案几乎是@Rami在对你的问题的评论中所说的。您不需要直接更新视图,只需更新数据即可。在您的适配器中,您覆盖了getView方法,在您进行所有这些更改的地方,您不需要updateViews方法。 让我试着解释它是如何工作的。
每当其中一个视图在屏幕中变得可见或不可见时,或者如果调用notifyDataSetChanged方法,就会创建和销毁这些视图(行)。
所以现在,问题是,如果你改变,让我们说,适配器列表的位置5中的对象,用于具有新数据的不同对象,然后下一次ListView请求适配器给出在位置5的视图中,适配器将使用新数据创建视图(行)。就是这样。
答案 2 :(得分:0)
这不是您在列表视图中更改项目数据的方式。您必须使用某些字符串数组来填充适配器的getView函数中textview中的数据。您只需要更改该数组,然后在适配器上调用notifydatasetchanged。视图由适配器回收,因此上面没有意义
getView(...) { TextView tv = new TextView(context); tv.setText(myData的[指数]); //您需要更改myData数组内容 }