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 commemAdapter.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 lanotifyItemInserted()
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
Vous devez vous connecter pour publier un commentaire.
Comme @yigit deviner la combinaison de
ScrollView
,RelativeLayout
les causes de ce problème,Juste faire plus de place pour
RecyclerView
.Autre que @SanatiSharif et @sohrab réponse, vous avez à suivre ci-dessous étape obligatoire.
Assurez-vous que vous appelez
setLayoutManager
, quelque chose comme ci-dessous.avant réglage de l'adaptateur dans recyclerView, sinon il ne va pas au travail.
Vous pouvez personnaliser si vous en avez besoin.
ce lien vous donnera une idée de la façon dont LayoutManager œuvres.
ref : android: RecyclerView à l'intérieur d'un ScrollView
Solution :
- mettre 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
Aurait pu être une autre affaire, mais pour moi j'ai juste oublié de définir le Layout Manager comme suit:
Espère que cela aide 🙂
Son retard, mais j'espère que ça aidera la somone. essayez l'une des opérations suivantes:
première solution:
assurez-vous que vous n'avez pas utiliser cette ligne inutilement
deuxième solution:
assurez-vous de définir la disposition du gestionnaire de
recyclerView
troisième solution:
vous
getItemCount
retourne 0, DoncRecyclerView
jamais tente d'instancier un point de vue. Faire revenir quelque chose de plus grand que 0Dans mon Cas, j'ai été en utilisant le Fragment> ViewPager et Tablayout -> à l'Intérieur viewpagers article que j'ai utilisé RecyclerView.
Donc, au Lieu de l'appeler ViewPagerAdapter(getChildFragmentManager()) , j'ai été appeler ViewPagerAdapter(getSupportFragmentManager()) , c'est pourquoi aucun de mes recycleur élément adaptateur n'est pas appelé.
De manière adéquate la façon de définir la ViewPagerAdapter à l'intérieur d'un fragment est
Dans mon cas, j'ai eu cette structure
j'ai résolu le problème, supprimez Relative
Est un peu idiot, mais une autre chose qui peut bloquer les appels aux méthodes consiste à déclarer la visibilité de la vue comme DISPARU.
L'un de ces va bloquer l'appel des méthodes de RecyclerView.Adaptateur
J'espère que cela peut aider quelqu'un.