onCreateViewHolder फोन नहीं Recyclerview


149

मेरे 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;
}

क्यों u recyclerView.setAdapter (एडॉप्टर) सेट करें; 2 बार?
पानायियोटिस इरकलेस

इस समस्या का एक अन्य कारण गलती से आइटम लेआउट माता-पिता की ऊंचाई से मेल खाता है, इसलिए एक बार में केवल एक आइटम दिखाया जाता है।
जो लैप

InvoicesRecyclerView.setHasFixedSize (सही) invoicesRecyclerView.setLayoutManager (GridLayoutManager (यह, 1)): मेरे मामले मदद इस में
a_subscriber

जवाबों:


238

आपका getItemCountतरीका returns 0। इसलिए RecyclerViewकभी किसी दृश्य को देखने की कोशिश नहीं करता। इसे कुछ वापस करो greater than 0

उदाहरण के लिए

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

25
हे भगवान, मुझे लगता है अभी गूंगा! : facepalm: इसके लिए धन्यवाद!
शिन्टा एस

3
मैं सिर्फ एक घंटे के लिए खो दिया क्योंकि getItemCount अन्य सभी कोड से नीचे था और मैंने इसे नहीं देखा। : |
जोएल

मेरे पास एक कस्टम एडॉप्टर था और अपने आइटम को अपने संग्रह के आकार पर सेट करना भूल गया था
डूई

3
मेरा आइटम नंबर 3 अभी भी दिखाई नहीं दे रहा है, कोई डिबग पॉइंट ऑनबाइंड या ऑनक्रिएटहॉल्डर में नहीं आता है ... लेकिन यह getItemCount में आता है
डॉ। एनडीआरओ

ओह यार! मैं भी यह जानने के लिए जूझ रहा था कि क्यों मेरा ब्रेकपॉइंट नहीं मार रहा है और अब मुझे पता है ... LOL! अरे नहीं!!! धन्यवाद!
विंसी

409

एक और सुनिश्चित करें कि आप RecyclerView में लेआउट प्रबंधक सेट करें:

recycler.setLayoutManager(new LinearLayoutManager(this));

2
मैं इस उत्तर पर बहुत बार
आता हूं


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

इसके लायक क्या है, मैंने इसे तब देखा जब मैंने एडेप्टर व्यू एडॉप्टर को एडेप्टर से पहले सेट किया था। समाधान यह सुनिश्चित करने के लिए 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किया था, यह रीसायकल व्यू के एडॉप्टर द्वारा लागू ब्लॉक में छाया हुआ था! मैंने एडेप्टर का नाम बदलकर प्रोजेक्टअडैप्टर कर दिया ताकि यह अंतर हो सके और समस्या हल हो जाए!


6

TextViewमें custom.xmlया की ऊंचाई निर्धारित करना RecyclerView। यदि ऊंचाई है wrap-content, तो RecyclerViewइच्छाशक्ति दिखाई नहीं देगी।


इस पर इतना समय खर्च किया गया .. पुनर्नवीनीकरण दृश्य की ऊंचाई शून्य थी। जब किसी गतिविधि में उपयोग किया जाता है, तो यह किसी तरह खुद को विस्तारित करता है। अन्य लेआउट के अंदर एक टुकड़े में .. यह नहीं था
आसिफ शिराज

4

यह तब हुआ जब मैं RecyclerViewअंदर था ScrollViewऔर मैं एंड्रॉइड सपोर्ट लाइब्रेरी 23.0 का उपयोग कर रहा था। ठीक करने के लिए, मैंने एंड्रॉइड सपोर्ट लाइब्रेरी को 23.2 अपडेट किया:

बिल्ड.ग्रेड में:

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


4

हो सकता है कि यह किसी की मदद करे, लेकिन अगर आपने अपने रीसायकल व्यू की दृश्यता को GONE पर सेट कर दिया है तो एडॉप्टर के तरीकों को बिल्कुल भी नहीं बुलाया जाएगा ... मुझे यह पता लगाने के लिए कुछ समय लिया।


अविश्वसनीय !!!!! ... टैंक बहुत ज्यादा ,,,
X-Black ...

3

मुझे वही समस्या थी, क्योंकि मैं android.support.constraint.ConstraintLayoutलेआउट संसाधन में उपयोग कर रहा था । FrameLayoutमदद करने के लिए बदल रहा है ।


आपके समाधान के लिए धन्यवाद। किसी भी विचार क्यों यह इस तरह से व्यवहार करता है अगर दृश्य माता-पिता है android.support.constraint.ConstraintLayout?
एड्रियन बुलेमन

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

यदि आप एंड्रॉइड डेटा बाइंडिंग लाइब्रेरी का उपयोग कर रहे हैं तो मेरा उत्तर देखें - सुनिश्चित करें कि आप 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 की आईडी को "recyclerView" पर सेट किया। ऐसा लगता है कि इस आईडी को पहले से ही कहीं न कहीं परिभाषित किया गया था, क्योंकि जब मैंने इसे अलग-अलग आईडी में बदल दिया, तो एडेप्टर के तरीकों को ठीक से बुलाया गया।


1

यदि एक कस्टम एडेप्टर का उपयोग करके अपने संग्रह के आकार के लिए ItemCount सेट करना न भूलें।


1

मेरे मामले में, मेरी सूची का आकार 0 था और यह onCreateViewHolder विधि को कॉल नहीं कर रहा था। मुझे एक प्लेसहोल्डर के रूप में खाली सूची के लिए केंद्र में एक संदेश प्रदर्शित करने की आवश्यकता थी इसलिए मैंने इसे इस तरह किया और इसने आकर्षण की तरह काम किया। @Konstantin Burov द्वारा उत्तर में मदद मिली।

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

यह एक अच्छा विचार नहीं है। एडॉप्टर में डेटा डालते समय खाली संदेश की दृश्यता को सेट करना बेहतर होता है।
अविश्वसनीय जन

1

मेरा एनकाउंटर OnBindViewHolder (धारक, स्थिति) था जिसे RecyclerView.adaptor की ओवरराइड विधि कहा जा रहा था। विधि onCreateViewHolder कहा जाता था, getItemCount कहा जाता था। यदि आप Recyclerview एडाप्टर के लिए चश्मा पढ़ते हैं, तो आप सीखेंगे कि यदि आपने onBindViewHolder (धारक, स्थिति, सूची पेलोड) को ओवरराइड किया है, तो पक्ष में कहा जाएगा। इसलिए कृपया सावधान रहें।


आपने फोन न करने की समस्या को कैसे हल किया onBindViewHolder?
कूलमाइंड

1

यदि आप अपनी सूची की ऊँचाई के साथ-साथ अपने आइटम सूची की ऊँचाई के रूप में भी रैप_कॉन्‍टेंट रखते हैं, तो कुछ भी नहीं दिखाई देगा और आपके पुनरावर्तन दृश्य में से कोई भी कार्य नहीं कहा जाएगा। आइटम की ऊंचाई को ठीक करें या सूची की ऊंचाई के लिए match_parent डालें। इससे मेरी समस्या हल हो गई।


1

मेरी गलती Fragment onCreateView में गलत दृश्य को बढ़ा रही थी।


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

मेरे मामले में मैं अपने रेखीय लयआउट में अभिविन्यास सेट करने से चूक गया।

ओरिएंटेशन समस्या को जोड़ने के बाद ठीक किया गया।

 android:orientation="vertical"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.