3

我通过启动多个加载器将数据从游标加载到列表视图中。我希望我的列表视图显示来自所有游标的数据,但列表视图中的数据以 2 秒的间隔立即更改,并且仅显示最后一个游标的数​​据。请帮我。我哪里出错了?我必须合并游标吗?

在我的片段的 onCreateView() 内部:

  for (int i = 0; i < idsArray.length; i++) {
        Bundle b = new Bundle();
        b.putInt("id", idsArray[i]);
        getLoaderManager().initLoader(idsArray[i], b, this);  //initiating multiple loaders
    }

    adapter = new CustomAdapter(getActivity(), R.layout.list_row, null, column_names_array, ui_ids_array, 0);
    listView.setAdapter(adapter);

和加载器回调方法:

@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle b) {
    Builder uriBuilder = MY_PROVIDER_URI.buildUpon();
    uriBuilder.appendPath("categories"); 
    uriBuilder.appendPath(String.valueOf(b.getInt("id")));  
    uriBuilder.appendPath("data");
    return new CursorLoader(getActivity(), uriBuilder.build(), null, null, null, null); 
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    if(adapter != null && data != null){ 
        adapter.swapCursor(data); 
        adapter.notifyDataSetChanged(); 
    } 
}

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

这是我的适配器类:

public class CustomAdapter extends SimpleCursorAdapter {
Cursor cursor;
Context context;
Activity activity;
int layout;

public CustomAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags ) {
    super(context, layout, c, from, to, flags);
    this.cursor = c;
    this.context = context;
    this.activity = (Activity) context;
    this.layout = layout;
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return LayoutInflater.from(context).inflate(this.layout, parent, false);
}    

@Override 
public void bindView(View view, Context context, Cursor cursor) {
    super.bindView(view, context, cursor);
    ViewHolder holder = (ViewHolder) view.getTag();
    if (holder == null) {
        holder = new ViewHolder();
        //finding UI elements in list row here
        view.setTag(holder);
        }  
         //binding data to views of viewholder here
     } 

    static class ViewHolder {
    //variables of all my UI elements
     }
  }
4

1 回答 1

2

你的循环:

for (int i = 0; i < idsArray.length; i++) {
    Bundle b = new Bundle();
    b.putInt("id", idsArray[i]);
    getLoaderManager().initLoader(idsArray[i], b, this);  //initiating multiple loaders
}

将导致创建多个加载器,一旦加载器完成加载其数据,该方法

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    if(adapter != null && data != null){ 
        // This line result in replacing the last Cursor by the new one
        adapter.swapCursor(data); 
        adapter.notifyDataSetChanged(); 
    } 
}

被调用。当最后一个 Loader 完成加载 Cursor 时,它的数据将替换最后一个 Cursor,因为swapCursor

如果您查看CursorAdapter文档,您会注意到此 CursorAdapter 一次只能管理一个 Cursor。

要解决您的问题,您应该尝试将所有想要的数据查询到一个查询中,从而产生一个 Cursor。

于 2013-06-13T08:57:18.813 回答