我在Android Activity中有一个ListView,并为该listview提供了一个自定义适配器。 我希望能够编辑行项目并立即更新该行。这工作,行的修改可见但是,在滚动我松散所有数据。 这是我的Asynk任务,我从中获取数据并更新列表行项目:
/**
*
*/
public class EditNewsFeedPostAsyncTask extends AsyncTask<Void, Void, Boolean> {
public Activity context;
public String content;
public int rowPosition;
public ListView listView;
public TextView decriptionTxt;
@Override
protected Boolean doInBackground(Void... params) {
try {
token = Utils.getToken(context);
if (token != null) {
....
// {"status":"true"}
if (result != null) {
....
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
if (success) {
updateListView(rowPosition, content);
}
}
public boolean updateListView(int position, String content) {
int first = listView.getFirstVisiblePosition();
int last = listView.getLastVisiblePosition();
if (position < first || position > last) {
return false;
} else {
View convertView = listView.getChildAt(position - first);
decriptionTxt.setText(content);
listView.invalidateViews();
return true;
}
}
private void updateView(int index, TextView decriptionTxt) {
View v = listView.getChildAt(index - listView.getFirstVisiblePosition());
if (v == null)
return;
decriptionTxt.setText(content);
listView.invalidateViews();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onCancelled() {
}
}
我缺少什么?数据不应该持久吗? THX
答案 0 :(得分:1)
getView
内的adapter
方法会调用,您将返回默认视图。
如果您想永久更改该项,则应更新数据集并在适配器上调用notifyDataSetChanged
。
答案 1 :(得分:1)
确保您更新数据,而不仅仅是视图。
修改行时,您是在更改基础数据还是仅更改视图?如果只是视图......
您可能遇到了ListView回收问题。 This answer有一个很好的解释。基本上,ListViews是关于基于数据显示视图的效率,但不适合在屏幕上保存新数据。每次将ListView项目滚动到视图外时,其View将被回收用于刚刚滚动到视图的项目。因此,如果你把&#34; hi&#34;在EditText中,然后将其滚动到屏幕外,您可以告别该字符串。
我在我的应用程序中解决了这个问题,完全放弃了ListView并使用了一个LinearLayouts数组(可能是一个笨重的方法,但我有一个已知的列表大小,现在它很好用)。如果您想继续使用ListView,您必须先从&#34;数据第一&#34; 视角处理它。就像我说的,ListViews非常善于从底层数据中显示信息。如果你把&#34; hi&#34;在EditText中同时将该字符串放在基础数据中,无论您进行任何滚动,它都会存在。更新onTextChanged可能很麻烦,因此您也可以让每一行打开一个对话框,用户在该对话框中输入数据,然后在对话框关闭时更新基础数据集。
这些仅仅是基于某些假设的一些想法,但是在ListView中编辑视图通常与ListView的工作方式不太一致。
答案 2 :(得分:1)
您必须更新listView适配器中的对象,而不仅仅是视图!