【问题标题】:Better way for "refresh" and "setSelection" after Update ListView (android)更新 ListView (android) 后“刷新”和“setSelection”的更好方法
【发布时间】:2009-10-26 14:34:29
【问题描述】:

在我的ListView中,我选择了一个“添加收藏”的项目,我必须做一些工作,我再次填充数据以刷新列表,然后我实现OnScrollListener使用setSelection(firstVisibleItem)来设置列表显示项目右侧已添加。

有没有更好的方法来做到这一点。我的意思是像mCursor.requery() 或类似的android API?或者有什么建议的方式?

【问题讨论】:

  • 我对这个问题的答案很感兴趣;我也有类似的问题

标签: android listview


【解决方案1】:

为了在我的ListView 的顶部而不是中间显示所选项目,我使用了setSelectionFromTop()

getListView().setSelectionFromTop(pos, getListView().getHeight() / 2);

当然,您还可以从上面的除法中减去单元格布局高度的一半,以使选择恰好位于中间。

【讨论】:

  • 将高度除以 2 不会使项目居中,而是会使顶部从中间开始,给人一种将项目放在列表中较低位置的感觉。如果很难确定视图高度,我通常会减去半行高,或者除以 2.5 或 3。
【解决方案2】:

好吧,requery() 是重新填充由SimpleCursorAdapter 支持的ListView 的首选方式。在ListView 上调用setSelection() 似乎是确保所需项目可见的好方法。我不清楚OnScrollListener 与这些有什么关系。

【讨论】:

  • 我也不得不考虑 OnScrollListener! :-) 但我这里的意思是,通过使用这个监听器并记住通过firstVisibleItem 传来的最后一个值并在重新定位时使用 this 值,一切看起来都是一样的更新数据后!
【解决方案3】:

如果你只是打电话给setSelection(),那会让你的项目不自然地显示。例如,如果您的项目在屏幕的“中间”可见并且它的位置是 8。当您添加收藏夹刷新数据,setSelection(8) 项目将显示在屏幕的“顶部”(而不是在“中间”)。

所以,这就是为什么我使用OnScrollListener 来获取firstVisibleItem 并使用这个值来设置位置。它使项目自然显示。这是函数:

public void onScroll(AbsListView view, int firstVisibleItem, int VisibleItemCount, int totalItemCount){}

我认为在ListView 中更新数据的任何人都会经常发生这种情况。我希望有人可以分享这个问题的经验。

【讨论】:

    【解决方案4】:
    mListActivity.runOnUiThread(
        new Runnable() {
            public void run() {
                x.setSelection(x.getCount());
            } 
        } 
    );
    

    【讨论】:

      【解决方案5】:

      这就是你们正在寻找的:

      onResume()
      {
          refresh_your_data()
          if(listview.getadapter()==null)
           // create the adapter
          }
          else
          {
              adapter.notifydatasetchanged();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多