Recyclerview ne fait appel à aucune méthode D'adaptation: onCreateViewHolder,onBindViewHolder,

mon RecyclerView ne pas appeler onCreateViewHolder, onBindViewHolder, par conséquent, ne semble pas rien dans recyclerview. J'ai mis des logs pour le débogage, et aucun log 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 isn: " + 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 article dans RecyclerView.

en 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>

fichier xml comment_row :

<?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 L'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;
                 }
             };
47
demandé sur SanatiSharif 2015-01-23 20:36:00

8 réponses

comme @yigit Devinez la combinaison de ScrollView , RelativeLayout provoque ce problème, Faites plus de place pour RecyclerView .

34
répondu sohrab Aboozarkhani Fard 2015-09-08 15:28:20

mis à part la réponse de @SanatiSharif et @sohrab, vous devez suivre la marche obligatoire ci-dessous.

appelez setLayoutManager , comme ci-dessous.

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

avant de placer adaptateur dans recyclerView, sinon il ne va pas fonctionner. Vous pouvez le personnaliser si vous avez besoin. ce lien vous donnera une idée de comment LayoutManager fonctionne.

148
répondu AAnkit 2017-10-30 19:57:30

si RecyclerView est mis dans un ScrollView, sa hauteur est indéterminée (parce que ScrollView autorise n'importe quelle hauteur) et égale à la hauteur minimale (selon l'implémentation) qui est apparemment nulle.

réf: android: RecyclerView inside a ScrollView

Solution : - mettre les vues dans la ligne de RecyclerViews - Calculer la taille des éléments de la liste et définissez la hauteur de la liste par programmation http://vardhan-justlikethat.blogspot.com/2014/04/android-listview-inside-scrollview.html

19
répondu SanatiSharif 2017-05-23 12:10:44

il est tard mais j'espère qu'il aidera quelqu'un. essayez l'une des options suivantes:

première solution: assurez-vous que vous n'avez pas utiliser cette ligne inutilement

recyclerView.setHasFixedSize(true);

deuxième solution: assurez-vous de définir le layout manager à recyclerView

recycler.setLayoutManager(new LinearLayoutManager(this));

troisième solution: vous getItemCount renvoie 0, donc RecyclerView n'essaie jamais d'instancier une vue. Le faire retourner quelque chose de plus grand que 0

4
répondu Zubair Rehman 2017-05-04 06:14:44

aurait pu être un cas différent, mais pour moi, j'ai juste oublié de configurer le Layout Manager comme suit:

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

Espère que cela aide :)

3
répondu glauber 2017-11-10 00:42:22

dans mon cas, J'utilisais Fragment - > ViewPager et Tablayout - > Inside viewpagers j'ai utilisé RecyclerView.

donc au lieu d'appeler ViewPagerAdapter(getChildFragmentManager ()) , j'appelais ViewPagerAdapter(getSupportFragmentManager()) , c'est pourquoi l'un de mes adaptateurs recycleur n'est pas appelé.

donc la bonne façon de définir le ViewPagerAdapter dans un fragment est

ViewPagerAdapter (getChildFragmentManager ())

1
répondu B.shruti 2018-06-02 11:48:37

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>
0
répondu David Hackro 2017-07-31 04:41:08

Est un peu idiot, mais une autre chose qui peut bloquer les appels aux méthodes consiste à déclarer la visibilité de la vue.

android:visibility="gone"

recyclerView.setVisibility(View.GONE);

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

j'espère qu'il peut aider quelqu'un.

0
répondu sealroto 2018-07-18 15:30:07