当前位置: 首页 > 知识库问答 >
问题:

Android:问题删除回收人员视图中的最后一项

危璞
2023-03-14

我以以下方式使用RecyclView来显示在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/count tIsZero: true(内部刷新PlacesData())

共有2个答案

吴高畅
2023-03-14

解决。。

当我删除最后一项时,数据计数会变成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;
        }

奇怪的是,这里唯一发生的事情就是<code>这个。notifyDataSetChanged() ,但如果我以这种方式使用它并跳过调用<code>swaplaces(),它将不起作用,即

if (data.getCount() == 0) {
            Log.d("countIsZero","true");
            mAdapter.notifyDataSetChanged();
            return;
        }

不工作。

姚文轩
2023-03-14

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

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

或者,你应该改变顺序

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

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

 类似资料:
  • 这是不是意味着我没有刷新我的适配器还是什么? @重写公共void onDeleteClick(int position){FoodInfo selectedItem; 食物适配器 } 这是我删除项目后的删除方法,它仍然存在于我的回收视图中,并在firebase中消失 我必须离开这个页面并再次访问,然后它只显示与firebase完全相同的项目 有人帮忙吗?

  • 我正在尝试删除空列项目装饰,如下图所示。我最初想在注释中使用下面的代码根据内容限制最后一行的跨距计数,但我没有成功。 以下是代码和图像的结果。 当我取消注释代码并运行应用程序时,结果如下: 任何代码参考或链接都会有所帮助。提前感谢。

  • 我已经被困在这个问题上几天了,真的需要一些帮助和理解如何用DiffUtil设置RecylerView(RV),似乎无论我尝试什么,我都无法让RV更新。我会浏览我所拥有的,希望有人能解释一下我做错了什么。 应用程序启动 创建视图模型, 然后在ViewModel中填充LiveDataList。 LayoutManager和ListAdapter应用于RV 为什么在LiveDataList中添加或删除一

  • 我有一个endless Recycler视图,其中包含使用JSoup从一个在线论坛线程中提取的数据。recyclerview将不断填充自己,直到用户到达最后一页。我想膨胀一个“端视图”,一旦用户到达最后一页,滚动到最后一个可见的项目,但我无法检索它。 我尝试使用getItemCount()和findLastVisibleItemPotion()从回收器视图linearlayoutManager。它

  • 是否可以将可展开的列表项与新的 RecyclerView 一起使用?喜欢 ExpandableListView?

  • 我有一个像相册这样的项目列表,我通过RecyclerView显示它。 此外,每个项目都有一个按钮,通过单击该按钮可以向服务器发送一些数据,然后滚动到列表中的下一个位置。 所以我的问题是: 如果调用了smoothScrollToPosition()方法,如何防止RecyclerView手动滚动(手势),但滚动到某个位置?