当前位置: 首页 > 知识库问答 >
问题:

更新列表视图项行,但在滚动中修改不保留

单展
2023-03-14

我在Android活动中有一个列表视图和该列表视图的自定义适配器。我希望能够编辑行项并立即更新该行。这工作原理,可以看到行的修改但是,在滚动我松开所有数据。这是我的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() {
    }
}

我错过了什么?数据不应该是持久的吗?谢谢

共有3个答案

贲宏硕
2023-03-14

确保您正在更新数据,而不仅仅是视图。

修改行时,是在更改基础数据还是仅更改视图?如果只是风景。。。

你可能遇到了列表视图回收问题。这个答案有一个很好的解释。基本上,列表视图是关于基于数据显示视图的效率,但不适合在屏幕上保存新数据。每次列表视图项目滚动退出视图时,它的视图都会被回收用于刚刚滚动进入视图的项目。因此,如果你在编辑文本中放入“hi”,然后将其滚动退出屏幕,你就可以告别那个字符串了。

我在我的应用程序中解决了这个问题,完全放弃了ListView,使用了一系列LinearLayout(可能是一个笨拙的方法,但我有一个已知的列表大小,现在效果很好)。如果你想继续使用ListView,你必须从“数据优先”的角度来处理它。就像我说的, ListViews非常擅长显示底层数据中的信息。如果你在EditText中放入“hi”,同时在底层数据中放入该字符串,无论你做什么滚动操作,它都会在那里。在TextChanged上更新可能很麻烦,所以你也可以让每一行打开一个对话框,用户在其中输入他们的数据,然后在对话框关闭时更新底层数据集。

这些只是基于一些假设的一些想法,但是在列表视图中编辑视图通常不太符合列表视图的工作方式。

松钊
2023-03-14

滚动后,列表的适配器中的getView方法将调用,您将返回默认视图。

如果要永久更改该项,应更新数据集,并在适配器上调用notifyDataSetChanged

郗丰
2023-03-14

您必须更新listView适配器中的对象,而不仅仅是视图!

 类似资料:
  • 我正在寻找一种方法,在运行时改变JavaFX FXML应用程序的视图,并保存结果,以便在下次应用程序启动时显示。有办法吗?我在网上搜索,但没有找到任何解决方案!例如:我有一个函数,可以在GridPane中添加标签,并保存新添加的标签。在我的应用程序下一次启动时,新标签出现了。这是一个数据库应用程序,用户可以为自定义数据添加新的数据库字段。

  • 我有一个android布局,它有一个,里面有很多元素。在的底部有一个,然后由适配器填充。 我遇到的问题是,android将从中排除,因为已经具有可滚动的功能。我希望与内容一样长,并且主滚动视图是可滚动的。 我怎样才能达到这种行为呢? 下面是我的主要布局: 然后以编程方式将组件添加到具有ID:的linearlayour中。下面是加载到LinearLayout中的一个视图。就是这个给我卷轴带来麻烦的。

  • 当发生滚动时,我试图将< code>ListView项目动画化。更具体地说,我正试图模仿iOS 7上iMessage应用程序的滚动动画。我在网上找到一个类似的例子: 为了澄清,我试图在用户滚动时实现对项目的“流体”移动效果,而不是在添加新项目时实现动画。我试图修改我的中的视图,并且我已经研究了源代码,看看我是否可以以某种方式在某个地方附加一个,该器可以调整发送到子视图的绘制坐标(如果这是的设计方式

  • 我有一个非常令人沮丧的问题,我不知道是什么问题。我构建了只包含GridView的简单XML。这个gridview应该显示从特定的URL下载的图像(ImageView ),我用我的代码检索这些图像。 因此,此应用程序的想法只是从URL下载图像并在网格视图中显示这些图像。首先,我必须说我正在使用通用图像加载器库。首先,请看一下我的获取视图代码: 问题: 上面的代码有效,它在GridView中显示图像。

  • 问题内容: 我有一个数据库SQLite,然后使用SimpleCursorAdapter,将值显示到列表视图中。但是,我想重新排列列表视图项,并在顶部显示ID#1,然后显示ID号2,依此类推。问题是,我无法掌握根据以下内容重新分配列表视图项的概念在内容提供商提供的某些ID号上。如果您知道,请分享。谢谢。 问题答案: 如果正确使用SQLite,则在查询数据库时应该能够执行“按ID排序”。 如果不是这种

  • 但当接收者发送“hello”时,这条聊天信息会显示在左侧位置,但它也会将其他信息显示在左侧位置,发送信息时也是如此。。下面是用户收到“Hello”时的屏幕截图 我不知道我错在哪里 我的回收者视图发送者布局 chat_layout_self.xml chat_layout_other.xml MessageAdapter.java