RecyclerView不能调用任何Adapter方法:onCreateViewHolder,onBindViewHolder,
我的RecyclerView不会调用onCreateViewHolder onBindViewHolder,因此,在回收站视图中不会显示任何内容。 我把日志进行debugging,并没有显示日志。 可以是什么?
我的适配器:
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); }}
我将使用public void add(comment item, int position){...}
在RecyclerView中添加项目。
在片段:
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; }
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 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>
我将使用以下代码将项目添加到RecyclerView:
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; } };
作为@yigit猜测ScrollView
, RelativeLayout
的组合导致这个问题,只是为RecyclerView
留出更多空间。
除了@SanatiSharif和@sohrab的回答,你必须按照下面的强制性步骤。
确保你调用setLayoutManager
,如下所示。
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
在将适配器设置为recyclerView之前,否则它不会工作。 你可以自定义它,如果你需要的话。 这个链接会给你一些LayoutManager的工作原理。
如果RecyclerView被放入一个ScrollView中,那么在测量步骤中它的高度是未指定的(因为ScrollView允许任何高度)并且等于最小高度(按照实施),这显然是零。
ref: android:RecyclerView里面的ScrollView
解决scheme: – 将视图放在RecyclerViews行中 – 计算列表项的大小并以编程方式设置ListView的高度http://vardhan-justlikethat.blogspot.com/2014/04/android-listview-inside-scrollview.html
它晚了,但希望它会帮助somone。 请尝试以下任一操作:
第一个解决scheme:确保你没有不必要地使用这条线
recyclerView.setHasFixedSize(true);
第二个解决scheme:确保您将布局pipe理器设置为recyclerView
recycler.setLayoutManager(new LinearLayoutManager(this));
第三个解决scheme:你getItemCount
返回0,所以RecyclerView
永远不会尝试实例化一个视图。 让它返回大于0的东西
ScrollView中的RecyclerView当然是不好的做法。 但是,如果真的有必要,可以使用这个布局pipe理器:
https://github.com/serso/android-linear-layout-manager
它将调整RecyclerView的大小,即使在ScrollView中也是可见的。
在我的情况下,我有这样的结构
<ScrollView> <RelativeLayout> <android.support.v7.widget.RecyclerView/> </RelativeLayout> </ScrollView>
我解决了这个问题删除相对
<ScrollView> <android.support.v7.widget.RecyclerView/> </ScrollView>
可能是一个不同的情况,但对我来说,我忘了设置布局pipe理器如下:
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); recycler.setLayoutManager(layoutManager);
希望能帮助到你 :)