mi RecyclerView no llame onCreateViewHolder, onBindViewHolder, por lo tanto, no aparece nada en recyclerview. Puse los registros de depuración, y de registro no se muestra. ¿Que puede ser?

Mi adaptador:

public class CommentListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private static final int EMPTY_VIEW = 10 ;
private ArrayList<comment> mItems;
Boolean firstTime = true;
private Typeface mTf = null;
Context mContext;
public CommentListAdapter(Context context,ArrayList<comment> items){
Log.e("Adapter", "constructor Called");
this.mItems = items;
mContext = context;
}
public class EmptyViewHolder extends RecyclerView.ViewHolder {
public EmptyViewHolder(View itemView) {
super(itemView);
}
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView mAuthorName;
TextView mMessage;
NetworkImageView mThumbnail;
public ViewHolder(View itemView) {
super(itemView);
mAuthorName = (TextView)itemView.findViewById(R.id.author_name);
mMessage = (TextView)itemView.findViewById(R.id.message);
mThumbnail = (NetworkImageView)itemView.findViewById(R.id.author_avatar);
}
}
public void add(comment item, int position) {
mItems.add(position, item);
notifyItemInserted(position);
}
public void remove(comment item) {
int position = mItems.indexOf(item);
mItems.remove(position);
notifyItemRemoved(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
Log.e("Adapter", "onCreateViewHolder Called");
View v;
if(firstTime){
mTf = BBcTypeFace.getTypeFace(parent.getContext().getApplicationContext(),"font/bbc.ttf");
firstTime = false;
}
if( viewType == EMPTY_VIEW){
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.comment_empty_row,parent,false);
EmptyViewHolder evh = new EmptyViewHolder(v);
return evh;
}else {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.comment_row, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
Log.e("Adapter", "onBindViewHolder Called");
if(viewHolder instanceof ViewHolder) {
ViewHolder holder = (ViewHolder)viewHolder;
comment c = mItems.get(position);
Log.e("Adapter", "Comment is\n: " + c.toString());
final ViewHolder finalHolder = holder;
ImageRequest request = new ImageRequest(c.author_img_link, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
if (bitmap != null) {
finalHolder.mThumbnail.setImageBitmap(bitmap);
}
}
}, 0, 0, null,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
VolleyLog.e("ImageLoader", volleyError.getMessage());
VolleyLog.e("ImageLoader", volleyError.getStackTrace());
}
});
GetVideoInfo.getInstance(mContext.getApplicationContext()).addToRequestQueue(request);
holder.mAuthorName.setText(c.author_name);
holder.mMessage.setText(c.Message);
holder.mMessage.setTypeface(mTf);
holder.mAuthorName.setTypeface(mTf);
}
}
@Override
public int getItemCount() {
Log.e("Adapter", "getItemCount() Called");
return (mItems.size() > 0 ? mItems.size() : 1);
}
@Override
public int getItemViewType(int position) {
Log.e("Adapter", "getItemViewType() Called");
if (mItems.size() == 0) {
return EMPTY_VIEW;
}
return super.getItemViewType(position);
}}

Voy a utilizar public void add(comment item, int position){...} añadir elemento en RecyclerView.

en el Fragmento :

private RecyclerView mRecyclerView;
private CommentListAdapter mAdapter;
private LayoutManager mLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_item_detail, container, false);
....
mLayoutManager = new LinearLayoutManager(getActivity());
mAdapter = new CommentListAdapter(getActivity(),new ArrayList<comment>());
mRecyclerView = (RecyclerView)rootView.findViewById(R.id.comment_list);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
makeJsonObjectRequest(mItem.url);
return rootView;
}

Archivos XML :

<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/scrollView"
android:background="@android:color/white"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true">
....
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
.....
<android.support.v7.widget.RecyclerView
android:id="@+id/comment_list"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
....
</RelativeLayout>
....
</ScrollView>

comment_row archivo xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:gravity="right"
android:background="@android:color/darker_gray">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/author_name"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/author_avatar"
android:layout_toStartOf="@+id/author_avatar"
android:gravity="right" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/message"
android:layout_below="@+id/author_name"
android:layout_toLeftOf="@+id/author_avatar"
android:layout_toStartOf="@+id/author_avatar"
android:gravity="right" />
</LinearLayout>
<com.android.volley.toolbox.NetworkImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/author_avatar"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:minHeight="150dp"
android:minWidth="150dp" /></LinearLayout>

Voy a agregar elemento de RecyclerView con este código :

