Recyclerview ไม่เรียก onCreateViewHolder


150

ฉันRecyclerViewไม่เรียกonCreateViewHolder, onBindViewHolderแม้กระทั่งคอนสตรัคจึงไม่มีอะไรที่ปรากฏในMenuViewHolder RecyclerViewฉันใส่บันทึกเพื่อแก้ไขข้อบกพร่องและไม่มีการแสดงผลบันทึก อาจมีปัญหาอะไร?

อะแดปเตอร์ของฉัน:

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
private LayoutInflater inflater;
List<Menu> data = Collections.emptyList();

public MenuAdapter(Context context, List<Menu> data) {
    Log.i("DEBUG", "Constructor");
    inflater = LayoutInflater.from(context);
    Log.i("DEBUG MENU - CONSTRUCTOR", inflater.toString());
    this.data = data;
    for(Menu menu: this.data){
        Log.i("DEBUG MENU - CONSTRUCTOR", menu.menu);
    }
}

@Override
public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.row_menu, parent, false);
    MenuViewHolder holder = new MenuViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
    Log.i("DEBUG MENU", "onBindViewHolder");
    Menu current = data.get(position);
    holder.title.setText(current.menu);
}

@Override
public int getItemCount() {
    return 0;
}

class MenuViewHolder extends RecyclerView.ViewHolder {
    TextView title;
    ImageView icon;

    public MenuViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.menuText);
    }
}

XML แถวที่กำหนดเองของฉัน:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/menuText"
    android:text="Dummy Text"
    android:layout_gravity="center_vertical"
    android:textColor="#222"/>

และชิ้นส่วนของฉัน:

public NavigationFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
    if (savedInstanceState != null) {
        mFromSavedInstaceState = true;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view = inflater.inflate(R.layout.fragment_navigation, container, false);
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.drawer_list);
    MenuAdapter adapter = new MenuAdapter(getActivity(), getData());
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setAdapter(adapter);
    return view;
}

ทำไมคุณตั้ง recyclerView.setAdapter (ตัวแปลง) 2 ครั้ง
Panayiotis Irakleous

สาเหตุอีกประการของปัญหานี้คือการทำให้เลย์เอาต์ของรายการตรงกับความสูงของพาเรนต์โดยไม่ตั้งใจดังนั้นจะมีเพียงหนึ่งไอเท็มที่แสดงในแต่ละครั้ง
Joe Lapp

ในกรณีของฉันช่วยสิ่งนี้: invoicesRecyclerView.setHasFixedSize (จริง) invoicesRecyclerView.setLayoutManager (GridLayoutManager (นี่ 1))
a_subscriber

คำตอบ:


239

ของคุณวิธีการgetItemCount returns 0ดังนั้นRecyclerViewอย่าพยายามยกตัวอย่างมุมมอง greater than 0ทำให้มันกลับมาบางสิ่งบางอย่าง

ตัวอย่างเช่น

@Override
public int getItemCount() {
    return data.size();
}

25
โอ้โหฉันรู้สึกเป็นใบ้แล้วตอนนี้! : facepalm: ขอบคุณสำหรับสิ่งนี้!
Shinta S

3
ฉันเพิ่งเสียเวลาไปหนึ่งชั่วโมงเพราะ getItemCount นั้นต่ำกว่าโค้ดอื่นทั้งหมดและฉันไม่เห็นมัน : |
Joel

ฉันมีอะแดปเตอร์ที่กำหนดเองและลืมที่จะกำหนดรายการของฉันเป็นขนาดของคอลเลกชันของฉัน
Dooie

3
จำนวนรายการของฉันคือ 3 ยังคงมองไม่เห็นไม่มีจุดแก้จุดบกพร่องใน onBind หรือ onCreateHolder ... แต่มันมาใน getItemCount
ดร. aNdRO

โอ้! ฉันก็ต้องต่อสู้กับสิ่งนี้เพื่อหาสาเหตุว่าทำไมจุดพักของฉันถึงไม่หยุดและตอนนี้ฉันรู้แล้ว ... ฮ่า ๆ ! ประณาม!!! ขอบคุณ!
Vincy

409

อีกอันหนึ่งคือตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าตัวจัดการโครงร่างเป็น RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

2
ฉันกลับมาที่คำตอบนี้ waaay บ่อยเกินไป…
finki


15

นี่ไม่ได้ใช้กับกรณีของคุณโดยเฉพาะ แต่นี่อาจช่วยคนอื่นได้

เหตุผลนี้อาจเป็นการใช้วิธีต่อไปนี้อย่างไม่ระมัดระวัง

recyclerView.setHasFixedSize(true);

หากไม่ได้ใช้ด้วยความระมัดระวังอาจทำให้เกิดonBindViewและonCreateViewHolderจะไม่ถูกเรียกเลยโดยไม่มีข้อผิดพลาดในบันทึก


12

