0

I want to load data (images from bitmap in app resources) in order. But getting deadline error, how can I do that. I used StickyHeaderGridAdapter (Advanted RecyclerAdapter) and simple RecyclerView widget.

Sometimes the processes do not work in order, I did not understand what caused this problem. I would be glad if anyone could explain.

(I know AsyncTask is deprecated)

Log:

 --------- 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, parent, 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:

AsyncTask<Void, Integer, Void> task = new AsyncTask<Void, Integer, 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();

init function:

 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);
    }

0 Answers0