【发布时间】:2018-03-23 03:23:46
【问题描述】:
我在我的应用程序中使用RecyclerView 和Sqlite。
因为我已经从SQlite 加载了RecyclerView,而不是在后台调用服务后,并尝试通过notifyDataSetChanged() 方法通知RecyclerView,但是在滚动RecyclerView(当RecyclerView 是更新或通知)。
请检查我用来通知的setAdapter() 并将适配器设置为RecyclerView
private void setAdapter() {
if (adapter == null) {
adapter = new EmojiAdapter(stickerArrayList, getActivity(), "Sticker", stickerIdArrayList);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
rvEmoji.setLayoutManager(mLayoutManager);
rvEmoji.setItemAnimator(new DefaultItemAnimator());
rvEmoji.setAdapter(adapter);
} else {
adapter.notifyDataSetChanged();
}
}
RecyclerView.stopScroll()、RecyclerView.getRecycledViewPool().clear()我都试过了,但问题不短
例外
java.lang.IndexOutOfBoundsException:检测到不一致。无效的项目位置 21(offset:21).state:32 在 android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5546) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5482) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5478) 在 android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2215) 在 android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1542) 在 android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1502) 在 android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1316) 在 android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1061) 在 android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4769) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 在 android.view.Choreographer.doCallbacks(Choreographer.java:574) 在 android.view.Choreographer.doFrame(Choreographer.java:543) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5095) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 在 dalvik.system.NativeStart.main(Native Method)
有很多类似的问题,但我没有得到预期的结果。这是我在此处发布问题之前访问过的链接。
1. First link
2. Second link
3. Third link
4. Forth link
5. Fifth link
6. Sixth link
我已经访问了所有链接并尝试了他们的最佳解决方案,但它对我不起作用..
我正在为 RecyclerView 使用以下 gradle 版本
compile 'com.android.support:recyclerview-v7:26.+'
请检查我使用的适配器类如下:-
public class EmojiAdapter extends RecyclerView.Adapter<EmojiAdapter.MyViewHolder> {
private Activity activity;
private HashMap<String, ArrayList<EmojiBean>> arrayList = new HashMap<>();
private String sticker_emoji;
private ArrayList<String> keyArrayList = new ArrayList<>();
public class MyViewHolder extends RecyclerView.ViewHolder {
private RecyclerView rvItemCreation;
private TextView txtStickerName, txtBy, txtCreator;
private ImageView imgForward, imgDownload;
private MyViewHolder(View view) {
super(view);
rvItemCreation = (RecyclerView) view.findViewById(R.id.rvItemCreation);
txtStickerName = (TextView) view.findViewById(R.id.txtStickerName);
txtBy = (TextView) view.findViewById(R.id.txtBy);
txtCreator = (TextView) view.findViewById(R.id.txtCreator);
imgForward = (ImageView) view.findViewById(R.id.imgForward);
imgDownload = (ImageView) view.findViewById(R.id.imgDownload);
txtStickerName.setTypeface(Constant.setCustomFont(activity, "Montserrat-SemiBold.otf"));
txtBy.setTypeface(Constant.setCustomFont(activity, "Montserrat_Regular.otf"));
txtCreator.setTypeface(Constant.setCustomFont(activity, "Montserrat_Regular.otf"));
}
}
public EmojiAdapter(HashMap<String, ArrayList<EmojiBean>> arrayList, Activity activity, String sticker_emoji, ArrayList keyArrayList) {
this.arrayList = arrayList;
this.activity = activity;
this.sticker_emoji = sticker_emoji;
this.keyArrayList = keyArrayList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_media_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
if (sticker_emoji.equalsIgnoreCase("Sticker")) {
holder.imgForward.setImageResource(R.drawable.forward_icon);
} else {
holder.imgForward.setImageResource(R.drawable.delete_icon);
}
if (arrayList.size() > position) {
MyCreationItemAdapter mAdapter = new MyCreationItemAdapter(arrayList.get(keyArrayList.get(position)), activity);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false);
holder.rvItemCreation.setLayoutManager(mLayoutManager);
holder.rvItemCreation.setItemAnimator(new DefaultItemAnimator());
holder.rvItemCreation.setAdapter(mAdapter);
}
}
@Override
public int getItemCount() {
return arrayList.size();
}
}
请帮我解决这个问题。谢谢
更新
我做了什么来解决这个冲突,我在加载数据时禁用了用户界面(显示一些进度条)。
【问题讨论】:
-
你的适配器在哪里?
-
你也需要看看吗??..我会照你说的发帖
-
是的,它会帮助我:D
-
请检查问题..我已经编辑它..让我知道
-
在连接到适配器和适配器内部之前检查您的数组列表大小
标签: java android android-recyclerview