โปรดตั้งค่าตัวจัดการโครงร่างให้RecyclerViewชอบโค้ดด้านล่าง:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_right);
//set your recycler view adapter here
NavigationAdapter adapter = new NavigationAdapter(this, FragmentDrawer.getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

9

สำหรับสิ่งที่คุ้มค่าฉันสังเกตได้เมื่อฉันตั้งค่าอะแดปเตอร์มุมมอง recycler ก่อนที่จะเริ่มต้นอะแดปเตอร์จริง วิธีแก้ไขคือเพื่อให้แน่ใจrecyclerView.setAdapter(adapter)ว่ามีการเรียกใช้อะแดปเตอร์ที่ไม่ใช่ค่าว่าง


9

ฉันหวังจริงๆว่านี่จะช่วยให้ใครซักคนในวันหนึ่ง ฉันใช้เวลามากกว่าหนึ่งชั่วโมงในการทำถั่วชนิดนี้!

ฉันมีสิ่งนี้:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

เมื่อฉันควรได้รับสิ่งนี้:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

เนื่องจากฉันเรียกอะแดปเตอร์ของฉันอย่างโง่เขลาadapterจึงเป็นเรื่องที่เงาโดยอะแดปเตอร์ของมุมมองรีไซเคิลในบล็อกใช้! ฉันเปลี่ยนชื่ออะแดปเตอร์เป็น projectAdapter เพื่อแยกความแตกต่างและแก้ไขปัญหาได้!


6

การตั้งค่าความสูงของTextViewในหรือcustom.xml RecyclerViewถ้าความสูงwrap-contentที่RecyclerViewจะมองไม่เห็น


ใช้เวลากับสิ่งนี้มาก .. ความสูงของมุมมองรีไซเคิลเป็นศูนย์ เมื่อใช้ในกิจกรรมมันจะขยายตัวออกไป ในส่วนภายในเค้าโครงอื่น ๆ .. มันไม่ได้
Asif Shiraz

4

สิ่งนี้เกิดขึ้นเมื่อฉันRecyclerViewอยู่ภายในScrollViewและฉันใช้ห้องสมุดสนับสนุน Android 23.0 ในการแก้ไขปัญหาฉันได้อัปเดตเป็นห้องสมุดสนับสนุน Android 23.2:

ใน build.gradle:

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:cardview-v7:23.2.+'
}


4

อาจช่วยใครซักคน แต่ถ้าคุณตั้งค่าการมองเห็นของ RecycleView เป็น GONE วิธีการของอะแดปเตอร์จะไม่ถูกเรียกใช้เลย ... เอาเวลาให้ฉันคิดออก


ไม่น่าเชื่อ !!!!! ... รถถังมากมาย ,,,
X-Black ...

3

ฉันมีปัญหาเดียวกันเพราะฉันใช้android.support.constraint.ConstraintLayoutในรูปแบบทรัพยากร เปลี่ยนไปFrameLayoutช่วย


ขอบคุณสำหรับวิธีการแก้ปัญหาของคุณ ความคิดใดที่ว่าทำไมมันถึงมีพฤติกรรมเช่นนี้หากมุมมองพาเรนต์คือandroid.support.constraint.ConstraintLayoutอะไร
Adrian Buciuman

2

ตัวเลือกอื่นคือถ้าคุณส่งรายการ objetc โดยใช้รับตรวจสอบว่าคุณมีการอ้างอิงที่ถูกต้องตัวอย่างเช่น

private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
  listObjetc = listObjetc;
}

//Correct
public void setListObjetcs(list<objetc> listObjetc){
  this.listObjetc = listObjetc;
}

2

ฉันต่อสู้กับปัญหานี้มาหลายชั่วโมง ฉันกำลังใช้ชิ้นส่วน viewและปัญหาก็ไม่ได้กลับมา ด้านล่างเป็นรหัสของฉัน:

ProductGridBinding binding = DataBindingUtil.inflate( inflater, R.layout.product_grid, container, false);



    mLinearLayoutManager = new LinearLayoutManager(getActivity());
    mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    binding.rvNumbers.setHasFixedSize(true);
    binding.rvNumbers.setLayoutManager(mLinearLayoutManager);
    binding.rvNumbers.setAdapter(adapter);


    View view = binding.getRoot();


    return view;

2
รหัสแปลก ๆ ตัวแปรและคลาสเหล่านี้ยากที่จะเข้าใจ
CoolMind

2

ดูคำตอบของฉันหากคุณใช้ห้องสมุดผูกข้อมูล Android - ตรวจสอบให้แน่ใจว่าคุณกำลังตั้งค่าเค้าโครงสำหรับ recyclerview และจำนวนรายการต้องมากกว่า 0

 @BindingAdapter({"entries", "layout"})
    public static void setEntries(RecyclerView view, ArrayList<LoginResponse.User> listOfUsers, int layoutId) {
        if (view.getAdapter() == null) {
            view.setLayoutManager(new LinearLayoutManager(view.getContext()));
            SingleLayoutAdapter adapter = new SingleLayoutAdapter(layoutId) {
                @Override
                protected Object getObjForPosition(int position) {

                    return listOfUsers.get(position);
                }

                @Override
                public int getItemCount() {
                    return listOfUsers.size();
                }
            };
            view.setAdapter(adapter);
        }
    }

การเข้ารหัสที่มีความสุข :-)