JsonObjectRequest jsonObjReqComment = new
JsonObjectRequest(Request.Method.GET,urlJsonObj+"#comment", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray res = response.getJSONArray("response");
//Log.e("Comment","Count:"+response.toString());
//Log.e("Comment","Count:"+res.length());
for (int i = 0; i < res.length(); i++) {
JSONObject thread = res.getJSONObject(i);
JSONObject author_json = thread.getJSONObject("author");
int dislikes = thread.getInt("dislikes");
int likes = thread.getInt("likes");
String Message = thread.getString("message");
//get Author info
String author_img_link = author_json.getJSONObject("avatar").getString("permalink");
String author_name = author_json.getString("name");
comment c = new comment(dislikes,likes,Message,author_img_link,author_name);
//Log.e("Comment",c.toString());
//commentsList.add(c);
mAdapter.add(c,0);
}
} catch (JSONException e) {
Log.e("OnResponse","Error JSON");
e.printStackTrace();
} catch (Exception e){
Log.e("OnResponse","Error Exception");
e.printStackTrace();
}
}
}
, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("vOLLEY", "Error: " + error.getMessage());
//hide the progress dialog
}
}
){
@Override
public Map<String, String> getHeaders(){
Map<String, String> headers = new HashMap<String, String>();
headers.put("User-agent", "Comment");
return headers;
}
};
  • Una fila coincidente de los padres en la anchura y la altura? Estás seguro de que quieres esto?
  • Usted incluso no llegar getItemCount ? Que es bastante raro. Además de eso, su vacío implementación de vista es erróneo. Cuando se agrega un elemento por primera vez, usted debe llamar primero a notifyItemRemoved(0), de modo que vd sabe elemento 0 es eliminado. También, su getItemViewType aplicación es bastante arriesgado como RV puede llamar mientras VACÍA de la vista es una parte de la interfaz de usuario, pero los nuevos elementos se acaba de agregar, así que esto es muy arriesgado. Yo sugeriría a tener un valor booleano en el adaptador que establece shouldEmpty vista y cuando se establece en false, usted debe llamar a notifyItemRemoved(0). Asegúrese de que sucede antes de la adición de elementos .
  • He cambiado a android:layout_width=»match_parent» android:layout_height=»wrap_content» , doesnt cambiar cualquier cosa
  • RecyclerView acaba de llamar getItemCount(), pero RecyclerView no llamar a otros Reemplazar métodos, trato de este código, sin EmptyViewHolder con datos Iniciales, pero tengo este problema, me disculpe, si mi inglés es pobre
  • Así que ni siquiera una llamada a onCreate o onBind de Vista VACÍA? también, hizo depurar si add se llama?
  • Creo que cuando getItemCount() devuelve 0, no llamar a otros métodos. Puede que nos muestran la parte en la que realmente la adición de elementos para el adaptador ?
  • sí, yo llame el método de adición de demasiado, y veo este problema
  • getItemCount() return >= 1, voy a actualizar mi pregunta.
  • Puedo añadir algo de código al final de mi pregunta.
  • Creo, que el problema es con esta línea : mAdapter.add(c,0); siempre estás añadiendo el elemento en la posición 0 que dice android que el elemento en la posición 0 ha cambiado y se trata de dibujar el 0 posición del elemento. Puedes intentar agregar algo como mAdapter.add(c,i);
  • nope, llamando a añadir(c, 0) sólo significa que va a agregar el nuevo elemento a la posición 0 y empujar a otros elementos hacia abajo (tan vacía de la vista se mueve a la posición 1).
  • Ah sí, lo siento, acabo de leer la documentación.
  • si puedes subir un proyecto de ejemplo, estoy feliz de tener una mirada en ella.
  • Existe una posibilidad de que Equivocado de Hilo de Excepción ? Dado que mAdapter.add(c,0); es posiblemente se llama desde un subproceso en segundo plano y la notifyItemInserted() método necesita para ejecutarse en el subproceso de interfaz de usuario ?
  • nope, Volley onResponse de ejecución principal (interfaz de usuario) de Hilo
  • su gran proyecto, yo no puedo subirlo,
  • Bueno, una última cosa. Compruebe la altura de su RV. Pruebe a establecer una altura fija. Tal vez la combinación de ScrollView, RL RV y hace que se tenga 0 de altura (lo que explicaría el no conseguir ningún punto de vista porque no hay espacio). No entiendo por qué tiene usted que la instalación de todos modos. Además de eso, no veo qué otra cosa iba mal. Si hubo un error en la RV como este, sería muy obvio y la superficie de la misma manera que antes.
  • disculpe soy nuevo en android de programación, lo que es RL y RV ? Gracias,
  • RL = relative layout RV = recyclerview

