更新列表视图项目行但滚动时修改不会保留

时间:2014-11-18 21:02:30

标签: android android-listview

我在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

3 个答案:

答案 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适配器中的对象,而不仅仅是视图!