Android:AsyncTask 截止日期问题,同时通知 recyclerview 的 datasetchanged

问题描述

我想按顺序加载数据(应用资源中位图的图像)。但是收到截止日期错误,我该怎么做。我使用了 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 (将#修改为@)