Web 服务同步后 ListView 未更新
ListView not updating after web service Sync
我已经实现了调用 webservice 和 insert/update 数据库的 SyncAdapter
。我想在 ListView
中显示其中一些数据,所以我在 中实现了 ListFragment
,数据通过 CursorAdapter
显示。一切正常,除了当我从网络获取新数据并将其插入数据库时,CursorAdapter
没有更新并且新数据没有显示在 ListView
中
在我的 ContentProvider
中,每次插入后我调用 context.getContentResolver().notifyChange(uri, null);
这是实现适配器的ListFragment
部分
mAdapter = new ObavijestiAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
这是我的自定义适配器
public class ObavijestiAdapter extends CursorAdapter {
private Cursor mCursor;
private Context mContext;
private final LayoutInflater mInflater;
static class ViewHolder {
public TextView hTextNaslov;
public TextView hTextOpis;
public ImageView hImage;
}
public ObavijestiAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mInflater = LayoutInflater.from(context);
mContext = context;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
final ViewHolder holder = (ViewHolder)view.getTag();
//TODO: REMOVE AFTER IMPLEMENTING REAL IMAGE
int w = 24, h = 24;
Bitmap.Config conf = Bitmap.Config.ARGB_8888; // see other conf types
Bitmap bmp = Bitmap.createBitmap(w, h, conf); // this creates a MUTABLE bitmap
//END REMOVE
holder.hImage.setImageBitmap(bmp);
holder.hTextNaslov.setText(cursor.getString(cursor.getColumnIndex(DataContract.Obavijesti.OBAVIJESTI_NASLOV)));
holder.hTextOpis.setText(cursor.getString(cursor.getColumnIndex(DataContract.Obavijesti.OBAVIJESTI_OPIS)));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view=mInflater.inflate(R.layout.fragment_obavijesti_row,parent,false);
final ViewHolder holder = new ViewHolder();
holder.hTextOpis = (TextView) view.findViewById(R.id.obOpis);
holder.hTextNaslov = (TextView) view.findViewById(R.id.obNaslov);
holder.hImage = (ImageView) view.findViewById(R.id.oblist_image);
view.setTag(holder);
return view;
}
有人可以帮我吗?
尝试在更新信息后使您正在使用的视图无效。
listview.invalidate();
我终于让它工作了。因此,对于任何试图做类似事情的人,您必须在 ContentProvider
中的 .query
之后包含 cursor.setNotificationUri(getContext().getContentResolver(), uri);
。就是这样...
但是如果您像我一样从 Web 服务接收数据,请记住不要将 .notifyDataSetChanged()
放在 ContentProvider .update/.insert/.delete
上,而是放在在 [=16= 中调用此方法的适配器上].在我的例子中
mContentResolver.applyBatch(ScheduleContract.CONTENT_AUTHORITY, batch);
mContentResolver.notifyChange(DataContract.Obavijesti.CONTENT_URI, null);
希望对某些人有所帮助
我已经实现了调用 webservice 和 insert/update 数据库的 SyncAdapter
。我想在 ListView
中显示其中一些数据,所以我在 中实现了 ListFragment
,数据通过 CursorAdapter
显示。一切正常,除了当我从网络获取新数据并将其插入数据库时,CursorAdapter
没有更新并且新数据没有显示在 ListView
在我的 ContentProvider
中,每次插入后我调用 context.getContentResolver().notifyChange(uri, null);
这是实现适配器的ListFragment
部分
mAdapter = new ObavijestiAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
这是我的自定义适配器
public class ObavijestiAdapter extends CursorAdapter {
private Cursor mCursor;
private Context mContext;
private final LayoutInflater mInflater;
static class ViewHolder {
public TextView hTextNaslov;
public TextView hTextOpis;
public ImageView hImage;
}
public ObavijestiAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mInflater = LayoutInflater.from(context);
mContext = context;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
final ViewHolder holder = (ViewHolder)view.getTag();
//TODO: REMOVE AFTER IMPLEMENTING REAL IMAGE
int w = 24, h = 24;
Bitmap.Config conf = Bitmap.Config.ARGB_8888; // see other conf types
Bitmap bmp = Bitmap.createBitmap(w, h, conf); // this creates a MUTABLE bitmap
//END REMOVE
holder.hImage.setImageBitmap(bmp);
holder.hTextNaslov.setText(cursor.getString(cursor.getColumnIndex(DataContract.Obavijesti.OBAVIJESTI_NASLOV)));
holder.hTextOpis.setText(cursor.getString(cursor.getColumnIndex(DataContract.Obavijesti.OBAVIJESTI_OPIS)));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view=mInflater.inflate(R.layout.fragment_obavijesti_row,parent,false);
final ViewHolder holder = new ViewHolder();
holder.hTextOpis = (TextView) view.findViewById(R.id.obOpis);
holder.hTextNaslov = (TextView) view.findViewById(R.id.obNaslov);
holder.hImage = (ImageView) view.findViewById(R.id.oblist_image);
view.setTag(holder);
return view;
}
有人可以帮我吗?
尝试在更新信息后使您正在使用的视图无效。
listview.invalidate();
我终于让它工作了。因此,对于任何试图做类似事情的人,您必须在 ContentProvider
中的 .query
之后包含 cursor.setNotificationUri(getContext().getContentResolver(), uri);
。就是这样...
但是如果您像我一样从 Web 服务接收数据,请记住不要将 .notifyDataSetChanged()
放在 ContentProvider .update/.insert/.delete
上,而是放在在 [=16= 中调用此方法的适配器上].在我的例子中
mContentResolver.applyBatch(ScheduleContract.CONTENT_AUTHORITY, batch);
mContentResolver.notifyChange(DataContract.Obavijesti.CONTENT_URI, null);
希望对某些人有所帮助