【问题标题】:Show Progress Indicator before fill listview using CursorLoader在使用 CursorLoader 填充列表视图之前显示进度指示器
【发布时间】:2013-04-18 16:34:12
【问题描述】:

当我的列表视图未填充数据库数据时,有什么更好的方法来显示进度指示器?

我找到了一些如何使用 assynctask 的示例,但就我而言,我使用的是 Loader /CursorLoader

public class TestActivity extends SherlockFragmentActivity implements
    LoaderCallbacks<Cursor> {

SimpleCursorAdapter mAdapter;
ListView mListView;

private static final String[] UI_BINDING_FROM = new String[] {
        TestDBAdapter.KEY_NAME, TestDBAdapter.KEY_ICON };

private static final int[] UI_BINDING_TO = new int[] { R.id.text, R.id.icon };

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_Test);

    mListView = (ListView) findViewById(R.id.listview);

    mAdapter = new TestAdapter(getApplicationContext(),
            R.layout.list_item_Test, null, UI_BINDING_FROM,
            UI_BINDING_TO, 0);

    mListView.setAdapter(mAdapter);

    getSupportLoaderManager().initLoader(0, null, this);

}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {


    Uri uri = ContentProviderTest.CONTENT_URI;

    CursorLoader cursorLoader = new CursorLoader(
            this, 
            uri,
            null,
            null,
            null,
            null);

    return cursorLoader;

}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    mAdapter.swapCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    mAdapter.swapCursor(null);
}
}

一个可能的解决方案是创建一个扩展ListFragment 的新类并使用setListShown() 方法,但我不知道这是否是解决此问题的最佳方法。

谢谢

【问题讨论】:

    标签: android android-cursorloader android-loader


    【解决方案1】:

    在您的布局文件中添加一个小的 ProgressBar,并将其可见性设置为“已消失”。在创建 CursorLoader 之前,将其可见性设置为“可见”。它会出现。在 onLoadFinished 中,将 ProgressBar 可见性设置为“已消失”。它会消失,你的 ListView 会加载。

    我会使用小型进度条。要了解更多信息,请参阅 android.widget.ProgressBar 的参考文档。

    顺便说一句,可见性由 View.setVisibility 控制。

    【讨论】:

    • 您的回答帮助我获得了this example。我相信这是最简单的方法。谢谢
    【解决方案2】:

    除了正确答案:在onLoadFinished() 中进行此检查是个好主意:

    if (cursor.getCount() > 0) {
      getView().findViewById(R.id.loadingPanel).setVisibility(View.GONE);
      getView().findViewById(android.R.id.list).setVisibility(View.VISIBLE);
    }
    

    否则,如果依靠您的 curstomService 来填充数据库,则光标可能为空,结果将是没有进度条,也没有显示项目的列表。

    【讨论】:

    • 无限显示加载器不是一个好主意,而是在 getCount()==0 时显示正确的消息“找不到记录”
    【解决方案3】:

    我在 listView 中有一个 costumCursorAdapter。

    当数据库中的数据发生变化时,我还有一个 cursorLoader 来交换 costumCursorAdapter。数据库数据由用户发起的搜索输入。

    这些建议都没有奏效,Google 也帮不上什么忙 - 一旦设置为可见,进度条就没有任何停止 - i.e. progress_bar.setVisibility(View.Gone);

    最终,作为一个简单且“仅适用于现在”的解决方案-

    1. 我创建了一个全局变量来充当计数器int count = 0。 每次搜索都会将其重置为 0(在按钮的 onClick 方法中)。
    2. 在 customAdapter 的 bindView 中,在此代码块的底部 - 我使用 count ++ 启动了计数。
    3. 在代码块的顶部,我检查计数是否达到 4。如果是,我隐藏进度条:

              if (count==4){
              pb.setVisibility(View.GONE);
          }
      
    4. 这样,当customAdapter绑定第4个视图时,我知道停止进度条是合理的。

    5. 我的清单上从来没有少于 4 项。

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2011-08-16
      • 2011-09-29
      相关资源
      最近更新 更多