【问题标题】:Android: updating an item in a ListView that survives scrollingAndroid:更新 ListView 中的项目在滚动后仍然存在
【发布时间】:2016-08-23 21:56:10
【问题描述】:

给定 ListActivity 和 ListView 以及根据用户输入更改项目的要求,如何进行更改以使更改在滚动后仍然存在?

当前应用程序使用由数据库中的Cursor 填充的ResourceCursorAdapter。当用户长按某个项目时,该项目上的ImageView 在View.VISIBLE 和View.GONE 之间切换。此外,数据库中支持视图状态的标志也被管理。

但是,当该项目从屏幕上滚出,然后又回到屏幕上时,该项目会显示为没有最近的更改。换句话说,如果我通过长按使ImageView 可见,它显示得很好。但是当我滚动离开该项目,然后滚动回到它时,它不再可见。

我当前的解决方案(我认为是错误)是保存滚动位置,从数据库中刷新整个列表,然后再次定位到正确的位置。

我想有一些方法可以告诉一些 Android 的东西将新的可见性状态放入它的缓存中,但我找不到它。我试过setScrollingCacheEnabled(false),还有其他一些缓存是错误的,但这些似乎都没有什么不同。我试图弄清楚如何让 Android 意识到它是“脏”的,但我发现的只是查询它是否为isDirty()。我还尝试了ResourceCursorAdapter.notifyDataSetChanged(),这使得setVisibility() 调用对可见性无效。我还在各个地方尝试过invalidate() 和invalidateViews()。如果以正确的顺序(在可见性更改之前或之后)应用于正确的对象,则其中之一可能会起作用。

【问题讨论】:

  • 当用户长按任意行时,您是否正在更改数据?您应该更改数据模型,以便下次根据新的数据模型类扩展该行。 ...
  • ListView 功能的首选方法现在是RecylcerView。这里的答案包含管理列表的详细信息,该列表管理使用首选方法实现的列表中的用户更改数据:stackoverflow.com/a/40568269/897007

标签: android listview android-scrolling


【解决方案1】:

重写 ListView 中的 getView 方法并尝试像这样使用它:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder; // view lookup cache stored in tag
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.your.layout, parent, false);
            viewHolder.img = (TextView) convertView.findViewById(R.id.img);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        if (condition) {
            viewHolder.img.setVisibility(VIEW.VISIBLE);
        else { 
           viewHolder.img.setVisibility(VIEW.GONE);
        }

        // Return the completed view to render on screen
        return convertView;
    }

【讨论】:

  • 感谢您的建议,但我不知道如何解决这个问题,因为我目前正在通过从扩展 ListActivity 的类中调用 getListView() 来获取我的 ListView。这给我留下了一个问题,即如何覆盖ListActivity 提供的ListView。
  • 您确定需要使用ListActivity吗?只需扩展 AppCompatActivity 并将 ListView 添加到内容中。
  • @Dale : 在适配器类中覆盖 getView() 而不是在 ListView 子类中
猜你喜欢
  • 1970-01-01
  • 2018-11-12
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多