Android 变了

Android 变了,android,android-studio,android-recyclerview,Android,Android Studio,Android Recyclerview,因此,您需要做的是将要删除的元素与循环中mediaModels中的元素进行比较,以找到所需的确切位置,然后将该位置值放入: mediaModels.remove(i); (i)删去第(i)款; 我用targetElement替换方法参数position,并假设它是一个字符串,仅供说明,因此您的代码应该如下所示: public void removeData(String fileType, int id) { int position = -1; // no item found

因此,您需要做的是将要删除的元素与循环中mediaModels中的元素进行比较,以找到所需的确切位置,然后将该位置值放入:

mediaModels.remove(i);
(i)删去第(i)款;
我用targetElement替换方法参数position,并假设它是一个字符串,仅供说明,因此您的代码应该如下所示:

public void removeData(String fileType, int id) {
    int position = -1; // no item found
    for (int i = 0; i < mediaModels.size(); i++) {
      MediaModel model = mediaModels.get(i);
      if(model.getId() == id) {
         position = i;
         break; // we have found the item, so stop searching.
      }

      if(position >= 0) {
         mediaModels.remove(position);
         notifyItemRemoved(position);
      }
    }
}
public void removeData(字符串文件类型、字符串targetElement、上下文)
{

对于(int i=0;i代码中的问题是您试图通过positions从mediaModels访问数据。在某些情况下,这将导致索引越界异常,因为当您调用
mediaModels.remove(position)时
,它会从该位置移除元素并调整/移动其他元素,例如,如果我在mediaModels中有5个元素:汉堡、三明治、比萨饼、冰淇淋、热狗……并且我称之为mediaModels。移除(位置)位置为1时,这会移除三明治,并移动比萨饼、冰淇淋、热狗以填充空位置,因此现在mediaModels的大小为4,而不再是5。如果我调用
mediaModels.remove(位置)
位置为4时,由于mediaModels列表的大小已更改,因此会产生一个
索引AutofBoundsException

因此,您需要做的是将要删除的元素与循环中mediaModels中的元素进行比较,以找到所需的确切位置,然后将该位置值放入:

mediaModels.remove(i);
(i)删去第(i)款;
我用targetElement替换方法参数position,并假设它是一个字符串,仅供说明,因此您的代码应该如下所示:

public void removeData(String fileType, int id) {
    int position = -1; // no item found
    for (int i = 0; i < mediaModels.size(); i++) {
      MediaModel model = mediaModels.get(i);
      if(model.getId() == id) {
         position = i;
         break; // we have found the item, so stop searching.
      }

      if(position >= 0) {
         mediaModels.remove(position);
         notifyItemRemoved(position);
      }
    }
}
public void removeData(字符串文件类型、字符串targetElement、上下文)
{

对于(int i=0;ii)如果您想一次从RecyclerView中删除多个项目,您应该使用
notifyItemRangeRemoved()
,而不是一次只删除一个项目。发布一段您正在处理的数据,以便更好地澄清。@TheLower,如果我错了,请纠正我…
notifyItemRangeRemoved()
用于选择连续的项目范围,如1到5或4到9。但在我的情况下,选择可能不是连续的。我的意思是,可以在位置5、9和14选择3个项目(3个随机非连续项目)在这种情况下,范围是多少?如果您想一次从RecyclerView中删除多个项目,您应该使用
notifyItemRangeRemoved()
,而不是一次只删除一个项目。发布一段您正在处理的数据,以便更好地澄清。@TheLower,如果我错了,请纠正我…
notifyItemRangeRemoved()如果我选择一个连续的项目范围,如1到5或4到9,则使用
。但在我的情况下,选择可能是不连续的。我的意思是,可以在位置5、9和14选择3个项目(3个随机的非连续项目)。在这种情况下,范围是什么?我同意你的观点。但是使用
notifyItem的意图不是被删除了吗(位置);
移动这些项目?检查编辑的答案,顺便说一句,你绝对正确这就是notifyItemRemoved所做的。我同意你的观点。但是使用
notifyItemRemoved(位置);
移动这些项目的目的不是吗?检查编辑的答案,顺便说一句,你绝对正确这就是notifyItemRemoved所做的。
E/AndroidRuntime: FATAL EXCEPTION: main
                 Process: com.akl.alldrive, PID: 26558
                 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{f308d5b position=54 id=-1, oldPos=74, pLpos:54 scrap [attachedScrap] tmpDetached no parent} android.support.v7.widget.RecyclerView{7b12cb3 VFED.V... ......I. 0,147-1080,1857 #7f0a0099 app:id/list1}, adapter:jp.wasabeef.recyclerview.adapters.ScaleInAnimationAdapter@780c270, layout:android.support.v7.widget.GridLayoutManager@fb119e9, context:com.akl.alldrive.activities.BaseActivity@2c3cc96
                     at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)
                     at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)
                     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
                     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
                     at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
                     at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:557)
                     at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
                     at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
                     at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:171)
                     at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3875)
                     at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)
                     at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1888)
                     at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:407)
                     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
                     at android.view.Choreographer.doCallbacks(Choreographer.java:778)
                     at android.view.Choreographer.doFrame(Choreographer.java:710)
                     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
                     at android.os.Handler.handleCallback(Handler.java:789)
                     at android.os.Handler.dispatchMessage(Handler.java:98)
                     at android.os.Looper.loop(Looper.java:164)
                     at android.app.ActivityThread.main(ActivityThread.java:6798)
                     at java.lang.reflect.Method.invoke(Native Method)
                     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
                 Process: com.akl.alldrive, PID: 26558
                 java.lang.RuntimeException: An error occurred while executing doInBackground()
                     at android.os.AsyncTask$3.done(AsyncTask.java:353)
                     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
                     at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
                     at java.util.concurrent.FutureTask.run(FutureTask.java:271)
                     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
                     at java.lang.Thread.run(Thread.java:764)
                  Caused by: java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling android.support.v7.widget.RecyclerView{7b12cb3 VFED.V... ......I. 0,147-1080,1857 #7f0a0099 app:id/list1}, adapter:jp.wasabeef.recyclerview.adapters.ScaleInAnimationAdapter@780c270, layout:android.support.v7.widget.GridLayoutManager@fb119e9, context:com.akl.alldrive.activities.BaseActivity@2c3cc96
                     at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2880)
                     at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeRemoved(RecyclerView.java:5308)
                     at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeRemoved(RecyclerView.java:12032)
                     at android.support.v7.widget.RecyclerView$Adapter.notifyItemRemoved(RecyclerView.java:7231)
                     at com.akl.alldrive.adapters.MediaGridAdapter.removeData(MediaGridAdapter.java:60)
ArrayList<MediaModel> itemsToRemove = /* however you obtain your list of items to remove */;

medialModel.removeAll(itemsToRemove);

notifyDataSetChanged();
public class MediaModel {
  private int id;

  // your other data

  // setter and getter

}
public void removeData(String fileType, int id) {
    int position = -1; // no item found
    for (int i = 0; i < mediaModels.size(); i++) {
      MediaModel model = mediaModels.get(i);
      if(model.getId() == id) {
         position = i;
         break; // we have found the item, so stop searching.
      }

      if(position >= 0) {
         mediaModels.remove(position);
         notifyItemRemoved(position);
      }
    }
}