web-dev-qa-db-fra.com

Recyclerview n'appelle aucune méthode d'adaptateur: onCreateViewHolder, onBindViewHolder,

mon RecyclerView n'appelle pas onCreateViewHolder, onBindViewHolder ne s'affiche donc pas dans Recyclerview Je mets des journaux pour le débogage, et aucun journal n'est affiché. Ce qui peut être? 

Mon adaptateur:

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);
}}

J'utiliserai public void add(comment item, int position){...} pour ajouter un élément dans RecyclerView.

dans le fragment:

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;
}

Fichiers 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 fichier 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>

Je vais ajouter un article à RecyclerView avec ce code:

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;
                 }
             };
53
SanatiSharif

Comme @yigit suppose que la combinaison de ScrollView, RelativeLayout est à l'origine de ce problème, Laissez plus de place à RecyclerView.

35

Outre les réponses de @ SanatiSharif et @ sohrab, vous devez suivre les étapes ci-dessous.

Assurez-vous d'appeler setLayoutManager, comme ci-dessous.

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

avant de configurer l’adaptateur dans recyclerView, sinon cela ne fonctionnera pas .. Vous pouvez le personnaliser si vous en avez besoin. ce lien vous donnera une idée du fonctionnement de LayoutManager.

169
AAnkit

Si RecyclerView est placé dans un objet ScrollView, sa hauteur n'est pas spécifiée lors du pas de mesure (car ScrollView autorise toutes les hauteurs) et devient égale à la hauteur minimale (selon l'implémentation) qui est apparemment égale à zéro.

ref: Android: RecyclerView à l'intérieur d'un ScrollView

Solution: - placez les vues dans la ligne de RecyclerViews - Calculez la taille des éléments de la liste et définissez la hauteur de la vue liste par programme http://vardhan-justlikethat.blogspot.com/2014/ 04/Android-listview-inside-scrollview.html

19
SanatiSharif

Cela aurait pu être un cas différent, mais pour moi, j'ai tout simplement oublié de configurer le gestionnaire de disposition comme suit:

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

J'espère que ça aide :)

5
glauber

Il est tard, mais j'espère que cela aidera quelqu'un. essayez l'une des solutions suivantes: 

première solution: Assurez-vous de ne pas utiliser cette ligne inutilement 

recyclerView.setHasFixedSize(true);

deuxième solution: assurez-vous de définir le gestionnaire de disposition sur recyclerView

recycler.setLayoutManager(new LinearLayoutManager(this));

troisième solution: vous getItemCount renvoie 0, alors RecyclerView ne tente jamais d’instancier une vue. Faites-le retourner quelque chose de plus grand que 0

5
Zubair Rehman

Dans mon cas, j’utilisais Fragment-> ViewPager et Tablayout -> Elément de la visionneuse intérieure j’utilisais RecyclerView.

Ainsi, au lieu d'appeler ViewPagerAdapter (getChildFragmentManager ()) , j'appelais ViewPagerAdapter (getSupportFragmentManager ()), c'est pourquoi aucun de mes éléments de l'adaptateur Recycler n'est appelé.

Il est donc utile de définir le ViewPagerAdapter dans un fragment. 

ViewPagerAdapter (getChildFragmentManager ())

2
B.shruti

Dans mon cas j'avais cette structure

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

    </RelativeLayout>
</ScrollView>

j'ai résolu le problème supprimer Relative

<ScrollView>

        <Android.support.v7.widget.RecyclerView/>

</ScrollView>
1
David Hackro

C'est idiot, mais une autre chose qui peut bloquer les appels aux méthodes est de déclarer la visibilité de la vue comme étant GONE.

Android:visibility="gone"

recyclerView.setVisibility(View.GONE);

N'importe lequel de ceux-ci bloquera l'appel des méthodes dans RecyclerView.Adapter

J'espère que ça peut aider quelqu'un.

0
sealroto