6

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

我找到了一些如何使用 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()方法的新类,但我不知道这是否是解决此问题的最佳方法。

谢谢

4

3 回答 3

13

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

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

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

于 2013-04-18T18:12:43.357 回答
0

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

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

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

于 2014-08-24T20:49:40.067 回答
0

我在 listView 中有一个 costumCursorAdapter。

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

这些建议都没有奏效,谷歌也无济于事——一旦设置为可见,就没有什么能阻止进度条了—— i.e. progress_bar.setVisibility(View.Gone);

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

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

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

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

希望这可以帮助某人。

于 2016-11-30T21:23:52.780 回答