Recyclerview pas appeler n'importe quel Adaptateur méthode :onCreateViewHolder,onBindViewHolder,

mon RecyclerView ne pas appeler onCreateViewHolder, onBindViewHolder, par conséquent, ne semble pas rien dans recyclerview. J'ai mis les journaux de débogage, et aucun journal n'est montré. 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);
}}

Je vais utiliser public void add(comment item, int position){...} pour ajouter un élément dans RecyclerView.

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

Des 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 élément à la 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;
}
};
  • Une ligne correspondant à un parent sur deux de largeur et de hauteur? Êtes-vous sûr que vous voulez que?
  • Vous n'êtes pas à même de se getItemCount ? C'est assez bizarre. En plus de cela, votre vide implémentation de vue est erroné. Lorsque vous ajoutez un élément pour la première fois, vous devez d'abord appeler notifyItemRemoved(0), de sorte que RV sait l'élément 0 est supprimé. Aussi, votre getItemViewType mise en oeuvre est assez risqué que de RV peut l'appeler bien que VIDE de la vue est une partie de l'INTERFACE utilisateur, mais de nouveaux éléments sont ajoutés, donc c'est assez risqué. Je suggère d'avoir un booléen dans votre carte qui définit shouldEmpty vue et lorsqu'il est défini sur false, vous devriez appeler notifyItemRemoved(0). Assurez-vous qu'il se passe avant d'ajouter des éléments .
  • J'ai changé pour android:layout_width="match_parent" android:layout_height="wrap_content" , ne marche pas changer quelque chose
  • RecyclerView appelez simplement getItemCount(), mais RecyclerView ne pas appeler d'autres Remplacer les méthodes, j'ai essayer ce code, sans EmptyViewHolder avec des données Initiales, mais j'ai ce problème aussi, excusez-moi, si mon anglais est pauvre
  • Donc, même pas un appel à onCreate ou onBind de Vue VIDE? aussi, avez-vous de débogage si add est appelée?
  • Je pense que quand getItemCount() renvoie 0, il l'habitude d'appeler d'autres méthodes. Pouvez-vous nous montrer la partie où vous êtes réellement en ajoutant des éléments à la carte ?
  • oui j'ai appeler la méthode add de trop, et je vois ce problème
  • getItemCount() return >= 1, je vais mettre à jour ma question.
  • J'ai ajouter un peu de code à la fin de ma question.
  • Je pense que le problème est avec cette ligne : mAdapter.add(c,0); Vous êtes toujours à l'ajout de l'élément à l'0e position qui dit android que l'élément à la position à 0 a changé et qu'il essaie juste de redessiner les 0e poste. Pouvez-vous essayer d'ajouter quelque chose comme mAdapter.add(c,i);
  • nope, appelant add(c, 0) signifie seulement il va ajouter le nouvel élément à la position 0 et pousser les autres éléments vers le bas (donc vide de vue se déplace à la position 1).
  • Ah oui, désolé, il suffit de lire la documentation.
  • si vous pouvez télécharger un exemple de projet, je suis heureux de prendre un coup d'oeil.
  • Est-il une possibilité de Fil Mal Exception ? Étant donné que mAdapter.add(c,0); est peut-être appelé à partir d'un thread d'arrière-plan et la notifyItemInserted() méthode doit s'exécuter sur le thread de l'INTERFACE utilisateur ?
  • nope, Volley onResponse exécuter sur le main (UI) Thread
  • son grand projet, je ne peux pas le télécharger,
  • Ok, une dernière chose. Le contrôle de la hauteur de votre RV. Essayez de définir une hauteur fixe. Peut-être que la combinaison de la ScrollView, RL et RV en fait 0 hauteur (ce qui expliquerait ne pas obtenir des points de vue, car il n'y a pas de place). Je ne comprends pas pourquoi vous avez que le programme d'installation de toute façon. En plus de cela, je ne vois pas quoi d'autre qui ne va pas. Si il y avait un bug dans la RV comme cela, il serait assez évident et surface même façon avant.
  • excuse moi je suis nouveau dans la programmation android, qu'est-ce que RL et camping-car ? Merci,
  • RL = relatif disposition RV = recyclerview

InformationsquelleAutor | 2015-01-23