web-dev-qa-db-ja.com

Recyclerviewはどのアダプタメソッドも呼び出しません:onCreateViewHolder、onBindViewHolder、

私の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;
                 }
             };
56
SanatiSharif

@yigitがScrollViewRelativeLayoutの組み合わせを推測するとこの問題が発生するため、RecyclerViewのスペースを増やしてください。

@SanatiSharifと@sohrabの答え以外に、以下の必須ステップに従う必要があります。

以下のようなsetLayoutManagerを呼び出していることを確認してください。

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

アダプタをrecyclerViewに設定する前に、それ以外の場合は動作しません。必要に応じてカスタマイズできます。 このリンク を使用すると、LayoutManagerがどのように機能するかがわかります。

183
AAnkit

RecyclerViewがScrollViewに配置される場合、測定ステップ中にその高さは指定されず(ScrollViewは任意の高さを許可するため)、明らかにゼロである(実装ごとに)最小の高さに等しくなります。

ref: Android:ScrollView内のRecyclerView

解決策:-RecyclerViewsの行にビューを配置します-リストアイテムのサイズを計算し、プログラムでListViewの高さを設定します http://vardhan-justlikethat.blogspot.com/2014/04/Android-listview-inside -scrollview.html

19
SanatiSharif

別のケースかもしれませんが、私にとっては、レイアウトマネージャーを次のように設定するのを忘れていました。

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
recycler.setLayoutManager(layoutManager);

それが役に立てば幸い :)

7
gmartinsnull

その遅いが、それが楽になるのを願っています次のいずれかを試してください。

最初の解決策:この行を不必要に使用していないことを確認してください

recyclerView.setHasFixedSize(true);

2番目の解決策:レイアウトマネージャーをrecyclerViewに設定してください

recycler.setLayoutManager(new LinearLayoutManager(this));

3番目の解決策:getItemCountは0を返すため、RecyclerViewはビューのインスタンス化を試行しません。 0より大きい値を返すようにします

5
Zubair Rehman

私の場合、Fragment-> ViewPagerとTablayout-> Inside viewpagersアイテムを使用していました。RecyclerViewを使用しました。

したがって、ViewPagerAdapter(getChildFragmentManager())を呼び出す代わりに、ViewPagerAdapter(getSupportFragmentManager())を呼び出していたため、リサイクラーアダプターアイテムが呼び出されません。

フラグメント内でViewPagerAdapterを設定する適切な方法は

ViewPagerAdapter(getChildFragmentManager())

2
B.shruti

ちょっと馬鹿げていますが、メソッドの呼び出しをブロックできるもう1つのことは、ビューの可視性をGONEとして宣言することです。

Android:visibility="gone"

recyclerView.setVisibility(View.GONE);

これらのいずれも、RecyclerView.Adapterのメソッドの呼び出しをブロックします

それが誰かを助けることを願っています。

1
sealroto

私の場合、私はこの構造を持っていました

<ScrollView>
    <RelativeLayout>
        <Android.support.v7.widget.RecyclerView/>

    </RelativeLayout>
</ScrollView>

私は相対的な問題を解決しました

<ScrollView>

        <Android.support.v7.widget.RecyclerView/>

</ScrollView>
1
David Hackro