recyclerview Sin adaptador conectado; diseño de omisión
Acabo de implementar Recyclerview en mi código, reemplazando Listview.
Todo funciona bien. Se muestran los objetos.
Pero logcat dice
15:25:53.476 E / RecyclerView No Sin adaptador conectado; diseño de salto
15:25:53.655 E / RecyclerView No Sin adaptador conectado; diseño de salto
Para el código
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Como puede ver, he adjuntado un adaptador para Recycleview. entonces, ¿por qué sigo recibiendo este error?
I ha leído otras preguntas relacionadas con el mismo problema, pero ninguna ayuda.
24 answers
Puede asegurarse de que está llamando a estas instrucciones desde el hilo "principal" (por ejemplo, dentro del método onCreate()
).
Tan pronto como llame a las mismas declaraciones de un método "retardado". En mi caso a ResultCallback
, recibo el mismo mensaje.
En mi Fragment
, llamar al siguiente código desde dentro de un método ResultCallback
produce el mismo mensaje. Después de mover el código al método onConnected()
dentro de mi aplicación, el mensaje desapareció...
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-05 07:52:37
Estaba recibiendo los mismos dos mensajes de error hasta que arreglé dos cosas en mi código:
(1) De forma predeterminada, cuando implementa métodos en el RecyclerView.Adapter
genera:
@Override
public int getItemCount() {
return 0;
}
Asegúrate de actualizar tu código para que diga:
@Override
public int getItemCount() {
return artists.size();
}
Obviamente, si tiene cero elementos en sus elementos, entonces obtendrá cero cosas que se muestran en la pantalla.
(2) No estaba haciendo esto como se muestra en la respuesta superior: CardView layout_width= "match_parent" no coincide con el padre RecyclerView anchura
//correct
LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_listitem, parent, false);
//incorrect (what I had)
LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_listitem,null);
(3) EDITAR: BONUS:
También asegúrese de configurar su RecyclerView
de esta manera:
<android.support.v7.widget.RecyclerView
android:id="@+id/RecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
NO así:
<view
android:id="@+id/RecyclerView"
class="android.support.v7.widget.RecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
He visto algunos tutoriales usando este último método. Mientras funciona creo que genera este error también.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-13 11:27:13
Tengo la misma situación con usted, la pantalla está bien, pero el error aparece en el locat. Esa es mi solución: (1) Inicialice el adaptador RecyclerView & bind EN CREATE ()
RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid);
mRecycler.setAdapter(adapter);
(2) llame a notifyDataStateChanged cuando obtenga los datos
adapter.notifyDataStateChanged();
En el código fuente de RecyclerView, hay otro subproceso para verificar el estado de los datos.
public RecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.mObserver = new RecyclerView.RecyclerViewDataObserver(null);
this.mRecycler = new RecyclerView.Recycler();
this.mUpdateChildViewsRunnable = new Runnable() {
public void run() {
if(RecyclerView.this.mFirstLayoutComplete) {
if(RecyclerView.this.mDataSetHasChangedAfterLayout) {
TraceCompat.beginSection("RV FullInvalidate");
RecyclerView.this.dispatchLayout();
TraceCompat.endSection();
} else if(RecyclerView.this.mAdapterHelper.hasPendingUpdates()) {
TraceCompat.beginSection("RV PartialInvalidate");
RecyclerView.this.eatRequestLayout();
RecyclerView.this.mAdapterHelper.preProcess();
if(!RecyclerView.this.mLayoutRequestEaten) {
RecyclerView.this.rebindUpdatedViewHolders();
}
RecyclerView.this.resumeRequestLayout(true);
TraceCompat.endSection();
}
}
}
};
En dispatchLayout (), podemos encontrar que hay un error en él:
void dispatchLayout() {
if(this.mAdapter == null) {
Log.e("RecyclerView", "No adapter attached; skipping layout");
} else if(this.mLayout == null) {
Log.e("RecyclerView", "No layout manager attached; skipping layout");
} else {
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 08:03:23
Tengo este problema, un problema de tiempo es RecycleView poner en ScrollView objeto
Después de verificar la implementación, la razón parece ser la siguiente. Si RecyclerView se coloca en un ScrollView, entonces durante el paso de medida su altura no se especifica (porque ScrollView permite cualquier altura) y, como resultado, obtiene igual a la altura mínima (según la implementación) que es aparentemente cero.
Tienes un par de opciones para arreglar esto:
- Establecer un cierto altura a RecyclerView
- Establecer ScrollView.fillViewport a true
- O mantenga RecyclerView fuera de ScrollView. En mi opinión, esta es la mejor opción por lejos. Si la altura de RecyclerView no está limitada, que es el caso cuando se coloca en ScrollView, entonces todas las vistas del Adaptador tienen suficiente lugar verticalmente y se crean todas a la vez. No hay reciclaje de vista más que rompe un poco el propósito de RecyclerView .
(Se puede seguir para android.support.v4.widget.NestedScrollView
también)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-23 01:35:12
1) Crear ViewHolder que no hace nada :)
// SampleHolder.java
public class SampleHolder extends RecyclerView.ViewHolder {
public SampleHolder(View itemView) {
super(itemView);
}
}
2) De nuevo crear RecyclerView que no hace nada :)
// SampleRecycler.java
public class SampleRecycler extends RecyclerView.Adapter<SampleHolder> {
@Override
public SampleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(SampleHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
3) Ahora, cuando su reciclador real no está listo, solo use la muestra como la siguiente.
RecyclerView myRecycler = (RecyclerView) findViewById(R.id.recycler_id);
myRecycler.setLayoutManager(new LinearLayoutManager(this));
myRecycler.setAdapter(new SampleRecycler());
Esta no es la mejor solución, pero funciona! Espero que esto sea útil.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-25 09:30:49
Sucede cuando no está configurando el adaptador durante la fase de creación:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
....
}
public void onResume() {
super.onResume();
mRecyclerView.setAdapter(mAdapter);
....
}
Simplemente mueva la configuración del adaptador a onCreate con datos vacíos y cuando tenga la llamada de datos:
mAdapter.notifyDataSetChanged();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-04 08:09:34
Asegúrese de configurar el administrador de diseño para su RecyclerView de la siguiente manera:
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
En lugar de LinearLayoutManager
, puede usar otros administradores de diseño también.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-16 09:00:35
Tuve el mismo error que lo arreglé haciendo esto si está esperando datos como yo usando retrofit o algo así
Poner antes de Oncreate
private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;
Ponlos en tu Oncreate
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);
Cuando reciba datos ponga
adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);
Ahora vaya a su clase ArtistArrayAdapter y haga esto lo que hará es si su matriz está vacía o es nula hará que getItemCount devuelva 0 si no lo hará del tamaño de artists array
@Override
public int getItemCount() {
int a ;
if(artists != null && !artists.isEmpty()) {
a = artists.size();
}
else {
a = 0;
}
return a;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-19 07:08:35
Estas Líneas deben estar en OnCreate
:
mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 10:22:03
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
Simplemente reemplace el código anterior con esto y debería funcionar. Lo que hizo mal es que llamó a setAdapter (adaptador) antes de llamar a layout manager.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-08 12:14:03
Esto es realmente un error simple que está recibiendo, no hay necesidad de hacer ningún código en esto. Este error se produce debido al archivo de diseño incorrecto utilizado por la actividad. Por IDE creé automáticamente una maquetación v21 de una maquetación que se convirtió en una maquetación predeterminada de la actividad. todos los códigos que hice en el archivo de diseño antiguo y el nuevo solo tenía pocos códigos xml, lo que llevó a ese error.
Solución: Copie todos los códigos de la maquetación antigua y péguelos en maquetación v 21
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-31 12:25:11
En mi caso, estaba configurando el adaptador dentro de onLocationChanged()
devolución de llamada Y depuración en el emulador. Como no detectó un cambio de ubicación, nunca disparó. Cuando los configuré manualmente en los controles extendidos del emulador funcionó como se esperaba.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-24 19:51:28
He resuelto este error. Solo necesita agregar el administrador de diseño y añadir el adaptador vacío.
Como este código:
myRecyclerView.setLayoutManager(...//your layout manager);
myRecyclerView.setAdapter(new RecyclerView.Adapter() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
});
//other code's
// and for change you can use if(mrecyclerview.getadapter != speacialadapter){
//replice your adapter
//}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-19 11:03:59
Esto sucede porque el diseño inflado real es diferente del que está siendo referido por usted mientras encuentra el RecyclerView. De forma predeterminada, al crear el fragmento, el método onCreateView aparece de la siguiente manera:
return inflater.inflate(R.layout.<related layout>,container.false);
En lugar de eso, cree por separado la vista y use eso para referirse a RecyclerView
View view= inflater.inflate(R.layout.<related layout>,container.false);
recyclerview=view.findViewById(R.id.<recyclerView ID>);
return view;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-22 20:03:24
Primero inicialice el adaptador
public void initializeComments(){
comments = new ArrayList<>();
comments_myRecyclerView = (RecyclerView) findViewById(R.id.comments_recycler);
comments_mLayoutManager = new LinearLayoutManager(myContext);
comments_myRecyclerView.setLayoutManager(comments_mLayoutManager);
updateComments();
getCommentsData();
}
public void updateComments(){
comments_mAdapter = new CommentsAdapter(comments, myContext);
comments_myRecyclerView.setAdapter(comments_mAdapter);
}
Cuando haya un cambio en el conjunto de datos, simplemente llame al método updateComments.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-19 06:38:24
En mi situación era un componente olvidado que se localiza en la clase ViewHolder pero no se encuentra en el archivo de diseño
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-29 23:08:32
Tuve el mismo problema y me di cuenta de que estaba configurando el LayoutManager y el adapter después de recuperar los datos de mi fuente en lugar de establecer los dos en el método onCreate.
salesAdapter = new SalesAdapter(this,ordersList);
salesView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
salesView.setAdapter(salesAdapter);
Luego notificó al adaptador sobre el cambio de datos
//get the Orders
Orders orders;
JSONArray ordersArray = jObj.getJSONArray("orders");
for (int i = 0; i < ordersArray.length() ; i++) {
JSONObject orderItem = ordersArray.getJSONObject(i);
//populate the Order model
orders = new Orders(
orderItem.getString("order_id"),
orderItem.getString("customer"),
orderItem.getString("date_added"),
orderItem.getString("total"));
ordersList.add(i,orders);
salesAdapter.notifyDataSetChanged();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-22 11:39:19
Este problema se debe a que no está agregando ningún LayoutManager
para su RecyclerView
.
Otra razón es porque estás llamando a este código en un NonUIThread. Asegúrese de llamar a esta llamada en el UIThread.
La solución es que solo tienes que agregar un LayoutManager
para el RecyclerView
antes de setAdapter
en el subproceso de interfaz de usuario.
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-26 14:52:24
Mi problema era que mi vista de reciclador se veía así
<android.support.v7.widget.RecyclerView
android:id="@+id/chatview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
</android.support.v7.widget.RecyclerView>
Cuando debería haberse visto así
<android.support.v7.widget.RecyclerView
android:id="@+id/chatview"
android:layout_width="395dp"
android:layout_height="525dp"
android:layout_marginTop="52dp"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="8dp"></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-29 02:02:37
En su clase adaptador RecyclerView
, por ejemplo MyRecyclerViewAdapter
, haga un constructor con los siguientes parámetros.
MyRecyclerViewAdapter(Context context, List<String> data) {
this.mInflater = LayoutInflater.from(context); // <-- This is the line most people include me miss
this.mData = data;
}
mData
son los datos que pasará al adaptador. Es opcional si no tiene datos que pasar.
mInflater
es el objeto LayoutInflater
que ha creado y utiliza en la función OnCreateViewHolder
del adaptador.
Después de esto, adjunte el adaptador en la actividad principal o donde quiera en el subproceso principal/UI correctamente como
MyRecyclerViewAdapter recyclerAdapter;
OurDataStuff mData;
....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Like this:
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerAdapter = new RecyclerAdapter(this, mData); //this, is the context. mData is the data you want to pass if you have any
recyclerView.setAdapter(recyclerAdapter);
}
....
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-22 19:16:01
Resuelto estableciendo la lista vacía inicializada y el adaptador en la parte inferior y llamando a notifyDataSetChanged cuando se obtienen los resultados.
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
recyclerviewItems.setLayoutManager(linearLayoutManager);
someAdapter = new SomeAdapter(getContext(),feedList);
recyclerviewItems.setAdapter(someAdapter);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-17 23:33:59
Perdí 16 minutos de mi vida con este problema, así que solo admitiré este error increíblemente embarazoso que estaba cometiendo: estoy usando Butterknife y enlazo la vista en onCreateView en este fragmento.
Tomó mucho tiempo averiguar por qué no tenía layoutmanager, pero obviamente las vistas se inyectan para que en realidad no sean nulas, por lo que el reciclador nunca será nulo .. whoops!
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
@Override
public View onCreateView(......) {
View v = ...;
ButterKnife.bind(this, v);
setUpRecycler()
}
public void setUpRecycler(Data data)
if (recyclerView == null) {
/*very silly because this will never happen*/
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
//more setup
//...
}
recyclerView.setAdapter(new XAdapter(data));
}
Si tiene un problema como este, rastree su vista y use algo como uiautomatorviewer
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-04 16:26:05
Para aquellos que usan el RecyclerView
dentro de un fragmento y lo inflan desde otras vistas: al inflar toda la vista de fragmento, asegúrese de vincular el RecyclerView
a su vista raíz.
Estaba conectando y haciendo todo para el adaptador correctamente, pero nunca hice el enlace. Esta respuesta de @Prateek Agarwal lo tiene todo para mí, pero aquí hay más elaboración.
Kotlin
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val rootView = inflater?.inflate(R.layout.fragment_layout, container, false)
recyclerView = rootView?.findViewById(R.id.recycler_view_id)
// rest of my stuff
recyclerView?.setHasFixedSize(true)
recyclerView?.layoutManager = viewManager
recyclerView?.adapter = viewAdapter
// return the root view
return rootView
}
Java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView= inflater.inflate(R.layout.fragment_layout,container.false);
recyclerview= rootView.findViewById(R.id.recycler_view_id);
// rest ...
return rootView;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-04 09:12:52
No es una gran respuesta, pero yo también estaba teniendo el mismo problema, incluso con el código correcto. A veces, es la más simple de las marcas. En este caso, el error del OP también puede faltar <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
en el Manifiesto, que reproduce el mismo error.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 05:40:20