私のRecyclerViewはonCreateViewHolder、onBindViewHolderを呼び出さないため、recyclerviewには何も表示されません。デバッグ用にログを記録しましたが、ログは表示されません。何ができる?
私のアダプター:
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:ScrollView内のRecyclerView
解決策:-RecyclerViewsの行にビューを配置します-リストアイテムのサイズを計算し、プログラムでListViewの高さを設定します http://vardhan-justlikethat.blogspot.com/2014/04/Android-listview-inside -scrollview.html
別のケースかもしれませんが、私にとっては、レイアウトマネージャーを次のように設定するのを忘れていました。
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
recycler.setLayoutManager(layoutManager);
それが役に立てば幸い :)
その遅いが、それが楽になるのを願っています次のいずれかを試してください。
最初の解決策:この行を不必要に使用していないことを確認してください
recyclerView.setHasFixedSize(true);
2番目の解決策:レイアウトマネージャーをrecyclerView
に設定してください
recycler.setLayoutManager(new LinearLayoutManager(this));
3番目の解決策:getItemCount
は0を返すため、RecyclerView
はビューのインスタンス化を試行しません。 0より大きい値を返すようにします
私の場合、Fragment-> ViewPagerとTablayout-> Inside viewpagersアイテムを使用していました。RecyclerViewを使用しました。
したがって、ViewPagerAdapter(getChildFragmentManager())を呼び出す代わりに、ViewPagerAdapter(getSupportFragmentManager())を呼び出していたため、リサイクラーアダプターアイテムが呼び出されません。
フラグメント内でViewPagerAdapterを設定する適切な方法は
ViewPagerAdapter(getChildFragmentManager())
ちょっと馬鹿げていますが、メソッドの呼び出しをブロックできるもう1つのことは、ビューの可視性をGONEとして宣言することです。
Android:visibility="gone"
recyclerView.setVisibility(View.GONE);
これらのいずれも、RecyclerView.Adapterのメソッドの呼び出しをブロックします
それが誰かを助けることを願っています。
私の場合、私はこの構造を持っていました
<ScrollView>
<RelativeLayout>
<Android.support.v7.widget.RecyclerView/>
</RelativeLayout>
</ScrollView>
私は相対的な問題を解決しました
<ScrollView>
<Android.support.v7.widget.RecyclerView/>
</ScrollView>