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;
}
};
Comme @yigit suppose que la combinaison de ScrollView
, RelativeLayout
est à l'origine de ce problème, Laissez plus de place à RecyclerView
.
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.
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
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 :)
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
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 ())
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>
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.