我有一个包含不同项目的Activity,其中一个项目是ListView。 我创建了一个自定义列表适配器并向其发送一个json数组。 列表的数据从服务器到达。
列表目的是制作评论列表。我允许用户插入 评论,然后我在ListView中显示它。 当我在列表中有一些项目时,它会起作用,并显示项目。 问题是当listview为空并且用户发表评论时。 我看到数据已更改,但我看不到该项目,表示列表未刷新..
所以我尝试在列表视图中添加一个空视图,但它不起作用。
以下是更新后的代码:( 更新)
if (!s.isEmpty() && !s.equals("{}")) {
try {
if (commentsListAdapter == null) {
commentsList.setEmptyView(findViewById(R.id.dummy));
commentsListAdapter = new CommentsListAdapter(PostView.this);
}
JSONObject resObj = new JSONObject(s);
list.add(resObj);
commentsListAdapter.setDataSet(list);
cmntTxt.setText("");
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
commentCounter.setText(Integer.toString(list.size()));
} catch (JSONException e) {
e.printStackTrace();
}
}
在适配器内部我有这个功能:
public void setDataSet(List<JSONObject> list){
commentsList = list;
notifyDataSetChanged();
}
但问题并没有解决..
答案 0 :(得分:1)
我注意到代码list.add(resObj)
出现在new CommentsListAdapter
后,当列表为空时出现,并且当列表非空时显示在new CommentsListAdapter
之前。
我怀疑适配器CommentsListAdapter
没有使用对象list
进行数据存储。在这种情况下,您需要在适配器中创建一个公共方法来进行更新。换句话说,适配器正在使用另一个对象进行数据存储。
也可以帮助发布CommentsListAdapter的代码。但我希望我对我的陈述是正确的。 我希望这很清楚......
答案 1 :(得分:0)
请更改以下代码:
public void setDataSet(List<JSONObject> list){
commentsList = list;
notifyDataSetChanged();
}
到:
private List<JSONObject> commentsList = new ArrayList<>();
public void setDataSet(List<JSONObject> list){
commentsList.clear();
commentsList.addAll(list);
notifyDataSetChanged();
}
并将commentsList
用于适配器中的所有其他方法。这是notifyDataSetChanged()工作的更好方法。
希望它有所帮助! :)
答案 2 :(得分:0)
如果您要从外部添加注释,即从活动而不是从适配器添加注释,而不是在设置适配器时添加注释。
youradapterobject.notifyDataSetChanged();
并且不要执行commentsListAdapter == null而不是setemptyview
如果null为
,它会自动设置空视图正确使用 list.setEmptyView(findViewById(R.id.erromsg));