1

ในกรณีของฉันฉันตั้ง ID ของ RecyclerView ของฉันเป็น "recyclerView" ดูเหมือนว่า ID นี้มีการกำหนดไว้แล้วเพราะเมื่อฉันเปลี่ยนเป็นรหัสอื่นวิธีการจากอะแดปเตอร์ถูกเรียกอย่างถูกต้อง


1

หากใช้อะแดปเตอร์ที่กำหนดเองอย่าลืมตั้ง ItemCount เป็นขนาดของคอลเลกชันของคุณ


1

ในกรณีของฉันขนาดรายการของฉันคือ 0 และไม่ได้เรียกเมธอด onCreateViewHolder ฉันต้องการแสดงข้อความที่กึ่งกลางสำหรับรายการที่ว่างเป็นตัวยึดตำแหน่งดังนั้นฉันจึงทำเช่นนี้และมันทำงานได้อย่างมีเสน่ห์ ตอบโดย @Konstantin Burov ช่วย

  @Override
public int getItemCount() {
    if (contactList.size() == 0) {
        return 1;
    } else {
        return contactList.size();
    }
}

นี่ไม่ใช่ความคิดที่ดีจริง ๆ มันเป็นการดีกว่าที่จะตั้งค่าการมองเห็นของข้อความว่างเปล่าเมื่อวางข้อมูลลงในอะแดปเตอร์
เหลือเชื่อ Jan

1

เครื่องเข้ารหัสของฉันคือ onBindViewHolder (ผู้ถือตำแหน่ง) วิธีการแทนที่ของ RecyclerView.adaptor ที่ไม่ได้ถูกเรียก เมธอด onCreateViewHolder ถูกเรียกใช้เรียกใช้ getItemCount หากคุณอ่านรายละเอียดของอะแดปเตอร์ Recyclerview คุณจะได้เรียนรู้ว่าถ้าคุณแทนที่ OnBindViewHolder (ผู้ถือตำแหน่งตำแหน่งลิสต์รายการ) จะถูกเรียกใช้ ดังนั้นโปรดระวัง


คุณแก้ปัญหาการไม่โทรได้onBindViewHolderอย่างไร
CoolMind

1

หากคุณใส่ wrap_content เป็นความสูงของรายการของคุณรวมถึงความสูงของรายการไอเท็มของคุณจะไม่มีสิ่งใดปรากฏขึ้นและจะไม่มีการเรียกฟังก์ชั่น recyclerView ของคุณเลย แก้ไขความสูงของรายการหรือวาง match_parent สำหรับความสูงของรายการ นั่นช่วยแก้ไขปัญหาของฉัน



1

ไปที่ xml ของคุณ และเปลี่ยนเค้าโครงของคุณเพื่อตัดเนื้อหา องค์ประกอบหนึ่งซ่อนอยู่ตัวถัดไปดังนั้นวิธีการไม่ทำงาน!


1
ยินดีต้อนรับสู่ StackOverflow @koala! ดูวิธีการเขียนคำตอบที่ดีที่นี่stackoverflow.com/help/how-to-answer
Shashin Bhayani


0

ในกรณีของฉันหลังจากเปลี่ยนกิจกรรมเพื่อใช้ ViewModel และ DataBinding ฉันลืมลบsetContentViewวิธีการโทรจากonCreateเมธอด ด้วยการลบมันแก้ปัญหาของฉัน


0

สำหรับฉันมันเป็นเพราะ setHasStableIds (จริง); ตั้งค่าวิธีการแล้ว ลบออกและมันจะทำงาน


แต่วิธีนี้ดูเหมือนจะไม่ได้อยู่ในตัวอย่างที่ทำซ้ำได้น้อยที่สุดในคำถาม หากการลบคำใบ้นี้ช่วยแก้ไขบางสิ่งอาจเป็นข้อบ่งชี้ข้อผิดพลาดในการใช้งานตัวยึดมุมมองหรือตัวแจ้งเตือน


0

ตรวจสอบให้แน่ใจของคุณXMLและKoltin/Javaจับคู่รหัส ในกรณีของฉันฉันมีปัญหากับViewHolderตั้งแต่ฉันเขียน:

var txt: AppCompatTextView = itemView.findViewById(R.id.txt)

แต่เนื่องจากรหัส XML ของฉันคือ:

<TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .../>

ฉันต้องเปลี่ยนแถวใจเป็น:

var txt: TextView = itemView.findViewById(R.id.txt)

นอกจากนี้ฉันยังต้องลบ:

recyclerView.setHasFixedSize(true);

ฉันหวังว่านี่จะช่วยคุณได้ :)


0

ในกรณีของฉันฉันขาดการโทรnotifyDataSetChanged()หลังจากตั้งค่ารายการในอะแดปเตอร์

public void setUserList(List<UserList> userList) {
      this.userList = userList;
        notifyDataSetChanged();
}

0

ในกรณีของฉันฉันพลาดการตั้งค่าปฐมนิเทศใน LinearLayout ของฉัน

หลังจากแก้ไขปัญหาการวางแนวแล้ว

 android:orientation="vertical"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.