Drakan x
Drakan x

Reputation: 25

Error Inconsistency detected. Invalid view holder adapter position myViewHolder (on roll back / return to prev activity)

I have this error that crash my app when i press return to my activity(that holds a recyclerview), all the data on the recyclerview is stored in FireBase

    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 3583
    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionmyViewHolder{eb86fdd position=29 id=-1, oldPos=0, pLpos:0 scrap [attachedScrap] tmpDetached no parent} androidx.recyclerview.widget.RecyclerView{b08b78a VFED..... ......I. 0,315-788,1731 #7f0a0202 app:id/recyclerview}, adapter:com.example.myapplication.ProgramAdapter@95e61fb, layout:androidx.recyclerview.widget.LinearLayoutManager@22c6218, context:com.example.myapplication.Chaves_PT@e97fec3
        at androidx.recyclerview.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:6156)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6339)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4255)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3680)
        at android.view.View.measure(View.java:25466)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481)
        at android.view.View.measure(View.java:25466)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:811)
        at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:466)
        at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
        at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:278)
        at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:120)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1594)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1708)
        at android.view.View.measure(View.java:25466)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1156)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:747)
E/AndroidRuntime:at android.view.View.measure(View.java:25466)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3397)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2228)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2486)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
        at android.view.Choreographer.doCallbacks(Choreographer.java:796)
        at android.view.Choreographer.doFrame(Choreographer.java:731)
        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)

my adapter code

public class ProgramAdapter extends FirebaseRecyclerAdapter<PTsModal,ProgramAdapter.myViewHolder>
{
    private Context context;

public ProgramAdapter(@NonNull  FirebaseRecyclerOptions<PTsModal> options)
{

    super(options);
    this.context = context;

}

    @Override
protected void onBindViewHolder(@NonNull myViewHolder holder, int position, @NonNull PTsModal model)
{

    holder.titulo.setText(model.getTitulo());
    holder.desc.setText(model.getDesc());
    Glide.with(holder.img1.getContext()).load(model.getImgurl())
            .placeholder(R.drawable.common_google_signin_btn_icon_dark)
            .error(R.drawable.common_google_signin_btn_icon_dark_focused)
            .into(holder.img1);
    holder.img1.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Log.v("Program","You clicked the image");
            Context context = view.getContext();
            Intent intent = new Intent(context, Webview.class);
            intent.putExtra("url",model.getUrl());
            context.startActivity(intent);
        }

    });
}

    @NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.box,parent,false);
    return new myViewHolder(view);

}

class myViewHolder extends RecyclerView.ViewHolder
{

    ImageView img1;
    TextView titulo, desc;

    public myViewHolder(@NonNull View itemView)
    {
        super(itemView);
        img1 = (ImageView)itemView.findViewById(R.id.imagem_box);
        titulo = (TextView) itemView.findViewById(R.id.txt_titulo);
        desc = (TextView) itemView.findViewById(R.id.txt_desc);

    }
}

}

my class

public class Boticas_TR extends AppCompatActivity implements ValueEventListener {
RecyclerView recyclerView;
ProgramAdapter  programadapter;
RecyclerView.LayoutManager layoutmanager;
DrawerLayout drawerLayout;
Toolbar toolbar;
NavigationView navigationView;

//private DatabaseReference txtMenu = databaseReference.child("txt_Menu");//Nome
//Indicar Titulo, descricao e imagem(mesmo tamanho)

TextView txt_Menu;
TextView txt_titulo_trilhos;

private FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
private DatabaseReference databaseReference = firebaseDatabase.getReference();
private DatabaseReference txtMenu = databaseReference.child("txt_Menu");//Nome
private DatabaseReference txtTituloTrilhos = databaseReference.child("txt_titulo_trilhos");//Nome
private WebView web_view;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.boticas_tr);

    //Menu e recyclerview
    web_view = findViewById(R.id.webview);
    recyclerView = findViewById(R.id.recyclerview);
    layoutmanager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutmanager);
    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationview);
    navigationView.setItemIconTintList(null);
    drawerLayout = findViewById(R.id.drawerlayout);
    setSupportActionBar(toolbar);
    navigationView = findViewById(R.id.navigationview);
    txt_Menu = findViewById(R.id.txt_Menu);
    toolbar = findViewById(R.id.toolbar);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
            R.string.navigration_open, R.string.navigration_close);
    drawerLayout.addDrawerListener(toggle);
    toggle.syncState();
    layoutmanager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutmanager);
    recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    //Ligação à base de dados
    FirebaseRecyclerOptions<PTsModal> options = new FirebaseRecyclerOptions.Builder<PTsModal>()
            .setQuery(FirebaseDatabase.getInstance().getReference().child("TrsBoticas"), PTsModal.class).build();
    programadapter = new ProgramAdapter(options);
    recyclerView.setAdapter(programadapter);

    txt_Menu = findViewById(R.id.txt_Menu);
    txt_titulo_trilhos = findViewById(R.id.txt_titulo_trilhos);

}

//Base de dados buscar dados
@Override
protected void onStart()
{
    super.onStart();
    programadapter.startListening();

    txtMenu.addValueEventListener(this);
    txtTituloTrilhos.addValueEventListener(this);
}
public void onDataChange(DataSnapshot dataSnapshot)
{
    if (dataSnapshot.getValue(String.class) != null) ;
    {
        String key = dataSnapshot.getKey();
        if (key.equals("txt_Menu"))
        {
            String menu = dataSnapshot.getValue(String.class);
            txt_Menu.setText(menu);
        }
        if (key.equals("txt_titulo_trilhos"))
        {
            String trilhos = dataSnapshot.getValue(String.class);
            txt_titulo_trilhos.setText(trilhos);
        }
    }
}
        public void onCancelled(DatabaseError error)
        {

        }
@Override
protected void  onStop()
{
    super.onStop();
    programadapter.stopListening();
    txtMenu.addValueEventListener(this);
    txtTituloTrilhos.addValueEventListener(this);
}

Maybe i need to clear data first? already search in the Internet but nothing seams to work, i'm noob at programming just want to finish this App.

Upvotes: 0

Views: 6506

Answers (2)

Mandy
Mandy

Reputation: 57

Simply from the on start method include notify data set changed and get recycled view pool like below.

  @Override
    public void onStart() {
        super.onStart();
        recyclerView.getRecycledViewPool().clear();
       adapter.notifyDataSetChanged();
        adapter.startListening();
    }

Upvotes: 4

Drakan x
Drakan x

Reputation: 25

anyways i got the solution

 @Override
    protected void onStart()
    {
        super.onStart();
        recyclerView.getRecycledViewPool().clear();
        programadapter.startListening();
        txtMenu.addValueEventListener(this);
        txtTituloTrilhos.addValueEventListener(this);
        //Remove crash on press back
        recyclerView.getRecycledViewPool().clear();
        programadapter.notifyDataSetChanged();
        

    }

Upvotes: 0

Related Questions