问题描述
我想按顺序加载数据(应用资源中位图的图像)。但是收到截止日期错误,我该怎么做。我使用了 StickyHeaderGridAdapter(高级 RecyclerAdapter)和简单的 RecyclerView 小部件。
有时进程不按顺序工作,我不明白是什么导致了这个问题。如果有人能解释一下,我会很高兴。
(我知道 AsyncTask 已被弃用)
日志:
--------- beginning of crash
2021-03-01 00:10:11.413 8157-8157/com.koort.appsticky E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.koort.appsticky,PID: 8157
java.lang.indexoutofboundsexception: Invalid item position 95(95). Item count:95 androidx.recyclerview.widget.RecyclerView{d366f02 VFED...L. ......ID 0,542-1080,2097 #7f0a017f app:id/recycler},adapter:com.koort.appsticky.recyclerview.RecyclerAdapterInteraction_Test@38c1013,layout:com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager@13ad250,context:com.koort.appsticky.processes.InteractionProcess@f2f8e38
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6145)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager.fillBottomrow(StickyHeaderGridLayoutManager.java:509)
at com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager.addRow(StickyHeaderGridLayoutManager.java:716)
at com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager.scrollVerticallyBy(StickyHeaderGridLayoutManager.java:779)
at androidx.recyclerview.widget.RecyclerView.scrollStep(RecyclerView.java:1841)
at androidx.recyclerview.widget.RecyclerView.scrollByInternal(RecyclerView.java:1940)
at androidx.recyclerview.widget.RecyclerView.onTouchEvent(RecyclerView.java:3391)
at android.view.View.dispatchTouchEvent(View.java:14309)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3112)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2785)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
at com.android.internal.policy.DecorView.superdispatchTouchEvent(DecorView.java:488)
at com.android.internal.policy.PhoneWindow.superdispatchTouchEvent(PhoneWindow.java:1871)
at android.app.Activity.dispatchTouchEvent(Activity.java:4125)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:446)
at android.view.View.dispatchPointerEvent(View.java:14568)
at android.view.ViewRootImpl$ViewPostImeInputStage.processpointerEvent(ViewRootImpl.java:6016)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5819)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5310)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5367)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5333)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5485)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5341)
2021-03-01 00:10:11.414 8157-8157/com.koort.appsticky E/AndroidRuntime: at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5542)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5314)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5367)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5333)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5341)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5314)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8080)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8031)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7992)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8203)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:220)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:200)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:8160)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:8242)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:724)
at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
RecyclerAdapter:
public class RecyclerAdapterInteraction_Test extends StickyHeaderGridAdapter implements Filterable {
private List<List<mineObject>> labels;
private RecyclerAdapterInteraction_Test.OnItemClickListener mListener;
private List<List<mineObject>> listFull;
private Boolean searched = false;
private Activity context;
public interface OnItemClickListener {
void onItemClick(int itemPosition,int itemPositionAtSection,int itemSection,mineObject item,List<List<mineObject>> labels);
}
public void setonItemClickListener(RecyclerAdapterInteraction_Test.OnItemClickListener listener) {
mListener = listener;
}
public RecyclerAdapterInteraction_Test(Activity context) {
this.context = context;
labels = new ArrayList<>();
listFull = new ArrayList<>();
}
@Override
public int getSectionCount() {
return labels.size();
}
public List<List<mineObject>> getLabels() {
return labels;
}
@Override
public int getSectionItemCount(int section) {
return labels.get(section).size();
}
public void addSection(List<mineObject> list) {
this.labels.add(list);
setmRecyclerListFull(labels);
}
public void addLabel(List<mineObject> label) {
this.labels.add(label);
this.listFull.add(label);
}
public void addToLabel(int section,int position,mineObject mineObject) {
this.labels.get(section).add(position,mineObject);
this.listFull.get(section).add(position,mineObject);
}
public void setmRecyclerListFull(List<List<mineObject>> mRecyclerListFull) {
listFull = new ArrayList<>();
listFull.addAll(mRecyclerListFull);
}
public void setSearched(Boolean searched) {
this.searched = searched;
}
public List<List<mineObject>> getListFull() {
return listFull;
}
@Override
public Filter getFilter() {
return listFilter;
}
private Filter listFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
List<List<mineObject>> filteredList = new ArrayList<>();
if (charSequence == null || charSequence.length() == 0) {
filteredList.addAll(listFull);
} else {
String filterPattern = charSequence.toString().toLowerCase().trim();
for (List<mineObject> section : listFull) {
List<mineObject> items = new ArrayList<>();
for (int i = 0; i < section.size(); i++) {
mineObject item = section.get(i);
if (item.getName().toLowerCase().contains(filterPattern)) {
items.add(item);
}
}
if (items.size() > 0) {
filteredList.add(items);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence charSequence,FilterResults filterResults) {
labels.clear();
labels.addAll((List<List<mineObject>>) filterResults.values);
notifyAllSectionsDataSetChanged();
}
};
@Override
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent,int headerType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header,parent,false);
final RecyclerAdapterInteraction_Test.HeaderVHolder hHolder = new RecyclerAdapterInteraction_Test.HeaderVHolder(view);
return hHolder;
}
@Override
public ItemViewHolder onCreateItemViewHolder(ViewGroup parent,int itemType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,false);
final RecyclerAdapterInteraction_Test.ItemVHolder iHolder = new RecyclerAdapterInteraction_Test.ItemVHolder(view,mListener);
return iHolder;
}
@Override
public void onBindHeaderViewHolder(HeaderViewHolder viewHolder,int section) {
final RecyclerAdapterInteraction_Test.HeaderVHolder hHolder = (RecyclerAdapterInteraction_Test.HeaderVHolder) viewHolder;
String label = null;
if (searched) {
label = "Search Results";
} else {
switch (section) {
case 0:
label = "Interactions";
break;
default:
label = "nameless";
break;
}
}
hHolder.labelView.setText(label);
}
@Override
public void onBindItemViewHolder(ItemViewHolder viewHolder,final int section,final int position) {
final RecyclerAdapterInteraction_Test.ItemVHolder iHolder = (RecyclerAdapterInteraction_Test.ItemVHolder) viewHolder;
if (!labels.get(section).get(position).isInitialized()){ // optimization
labels.get(section).get(position).setinitialized(true);
}
iHolder.imageView.setimageBitmap(labels.get(section).get(position).getimage());
if(getItemCount() > iHolder.getAdapterPosition()){
iHolder.imageView.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final int section = getAdapterPositionSection(iHolder.getAdapterPosition());
final int offset = getItemSectionOffset(section,iHolder.getAdapterPosition());
mListener.onItemClick(iHolder.getAdapterPosition() - section - 1,offset,section,labels.get(section).get(position),labels);
}
});
}
}
public static class HeaderVHolder extends HeaderViewHolder {
TextView labelView;
public HeaderVHolder(View itemView) {
super(itemView);
labelView = itemView.findViewById(R.id.labelHeader);
}
}
public static class ItemVHolder extends ItemViewHolder {
ImageView imageView;
public ItemVHolder(View itemView,final RecyclerAdapterInteraction_Test.OnItemClickListener listener) {
super(itemView);
imageView = itemView.findViewById(R.id.itemImage);
}
}
}
异步任务:
AsyncTask<Void,Integer,Void> task = new AsyncTask<Void,Void>() {
@Override
protected Void doInBackground(Void... voids) {
P1419Farmland farmland = new P1419Farmland();
farmland.init(context);
interationList.add(0,farmland);
publishProgress(0,0); // 0: section,0: position
P1420NetherPortal netherPortal = new P1420NetherPortal();
netherPortal.init(context);
interationList.add(1,netherPortal);
publishProgress(0,1); // 0: section,1: position
P1452EK5ChargedRespawnAnchor chargedRespawnAnchor = new P1452EK5ChargedRespawnAnchor();
chargedRespawnAnchor.init(context);
interationList.add(2,chargedRespawnAnchor );
publishProgress(0,2); // 0: section,2: position
P1418CauldronFilled cauldronFilled = new P1418CauldronFilled();
cauldronFilled.init(context);
interationList.add(3,cauldronFilled);
publishProgress(0,3); // 0: section,3: position
.
.
.
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
int section = values[0];
int position = values[1];
adapter.notifySectionItemInserted(section,position);
}
};
task.execute();
初始化函数:
public void init(Context context) {
this.context = context;
int imgId = context.getResources().getIdentifier(imageName,"drawable",context.getPackageName());
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),imgId);
image = Bitmap.createBitmap(bitmap,x,y,size,size);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)