3

I am trying to remove an item from listview which is not starting a specific text "Dev". But the application is crashing when I remove an item and refresh the recycler list via notifydatasetChanged(). This question has been already asked and I have seen all the solutions but I can't find a proper solution to this.

EvelistAdapter.java

     public class EvelistAdater extends RecyclerView.Adapter<EvelistAdater.ViewHolder> {
    Context cxt;
    ArrayList<Dbbean> adapterlist;
    int row_index;
    public EvelistAdater(Context cxt, ArrayList<Dbbean> list) {
        adapterlist=list;
        this.cxt=cxt;
        Log.d("LIst count",""+adapterlist.size());
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.scanlistadp, viewGroup, false);
        return  new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {

        if(adapterlist.get(position).blename.startsWith("Dev")) {
            holder.tv_country.setText(adapterlist.get(position).blename);

        }else{
            removeAt(position);
        }
    }

    @Override
    public int getItemCount() {
        return adapterlist.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView tv_country;
        RelativeLayout layout;
        ImageView setting;
        public ViewHolder(View view) {
            super(view);
            tv_country = (TextView)view.findViewById(R.id.tshirtname);
            setting = (ImageView) view.findViewById(R.id.setting);
            layout = (RelativeLayout)view.findViewById(R.id.layout);
        }
    }
    public void removeAt(int position) {
        adapterlist.remove(position);
        notifyDataSetChanged();
    }
}

LOGCAT

E/UncaughtException: java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
                                                                        at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2586)
                                                                        at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeChanged(RecyclerView.java:4951)
                                                                        at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(RecyclerView.java:11371)
                                                                        at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(RecyclerView.java:11362)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.notifyItemChanged(RecyclerView.java:6650)
                                                                        at com.scanner.com.eve.EvelistAdater.removeAt(EvelistAdater.java:94)
                                                                        at com.scanner.com.eve.EvelistAdater.onBindViewHolder(EvelistAdater.java:44)
                                                                        at com.scanner.com.eve.EvelistAdater.onBindViewHolder(EvelistAdater.java:19)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6354)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6387)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5343)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5606)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5448)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5444)
                                                                        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)
                                                                        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)
                                                                        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
                                                                        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
                                                                        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3600)
                                                                        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3329)
                                                                        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3867)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:636)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                        at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2895)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171)
                                                                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931)
                                                                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
                                                                        at android.view.ViewR
Sekhar
  • 135
  • 1
  • 3
  • 9

3 Answers3

2

Filter the data in list before passing to Adapter

 ArrayList<Dbbean> list = yourlist; 

Create a filtered list

  ArrayList<Dbbean> filteredList = new ArrayList<>();
  for(Dbbean dbean : list){
    if(dbean.blename.startsWith("Dev")
     filteredList.add(dbean);
  }

Pass filtered list to Adapter

EvelistAdapter adapter = new EvelistAdaptr(this,filteredList);
yourRecyclerView.setAdapter(adapter);
Rajan Kali
  • 12,627
  • 3
  • 25
  • 37
1

Do not call removeItem inside onBindViewHolder directly. If you want to remove item then just do it before setting adapter.

Provide the filtered ArrayList<Dbbean> list to adpater in first place .Later you can remove item from adapter on any specified action.
Do not use notifyDataSetChanged() until you are not sure which dataset is changed. Use : notifyItemRemoved() for a particular item removed for position .

ADM
  • 20,406
  • 11
  • 52
  • 83
0

this is causing the problem you are just forcefully making changes to the onBindViewHolder which is drawing something right now again to redraw.

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {

    if(adapterlist.get(position).blename.startsWith("Dev")) {
        holder.tv_country.setText(adapterlist.get(position).blename);

    }else{
        removeAt(position);
    }
}

public void removeAt(int position) {
    adapterlist.remove(position);
    notifyDataSetChanged();
}

suggestion better check this condition and remove the items when you are about to notify the adapter from fragment or activity.

vikas kumar
  • 10,447
  • 2
  • 46
  • 52