Reputation: 25
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
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
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