java - 安卓 : Issue deleting last item from RecyclerView

标签 java android sqlite android-recyclerview

我按以下方式使用 RecyclerView 来显示 SQLite DB 中更新的 Places 项目列表。

当我滑动这些项目时,它们会被很好地删除并更新。 但是当我滑动删除最后一项时,它又回到了 View 中。当我关闭应用程序并重新打开应用程序时,该项目已被删除。

但是当项目被滑动删除时,在应用程序运行的情况下,即使多次滑动,该项目也不会从 View 中删除。

@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()内)

最佳答案

更改数据集后,您应该刷新View

   MainActivity.this.places = places; // Data set changed
   PlaceListAdapter adapter = (PlaceListAdapter) mRecyclerView.getAdapter();
   adapter.notifyDataSetChanged();

或者你应该改变

的顺序
   mAdapter.notifyDataSetChanged(); // Notify later
   refreshPlacesData(); // Refresh first

首先更改数据集,然后通知适配器。

关于java - 安卓 : Issue deleting last item from RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45310556/

相关文章:

java - 如何组合多个 if (stringname.equals ("value"))?

php - PHP SQLite3Result::fetchArray重新执行查询

sql - 批量SQL插入

java - 当使用 TableCellRenderer 以 dd.mm.yyyy 格式显示本地日期时,我的 JTable 搜索功能无法按预期工作

java - 具有默认值的 Android 项目的 AndroidManifest.xml 文件中的错误

android - 在 DAO 查询方法中将 POJO 作为参数传递以更新列的子集?

java - 给出索引 4 处的绑定(bind)值为 null 的错误

java - JDBC:是否可以在java中执行多数据库查询?

java - 在没有文件 I/O 的情况下用 Java 压缩内容

java - java中如何知道何时克隆?