【问题标题】:Recyclerview not call any Adapter method :onCreateViewHolder,onBindViewHolder,Recyclerview 不调用任何 Adapter 方法:onCreateViewHolder,onBindViewHolder,
【发布时间】:2023-03-21 04:54:01
【问题描述】:

我的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;
                 }
             };

【问题讨论】:

  • 在宽度和高度上都匹配父级的行?你确定要那个吗?
  • 你甚至没有得到 getItemCount ?这很奇怪。除此之外,您的空视图实现是错误的。首次添加项目时,应首先调用 notifyItemRemoved(0) 以便 RV 知道项目 0 已删除。此外,您的 getItemViewType 实现非常冒险,因为 RV 可能会调用它,而 EMPTY 视图是 UI 的一部分,但只是添加了新项目,所以这非常冒险。我建议在您的适配器中设置一个布尔值来设置 shouldEmpty 视图,当它设置为 false 时,您应该调用 notifyItemRemoved(0)。确保在添加项目之前发生。
  • @PedroOliveira 我改成了 android:layout_width="match_parent" android:layout_height="wrap_content" ,什么都不做
  • @yigit RecyclerView 只是调用 getItemCount(),但 RecyclerView 不调用其他 Override 方法,我尝试使用初始数据不带 EmptyViewHolder 的代码,但我也有这个问题,对不起,如果我的英语很穷
  • 那么对于 EMPTY View 甚至没有调用 onCreate 或 onBind 吗?另外,如果add 被调用,你调试了吗?

标签: java android listadapter android-recyclerview


【解决方案1】:

除了@SanatiSharif 和@sohrab 的回答,您必须遵循以下强制性步骤。

请务必致电setLayoutManager,如下所示。

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

在把adapter设置成recyclerView之前,否则是不行的。 如果需要,您可以自定义它。 this link 会让您了解 LayoutManager 的工作原理。

【讨论】:

  • 这个答案值得更多投票。我总是忘记这一点。
  • 这里也一样,我一直忘记这个,然后我搜索我可能做错了什么,然后我就到这里了,哈哈。
  • 问题是,为什么需要这个?这个答案解决了我的问题,但我不知道为什么。
  • 您也可以通过 XML 进行设置:app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
  • 我最终回到这个答案的次数 (o_-)
【解决方案2】:

正如@yigit 猜测ScrollViewRelativeLayout 的组合导致了这个问题, 为RecyclerView腾出更多空间。

【讨论】:

  • 谢谢。预览 xml 以确保显示回收视图。
  • 我的不在 ScrollView 内,但仍然有这个问题。
  • 我的 RecyclerView 在 ConstraintLayout 中,所以它没有调用任何适配器方法。疯狂:x
【解决方案3】:

如果 RecyclerView 被放入 ScrollView,那么在测量步骤期间,它的高度是未指定的(因为 ScrollView 允许任何高度)并等于最小高度(根据实现),显然为零。

参考:android: RecyclerView inside a ScrollView

解决方案: - 将视图放在 RecyclerViews 行中 - 计算列表项的大小并以编程方式设置 ListView 的高度 http://vardhan-justlikethat.blogspot.com/2014/04/android-listview-inside-scrollview.html

【讨论】:

    【解决方案4】:

    可能是另一种情况,但对我来说,我只是忘记设置布局管理器如下:

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

    希望对你有帮助:)

    【讨论】:

      【解决方案5】:

      它已经晚了,但希望它会帮助somone。尝试以下任一方法:

      第一个解决方案: 确保你没有不必要地使用这条线

      recyclerView.setHasFixedSize(true);
      

      第二种解决方案: 确保将布局管理器设置为 recyclerView

      recycler.setLayoutManager(new LinearLayoutManager(this));
      

      第三个解决方案: 你getItemCount 返回 0,所以RecyclerView 从不尝试实例化视图。让它返回大于 0 的值

      【讨论】:

        【解决方案6】:

        在我的案例中,我使用的是 Fragment-> ViewPager 和 Tablayout -> Inside viewpagers item 我使用了 RecyclerView。

        所以我没有调用 ViewPagerAdapter(getChildFragmentManager()) ,而是调用 ViewPagerAdapter(getSupportFragmentManager()) ,这就是我的任何回收器适配器项都没有被调用的原因。

        所以在片段中设置 ViewPagerAdapter 的正确方法是

        ViewPagerAdapter(getChildFragmentManager())

        【讨论】:

          【解决方案7】:

          就我而言,我有这个结构

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

          我解决了问题删除相对

          <ScrollView>
          
                  <android.support.v7.widget.RecyclerView/>
          
          </ScrollView>
          

          【讨论】:

            【解决方案8】:

            有点傻,但是可以阻止对方法的调用的另一件事是将视图的可见性声明为 GONE。

            android:visibility="gone"
            
            recyclerView.setVisibility(View.GONE);
            

            其中任何一个都会阻塞 RecyclerView.Adapter 中方法的调用

            我希望它可以帮助某人。

            【讨论】:

              【解决方案9】:

              我遇到了类似的问题,但以上答案都没有帮助我。

              最后,我发现在为我的 RecyclerView 所在的 Fragment 创建和绑定视图时犯了一个错误:

              有问题的代码

              FormPageFragment.onCreate

              binding=FormPageBinding.inflate(layoutInflater)
              

              但在 onCreateView 我这样做了:

              FormPageFragment.onCreateView

              return inflater.inflate(R.layout.form_page, container, false)
              

              稍后在 onStart 中设置适配器,如下所示:

              FormPageFragment.onStart

              binding.formContent.adapter=FormEntriesAdapter(page, viewModel.enteredData)
                      
              

              解决方案

              但这是垃圾。这一切都应该在 onCreateView 中完成,当然 binding.rootView 需要作为视图返回,否则绑定视图不会附加到布局并且在它们上设置任何适配器都没有效果。

              onCreateView 的工作版本

               binding=FormPageBinding.inflate(layoutInflater)
               return binding.root
                      
              

              因此,与 RecyclerView 本身相比,片段实例化、创建和绑定正确视图的问题更多。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-08-07
                • 1970-01-01
                • 2021-11-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-09-11
                相关资源
                最近更新 更多