Recyclerview không gọi onCreateViewHolder


149

My RecyclerViewkhông gọi onCreateViewHolder, onBindViewHolderthậm chí là MenuViewHolderconstructor, do đó không có gì xuất hiện RecyclerView. Tôi đặt nhật ký để gỡ lỗi, và không có nhật ký nào được hiển thị. Rắc rối có thể là cái gì?

Bộ chuyển đổi của tôi:

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 hàng tùy chỉnh của tôi:

<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"/>

và mảnh vỡ của tôi:

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

tại sao bạn đặt recyclerView.setAdOG (bộ chuyển đổi); 2 lần?
Panayiotis Irakleous

Một nguyên nhân khác của vấn đề này là làm cho bố cục vật phẩm khớp với chiều cao của cha mẹ, do đó chỉ có một mục được hiển thị tại một thời điểm.
Joe Lapp

Trong trường hợp của tôi trợ giúp này: invoicesRecyclerView.setHasFixedSize (true) invoicesRecyclerView.setLayoutManager (GridLayoutManager (điều này, 1))
a_subscriber

Câu trả lời:


238

getItemCountPhương pháp của bạn returns 0. Vì vậy, RecyclerViewkhông bao giờ cố gắng để khởi tạo một quan điểm. Làm cho nó trở lại một cái gì đó greater than 0.

ví dụ

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

25
Ôi trời, tôi cảm thấy thật ngu ngốc ngay bây giờ! : facepalm: Cảm ơn bạn vì điều này!
Shinta S

3
Tôi chỉ mất một giờ cho việc này vì getItemCount đã giảm xuống dưới tất cả các mã khác và tôi đã không nhìn thấy nó. : |
Joel

Tôi đã có một bộ chuyển đổi tùy chỉnh và đã quên đặt số lượng vật phẩm của mình theo kích thước của bộ sưu tập của tôi
Dooie

3
số mặt hàng của tôi là 3 vẫn không thể nhìn thấy, Không điểm debug đi kèm trong onBind hoặc onCreateHolder ... nhưng nó đi kèm trong getItemCount
Tiến sĩ Andro

Trời ơi! Tôi cũng đã chiến đấu với điều này để tìm ra lý do tại sao điểm dừng của tôi không đánh và bây giờ tôi biết ... LOL! CHỈ TRÍCH!!! CẢM ƠN BẠN!
Vincy

409

Một điều nữa là đảm bảo bạn đặt trình quản lý bố cục thành RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

2
Tôi trở về với câu trả lời này waaay quá thường xuyên ...
finki


15

Điều này không áp dụng cho trường hợp cụ thể của bạn. Nhưng điều này có thể giúp đỡ người khác.

Lý do này có thể là bất cẩn sử dụng phương pháp sau đây

recyclerView.setHasFixedSize(true);

Nếu không thận trọng, điều này có thể gây ra onBindViewonCreateViewHolderkhông được gọi, không có lỗi trong nhật ký.


12

Vui lòng đặt trình quản lý bố cục để RecyclerViewthích mã bên dưới:

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

Để biết giá trị của nó, tôi đã quan sát nó khi tôi đặt bộ điều hợp chế độ xem tái chế trước khi bộ điều hợp thực sự được khởi tạo. Giải pháp là đảm bảo recyclerView.setAdapter(adapter)được gọi với bộ chuyển đổi không null


9

Tôi thực sự thực sự hy vọng điều này sẽ giúp ai đó một ngày nào đó. Tôi chỉ dành hơn một giờ cho việc này đi!

Tôi đã có điều này:

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

Khi tôi nên có điều này:

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

Bởi vì tôi dại dột gọi bộ điều hợp của mình adapter, nó bị che khuất bởi bộ điều hợp của chế độ xem tái chế trong khối áp dụng! Tôi đã đổi tên bộ chuyển đổi thành projectAd CHƯƠNG để phân biệt và giải quyết vấn đề!


6

Đặt chiều cao của TextViewtrong custom.xmlhoặc RecyclerView. Nếu chiều cao là wrap-content, RecyclerViewsẽ không được nhìn thấy.


Đã dành quá nhiều thời gian cho việc này .. chiều cao của chế độ xem tái chế bằng không. Khi được sử dụng trong một hoạt động, bằng cách nào đó nó đã mở rộng chính nó. Trong một đoạn bên trong các bố cục khác .. nó đã không
Asif Shiraz

4

Điều này xảy ra khi tôi RecyclerViewở trong ScrollViewvà tôi đang sử dụng Thư viện hỗ trợ Android 23.0. Để khắc phục, tôi đã cập nhật lên Thư viện hỗ trợ Android 23.2:

Trong build.gradle:

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

4

Thêm phần này vào lớp Adaptor của bạn

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

Ngoài ra, đó là một bản sao
Ricardo A.

4

Có thể nó giúp được ai đó nhưng nếu bạn đặt khả năng hiển thị của RecyclView thành Gone thì các phương thức của bộ điều hợp sẽ không được gọi ... Tôi đã mất một thời gian để tìm ra nó.


không thể tin được !!!!! ... xe tăng rất nhiều ,,,
X-Black ...

3

Tôi đã có cùng một vấn đề, bởi vì tôi đang sử dụng android.support.constraint.ConstraintLayouttrong tài nguyên bố trí. Thay đổi để FrameLayoutgiúp đỡ.


