Recyclerview가 onCreateViewHolder를 호출하지 않습니다


150

내는 RecyclerView호출하지 않습니다 onCreateViewHolder, onBindViewHolderMenuViewHolder에 따라서 아무것도 나타납니다, 생성자를 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 (adapter)를 설정했는지; 2 배?
Panayiotis Irakleous

이 문제의 또 다른 원인은 실수로 항목 레이아웃을 부모의 높이와 일치시키기 때문에 한 번에 하나의 항목 만 표시됩니다.
Joe Lapp

내 경우에 도움이됩니다 : invoicesRecyclerView.setHasFixedSize (true) invoicesRecyclerView.setLayoutManager (GridLayoutManager (this, 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
Dr. aNdRO

오! 나도 이것으로 싸우면서 내 브레이크 포인트가 왜 안 타르는지 알아 냈는데 이제는 ... LOL! 제길!!! 감사합니다!
Vincy

409

다른 하나는 레이아웃 관리자를 RecyclerView로 설정했는지 확인하는 것입니다.

recycler.setLayoutManager(new LinearLayoutManager(this));

2
나는 너무 자주이 답변으로 돌아온다…
finki


15

특정 경우에는 적용되지 않습니다. 그러나 이것은 다른 사람을 도울 수 있습니다.

이 이유는 다음 방법을 부주의하게 사용했을 수 있습니다.

recyclerView.setHasFixedSize(true);

주의 사용되지 않은 경우,이는 발생할 수 있습니다 onBindViewonCreateViewHolder에 로그에 오류없이, 전혀 호출 할 수 없습니다.


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

가치있는 점을 위해 , 어댑터가 실제로 초기화 되기 전에 리사이클 뷰 어댑터 설정할 때 그것을 관찰했습니다 . 해결책은 recyclerView.setAdapter(adapter)널이 아닌 어댑터로 호출 되었는지 확인하는 것이 었습니다.


9

나는 이것이 언젠가 누군가에게 도움이되기를 정말로 바랍니다. 나는이 견과류에 1 시간 이상을 보낸다!

나는 이것을 가지고 있었다 :

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

내가 이것을 가져야했을 때 :

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

어리석게도 내 어댑터를 호출했기 때문에 adapterapply 블록에서 재활용 뷰의 어댑터로 인해 그림자가되었습니다! 어댑터를 projectAdapter로 이름을 바꾸고 문제를 해결했습니다!


6

의 높이 설정 TextView에서 custom.xml또는 RecyclerView. 높이가 wrap-content인 경우 RecyclerView표시되지 않습니다.


이것에 너무 많은 시간을 보냈습니다. 리사이클 러 뷰의 높이는 0이었습니다. 액티비티에 사용될 때, 그것은 어떻게 든 확장되었습니다. 다른 레이아웃 내부의 조각에서 ..하지 않았다
Asif Shiraz

4

이것은 내 RecyclerView안에 ScrollView있었고 Android Support Library 23.0을 사용하고 있었을 때 발생했습니다 . 수정하려면 Android Support Library 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- 블랙 ...

3

android.support.constraint.ConstraintLayout레이아웃 리소스를 사용했기 때문에 같은 문제가 발생했습니다 . FrameLayout도움으로 변경 .


솔루션 주셔서 감사합니다. View 부모가 왜 이런 식으로 작동하는지 알 수 android.support.constraint.ConstraintLayout있습니까?
Adrian Buciuman

2

다른 옵션은 get을 사용 하여이 목록을 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;

이상한 코드. 이러한 변수와 클래스는 이해하기 어렵습니다.
CoolMind

2

안드로이드 데이터 바인딩 라이브러리를 사용하는 경우 내 대답을 참조하십시오-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

제 경우에는 RecyclerView의 ID를 "recyclerView"로 설정했습니다. 이 ID를 다른 위치로 이미 정의한 것 같습니다. 다른 ID로 변경하면 어댑터의 메소드가 올바르게 호출 되었기 때문입니다.


1

사용자 정의 어댑터를 사용하는 경우 ItemCount를 컬렉션 크기로 설정하는 것을 잊지 마십시오.


1

필자의 경우 목록 크기는 0이며 onCreateViewHolder 메서드를 호출하지 않았습니다. 빈 목록에 대한 메시지를 자리 표시 자로 중앙에 표시해야했기 때문에 이렇게 했으므로 매력처럼 작동했습니다. 의해 답변을 @Konstantin Burov helped.

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

이것은 좋은 생각이 아닙니다. 어댑터에 데이터를 넣을 때 빈 메시지의 가시성을 설정하는 것이 좋습니다.
놀라운 1

1

내 encouter는 호출되지 않은 RecyclerView.adaptor의 onBindViewHolder (holder, position) 재정의 된 메소드였습니다. onCreateViewHolder 메소드가 호출되었으며 getItemCount가 호출되었습니다. Recyclerview Adapter의 사양을 읽으면 onBindViewHolder (holder, position, List payloads)를 재정의 한 경우 우선적으로 호출됩니다. 그러니 조심하세요


전화하지 않는 문제를 어떻게 해결 했 onBindViewHolder습니까?
CoolMind

1

wrap_content를 목록의 높이와 항목 목록의 높이로 설정하면 아무것도 표시되지 않으며 recyclerView 함수가 호출되지 않습니다. 항목의 높이를 수정하거나 목록 높이에 match_parent를 입력하십시오. 그게 내 문제를 해결했다.


1

내 실수는 Fragment onCreateView에서 잘못된보기를 팽창시키는 것입니다.


1

XML로 이동하십시오. 내용을 감싸도록 레이아웃을 변경하십시오. 한 요소가 다음 요소를 숨기고 있으므로 메소드가 작동하지 않습니다!


1
StackOverflow @koala!에 오신 것을 환영합니다. 여기에 좋은 답변을 작성하는 방법을 참조 하십시오 stackoverflow.com/help/how-to-answer
Shashin Bhayani


0

내 경우에는 ViewModel 및 DataBinding을 사용하도록 Activity를 변경 한 후 setContentView메소드에서 onCreate메소드 호출 을 제거 하는 것을 잊었습니다 . 그것을 제거함으로써 내 문제가 해결되었습니다.


0

나에게는 setHasStableIds (true); 방법이 설정되었습니다. 그것을 제거하면 작동합니다


그러나이 방법은 문제에서 최소한의 재현 가능한 예 는 아닙니다 . 이 힌트를 제거하면 문제가 해결 될 수 있으며, 아마도 뷰 홀더 또는 알리미 구현에 버그가 있음을 나타냅니다.


0

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

0

내 문제는 layout_heightlayout_widthRecyclerView가로 설정되었습니다 0dp.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.