Android:从RecyclerView

时间:2017-07-25 17:59:30

标签: java android sqlite android-recyclerview

我以下列方式使用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()内部)

2 个答案:

答案 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;
        }

不起作用。