Cảm ơn bạn cho giải pháp của bạn. Bất cứ ý tưởng tại sao nó hành xử như thế này nếu cha mẹ View là android.support.constraint.ConstraintLayout?
Adrian Buciuman

2

Tùy chọn khác là nếu bạn gửi danh sách này objetc bằng cách sử dụng get, xác minh xem bạn có tham chiếu chính xác không, ví dụ

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

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

2

Tôi đã vật lộn với vấn đề này trong nhiều giờ. Tôi đã sử dụng một mảnh. Và vấn đề đã không trở lại view. Dưới đây là mã của tôi:

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;

Mã lạ. Các biến và lớp này là khó hiểu.
CoolMind

2

Xem câu trả lời của tôi nếu bạn đang sử dụng thư viện liên kết dữ liệu Android - Đảm bảo rằng bạn đang đặt bố cục cho recyclerview và số mục phải lớn hơn 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);
        }
    }

Chúc mừng mã hóa :-)


1

Trong trường hợp của tôi, tôi đặt ID của RecyclerView của mình thành "recyclerView". Có vẻ như ID này đã được xác định ở đâu đó, bởi vì khi tôi thay đổi nó thành ID khác, các phương thức từ bộ điều hợp đã được gọi đúng.


1

Nếu sử dụng bộ điều hợp tùy chỉnh, đừng quên đặt ItemCount thành kích thước của bộ sưu tập của bạn.


1

Trong trường hợp của tôi, kích thước danh sách của tôi là 0 và nó không gọi phương thức onCreateViewHolder. Tôi cần hiển thị một thông báo ở trung tâm cho danh sách trống với tư cách là người giữ chỗ vì vậy tôi đã làm nó như thế này và nó hoạt động như bùa mê. Trả lời bởi @Konstantin Burov đã giúp.

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

Đây không phải là một ý tưởng tốt thực sự. Tốt hơn là đặt mức độ hiển thị của thông báo trống khi đưa dữ liệu vào bộ điều hợp.
Ngày

1

Công cụ mã hóa của tôi là phương thức ghi đè onBindViewHolder (chủ sở hữu, vị trí) của RecyclerView.adaptor không được gọi. Phương thức onCreateViewHolder được gọi, getItemCount được gọi. Nếu bạn đọc thông số kỹ thuật cho Bộ chuyển đổi Recyclerview, bạn sẽ biết rằng nếu bạn đã ghi đè lênBindViewHolder (chủ sở hữu, vị trí, tải trọng danh sách) sẽ được gọi theo hướng có lợi. Vì vậy, hãy cẩn thận.


Làm thế nào bạn giải quyết một vấn đề không gọi onBindViewHolder?
CoolMind

1

Nếu bạn đặt quấn_content làm chiều cao của danh sách cũng như chiều cao của danh sách vật phẩm của bạn, sẽ không có gì hiển thị và không có chức năng recyclerView nào của bạn sẽ được gọi. Sửa chiều cao của mục hoặc đặt match_parent cho chiều cao danh sách. Điều đó đã giải quyết vấn đề của tôi.


1

Sai lầm của tôi là thổi phồng quan điểm sai lầm trong Fragment onCreateView.


1

đi đến xml của bạn. Và thay đổi bố cục của bạn để bọc nội dung. Một phần tử đang ẩn phần tiếp theo, vì vậy các phương thức không hoạt động!


1
Chào mừng bạn đến với StackOverflow @koala!. Xem phần này Cách viết câu trả lời hay tại đây stackoverflow.com/help/how-to-answer
Shashin Bhayani

0

Hãy làm những điều sau đây

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

0

Trong trường hợp của tôi sau khi thay đổi Activity để sử dụng ViewModel và DataBinding, tôi đã quên xóa setContentViewphương thức gọi khỏi onCreatephương thức. Bằng cách loại bỏ nó, vấn đề của tôi đã được giải quyết.


0

Đối với tôi, đó là vì setHasStableIds (đúng); phương pháp đã được thiết lập. Loại bỏ nó và nó sẽ hoạt động


Nhưng phương pháp này dường như không nằm trong ví dụ có thể lặp lại tối thiểu trong câu hỏi. Nếu loại bỏ gợi ý này sửa chữa một cái gì đó, nó có thể là một dấu hiệu của lỗi trong việc triển khai chủ sở hữu chế độ xem hoặc có thể là trình thông báo.

0

recyclerView.setAd CHƯƠNG (bộ chuyển đổi); được gọi là danh sách recyclerView được điền bằng cách gọi phương thức.


0

Hãy chắc chắn rằng mã của bạn XMLKoltin/Javamã phù hợp. Trong trường hợp của tôi, tôi đã gặp vấn đề với ViewHoldertừ khi tôi viết:

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

Nhưng vì mã XML của tôi là:

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

Tôi đã phải thay đổi hàng riêng tư thành:

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

Ngoài ra, tôi cũng phải xóa:

recyclerView.setHasFixedSize(true);

Tôi hy vọng điều này có thể giúp bạn :)


0

Trong trường hợp của tôi, tôi đã bị thiếu cuộc gọi notifyDataSetChanged()sau khi thiết lập danh sách trong bộ chuyển đổi.

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

0

Trong trường hợp của tôi, tôi bỏ lỡ việc đặt hướng trong linearLayout của mình.

Sau khi thêm vấn đề định hướng cố định.

 android:orientation="vertical"

0

Vấn đề của tôi là layout_heightlayout_widthcủa RecyclerView được đặt thành 0dp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.