InformationsquelleAutor | 2015-01-23

8 Comentarios

  1. 36

    Como @yigit adivinar la combinación de ScrollView, RelativeLayout causas de este problema,
    Acaba de hacer más espacio para RecyclerView.

    • Gracias. Vista previa de los xml para asegurarse de que la papelera se mostrará la vista.
    • La mía no está dentro de un ScrollView, sin embargo, sigue teniendo este problema.
    • Yo tenía mi RecyclerView dentro de ConstraintLayout por lo que no fue llamar a cualquier adaptador de métodos. Loco 😡
  2. 183

    Otros que @SanatiSharif y @sohrab la respuesta, usted tiene que seguir a continuación paso obligatorio.

    Asegúrese de llamar setLayoutManager, algo como la siguiente.

    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    antes de configuración de adaptador en recyclerView, de lo contrario no va a funcionar.
    Usted puede personalizar si usted necesita.
    en este enlace le dará una idea de cómo LayoutManager obras.

    • Esta respuesta se merece más votos. Yo SIEMPRE te olvides de eso.
    • Mismo aquí, me olvido de esto todo el tiempo y, a continuación, busco lo que me couldve hecho mal y luego me terminan aquí, lol.
    • la pregunta es, ¿por qué es esto necesario? Esta respuesta soluciona mi problema, pero no sé por qué.
    • Gracias.Eso fue realmente útil.
    • Gracias, a mí me funciona.
    • Esta solucionado mi problema, pero ¿por qué es esto necesario?
    • Trabajó para mí gracias
    • También puede establecer esta vía XML: aplicación:layoutManager=»androidx.recyclerview.widget.LinearLayoutManager»
    • La cantidad de veces que he terminado de nuevo en esta respuesta (o_-)

  3. 19

    Si RecyclerView se coloca dentro de un ScrollView, durante medir el paso a su altura es indeterminado (porque ScrollView permite a cualquier altura) y se pone igual a altura mínima (según la aplicación), que aparentemente es cero.

    ref : android: RecyclerView dentro de un ScrollView

    Solución :
    – colocar las vistas en la fila de RecyclerViews
    – Calcular el tamaño de los elementos de la lista y establecer la altura de la ListView mediante programación
    http://vardhan-justlikethat.blogspot.com/2014/04/android-listview-inside-scrollview.html

  4. 7

    Podría haber sido un caso diferente, pero para mí simplemente me olvidé configurar el Gestor de Diseño como sigue:

    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recycler.setLayoutManager(layoutManager);

    Espero que ayude 🙂

  5. 5

    Su tarde, pero esperamos que ayude a alguno. pruebe una de las siguientes:

    primera solución:
    asegúrese de no utilizar esta línea innecesariamente

    recyclerView.setHasFixedSize(true);

    segunda solución:
    asegúrese de que establece administrador de diseño para recyclerView

    recycler.setLayoutManager(new LinearLayoutManager(this));

    tercera solución:
    usted getItemCount devuelve 0, por Lo que RecyclerView nunca intenta crear una instancia de una vista. Hacer es devolver algo mayor que 0

  6. 2

    En mi Caso yo estaba usando Fragmento-> ViewPager y Tablayout -> Dentro de viewpagers artículo he utilizado RecyclerView.

    Así que en Lugar de llamar a ViewPagerAdapter(getChildFragmentManager()) , me estaba llamando ViewPagerAdapter(getSupportFragmentManager()) , que es la razón por la que alguno de mis recycler elemento del adaptador no está recibiendo la llamada.

    De manera adecuada la forma para establecer el ViewPagerAdapter dentro de un fragmento

    ViewPagerAdapter(getChildFragmentManager())

    • Usted salvó mi día, muchas gracias !!!
  7. 1

    En mi caso, yo tenía esta estructura

    <ScrollView>
    <RelativeLayout>
    <android.support.v7.widget.RecyclerView/>
    </RelativeLayout>
    </ScrollView>

    he resuelto el problema de quitar Relativa

    <ScrollView>
    <android.support.v7.widget.RecyclerView/>
    </ScrollView>
  8. 1

    Es un poco tonto, pero otra cosa que puede bloquear las llamadas a los métodos es declarar la visibilidad de la vista de como ha IDO.

    android:visibility="gone"
    recyclerView.setVisibility(View.GONE);

    Cualquiera de ellos va a bloquear la llamada de los métodos en RecyclerView.Adaptador de

    Espero que pueda ayudar a alguien.

Dejar respuesta

Please enter your comment!
Please enter your name here