我以下列方式使用RecyclerView
来显示在 SQLite DB 中更新的商品项列表。
项目被删除正确并在我滑动时更新。 但是当我滑动删除最后一项时,它会返回到视图中。当我关闭应用程序并重新打开应用程序时,该项目将被删除。
但是当项目被刷到要删除时,在该应用程序运行的实例中,即使多次滑动,该项目也不会从视图中删除。
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
int swipedPosition = viewHolder.getAdapterPosition();
PlaceListAdapter adapter = (PlaceListAdapter) mRecyclerView.getAdapter();
int pos = viewHolder.getAdapterPosition();
// Build appropriate uri with String row id appended
String stringId = places.get(pos).getId();
Log.d("testhro", stringId);
Uri uri = PlaceContract.PlaceEntry.CONTENT_URI;
uri = uri.buildUpon().appendPath(stringId).build();
Log.d("testhhd", uri.toString());
// COMPLETED (2) Delete a single row of data using a ContentResolver
getContentResolver().delete(uri, null, null);
mAdapter.notifyDataSetChanged();
refreshPlacesData();
}
refreshPlacesData()
private void refreshPlacesData() {
Uri uri = PlaceContract.PlaceEntry.CONTENT_URI;
Cursor data = getContentResolver().query(
uri,
null,
null,
null,
null);
if (data == null || data.getCount() == 0) return;
Log.d("countIs", String.valueOf(data.getCount()));
List<String> guids = new ArrayList<String>();
while (data.moveToNext()) {
guids.add(data.getString(data.getColumnIndex(PlaceContract.PlaceEntry.COLUMN_PLACE_ID)));
}
PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.getPlaceById(mClient,
guids.toArray(new String[guids.size()]));
placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(@NonNull PlaceBuffer places) {
mAdapter.swapPlaces(places);
MainActivity.this.places = places;
mGeofencing.updateGeofencesList(places);
if (mIsEnabled) mGeofencing.registerAllGeofences();
}
});
}
我错过了什么吗?感谢。
编辑: 我尝试更新适配器而不是mAdapter,但仍然没有更改
编辑2
public void swapPlaces(PlaceBuffer newPlaces) {
mPlaces = newPlaces;
if (mPlaces != null) {
// Force the RecyclerView to refresh
this.notifyDataSetChanged();
}
}
注意:我还验证了记录器:
D / countIsZero:true(在refreshPlacesData()内部)
答案 0 :(得分:0)
更改数据集后,您应该刷新View
。
MainActivity.this.places = places; // Data set changed
PlaceListAdapter adapter = (PlaceListAdapter) mRecyclerView.getAdapter();
adapter.notifyDataSetChanged();
或者你应该改变
的顺序 mAdapter.notifyDataSetChanged(); // Notify later
refreshPlacesData(); // Refresh first
首先更改数据集,然后通知适配器。
答案 1 :(得分:0)
解决..
当我删除最后一项时,数据计数将变为0,在这种情况下我当前正在返回。
所以不是这样,以下是我在refreshPlacesData()中添加的内容:
if (data.getCount() == 0) {
Log.d("countIsZero","true");
mAdapter.swapPlaces(null);
return;
}
和
public void swapPlaces(PlaceBuffer newPlaces) {
mPlaces = newPlaces;
if(mPlaces==null)
{
Log.d("mPlaceNull","true");
this.notifyDataSetChanged();
return;
}
奇怪的是,这里发生的事情只是在适配器对象上调用this.notifyDataSetChanged();
,但如果我这样使用它并跳过调用swapPlaces()
,它就不起作用了,即
if (data.getCount() == 0) {
Log.d("countIsZero","true");
mAdapter.notifyDataSetChanged();
return;
}
不起作用。