recyclerview कोई एडाप्टर संलग्न नहीं; स्किपिंग लेआउट


241

बस RecyclerViewमेरे कोड में लागू किया गया, प्रतिस्थापित कर रहा है ListView

सब कुछ ठीक काम करता है। डेटा प्रदर्शित किया जाता है।

लेकिन त्रुटि संदेश लॉग किए जा रहे हैं:

15:25:53.476 E/RecyclerView: No adapter attached; skipping layout

15:25:53.655 E/RecyclerView: No adapter attached; skipping layout

निम्नलिखित कोड के लिए:

ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

जैसा कि आप देख सकते हैं कि मैंने इसके लिए एक एडाप्टर संलग्न किया है RecyclerView। तो मुझे यह त्रुटि क्यों हो रही है?

मैंने उसी समस्या से संबंधित अन्य प्रश्न पढ़े हैं, लेकिन उनमें से कोई भी मदद नहीं करता है।


क्या कलाकार खाली है? क्या होता है आप स्विच एडेप्टर और सेटलैट मैनजर को स्विच करते हैं?
ब्लैकबेल्ट

आपको
बजे

12
आप इसे देख रहे होंगे यदि आप विंडो से जुड़ते ही recyclerview को इनिशियलाइज़ नहीं कर रहे हैं।
यजीत

1
@yigit मैं डेटा डाउनलोड करने के लिए रेट्रोफ़िट की प्रतीक्षा कर रहा हूं और इसके बाद दिए गए कोड रन समाप्त हो गए हैं!
बराबर

3
यह त्रुटि कितनी गंभीर है? क्या इसे नजरअंदाज किया जा सकता है? वैसे भी मैं त्रुटि से बचने के लिए setAdapter (नल) का उपयोग करता हूं।
प्रियांकवेक्स

जवाबों:


243

क्या आप यह सुनिश्चित कर सकते हैं कि आप इन कथनों को "मुख्य" धागे से कह रहे हैं (उदाहरण के लिए onCreate()विधि के अंदर )। जैसे ही मैं एक "देरी" विधि से एक ही बयान कॉल करता हूं। मेरे मामले में ResultCallbackमुझे एक ही संदेश मिलता है।

मेरे में Fragment, एक ResultCallbackविधि के अंदर से नीचे दिए गए कोड को कॉल करना एक ही संदेश पैदा करता है। onConnected()मेरे ऐप के भीतर कोड को विधि पर ले जाने के बाद , संदेश चला गया था ...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );

9
लेकिन मुझे पहले डेटा डाउनलोड करना होगा फिर डिस्प्ले करना होगा!
४६

93
बस एक खाली एडॉप्टर पहले सेट करें, जैसे ही आपके पास डेटा हो, इसे अपडेट करें (यह मेरे लिए काम करता है)।
पीटर

3
यही यजीत ने सुझाव दिया!
११:१६

13
@equitharn आपको पहले एक खाली एडेप्टर सेट करना चाहिए, और फिर डेटा डाउनलोड किया जाता है, कॉल करें mAdapter.notifyDataSetChanged (), जो मेरे लिए काम करता है।
डोमोनली

2
यह समाधान मेरी मदद नहीं कर रहा है। वास्तव में इस सूत्र में कोई समाधान मेरी मदद नहीं कर रहा है। क्या कोई मेरे मामले को यहाँ
पुलक

41

जब तक मैं अपने कोड में दो चीजें तय नहीं करता, मुझे दो त्रुटि संदेश मिल रहे थे:

(1) डिफ़ॉल्ट रूप से, जब आप इसमें तरीके लागू RecyclerView.Adapterकरते हैं:

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

सुनिश्चित करें कि आप अपना कोड अपडेट करते हैं इसलिए यह कहता है:

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

जाहिर है अगर आपके आइटम में शून्य आइटम हैं तो आपको स्क्रीन पर प्रदर्शित शून्य चीजें मिलेंगी।

(2) मैं ऐसा नहीं कर रहा था जैसा कि शीर्ष उत्तर में दिखाया गया है: कार्ड व्यू लेआउट_ एक्सपोज़र = "match_parent" माता-पिता से मेल नहीं खाता है

//correct
LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);

//incorrect (what I had)
LayoutInflater.from(parent.getContext())
        .inflate(R.layout.card_listitem,null);

(३) संपादित करें: बोनस: यह भी सुनिश्चित करें कि आपने अपना सेट RecyclerViewइस तरह बनाया है:

<android.support.v7.widget.RecyclerView
    android:id="@+id/RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

इस तरह नहीं:

<view
    android:id="@+id/RecyclerView"
    class="android.support.v7.widget.RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

मैंने बाद के तरीके का उपयोग करके कुछ ट्यूटोरियल देखे हैं। जबकि यह काम करता है मुझे लगता है कि यह इस त्रुटि को भी उत्पन्न करता है।


1
मेरे getItemCount () इस तरह दिखता है public int getItemCount() { return artists == null ? 0 : artists.size(); }और लेआउटइन्फ्लैटरView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
22

यह मेरे लिए काम करता है: @Override public int getItemCount () {रिटर्न आर्टिस्ट्स.साइज (); }
एस्टोनचाइ

4
हे भगवान। वह क्षण जब आप एसओ में वापस आते हैं, और एक उत्तर देखते हैं कि आपने पहले ही उत्थान किया था, और महसूस करें कि आप वही बेवकूफ काम कर रहे थे। फिर से धन्यवाद @Micro।
androidevil

20

मेरे साथ भी यही स्थिति है, प्रदर्शन ठीक है, लेकिन त्रुटि स्थान में दिखाई देती है। यह मेरा समाधान है: (1) RecyclerView को प्रारंभ करें और CREATE () पर एडाप्टर को बांधें

RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid);
mRecycler.setAdapter(adapter);

(2) कॉल करें जब आप डेटा प्राप्त करते हैं तो सूचित करें

adapter.notifyDataStateChanged();

RecyclerView के स्रोत कोड में, डेटा की स्थिति की जांच करने के लिए अन्य थ्रेड है।

public RecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.mObserver = new RecyclerView.RecyclerViewDataObserver(null);
    this.mRecycler = new RecyclerView.Recycler();
    this.mUpdateChildViewsRunnable = new Runnable() {
        public void run() {
            if(RecyclerView.this.mFirstLayoutComplete) {
                if(RecyclerView.this.mDataSetHasChangedAfterLayout) {
                    TraceCompat.beginSection("RV FullInvalidate");
                    RecyclerView.this.dispatchLayout();
                    TraceCompat.endSection();
                } else if(RecyclerView.this.mAdapterHelper.hasPendingUpdates()) {
                    TraceCompat.beginSection("RV PartialInvalidate");
                    RecyclerView.this.eatRequestLayout();
                    RecyclerView.this.mAdapterHelper.preProcess();
                    if(!RecyclerView.this.mLayoutRequestEaten) {
                        RecyclerView.this.rebindUpdatedViewHolders();
                    }

                    RecyclerView.this.resumeRequestLayout(true);
                    TraceCompat.endSection();
                }

            }
        }
    };

प्रेषण में (), हम पा सकते हैं कि इसमें त्रुटि है:

void dispatchLayout() {
    if(this.mAdapter == null) {
        Log.e("RecyclerView", "No adapter attached; skipping layout");
    } else if(this.mLayout == null) {
        Log.e("RecyclerView", "No layout manager attached; skipping layout");
    } else {

11

मुझे यह समस्या है, कुछ समय की समस्या स्क्रॉल दृश्य ऑब्जेक्ट में recycleView डाल दिया गया है

कार्यान्वयन की जाँच करने के बाद, कारण निम्न प्रतीत होता है। यदि RecyclerView एक स्क्रॉलव्यू में डाल दिया जाता है, तो माप चरण के दौरान इसकी ऊंचाई अनिर्दिष्ट होती है (क्योंकि स्क्रॉलव्यू किसी भी ऊंचाई की अनुमति देता है) और, परिणामस्वरूप, न्यूनतम ऊंचाई के बराबर हो जाता है (कार्यान्वयन के अनुसार) जो जाहिरा तौर पर शून्य है।

इसे ठीक करने के लिए आपके पास कुछ विकल्प हैं:

  1. RecyclerView के लिए एक निश्चित ऊंचाई सेट करें
  2. स्क्रोल व्यू.फिल व्यूपोर्ट को सच पर सेट करें
  3. या स्क्रॉल दृश्य के बाहर RecyclerView रखें। मेरी राय में, यह अब तक का सबसे अच्छा विकल्प है। यदि RecyclerView की ऊँचाई सीमित नहीं है - जो कि स्क्रॉलव्यू में डालने पर ऐसा होता है - तो सभी एडेप्टर के विचारों में लंबवत रूप से पर्याप्त जगह होती है और सभी एक ही बार में बन जाते हैं। अब कोई भी रिसाइकिलिंग नहीं है जो थोड़े से रिसाइक्लरव्यू के उद्देश्य को तोड़ती है।

( android.support.v4.widget.NestedScrollViewसाथ ही इसके लिए अनुसरण किया जा सकता है )


ScrollView.fillViewport को सच में मेरी समस्या को हल करने के लिए, धन्यवाद एक गुच्छा
Eman

10

1) ViewHolder बनाएँ जो कुछ भी नहीं करता है :)

// SampleHolder.java
public class SampleHolder extends RecyclerView.ViewHolder {
    public SampleHolder(View itemView) {
        super(itemView);
    }
}

2) फिर से बनाने के लिए RecyclerView कि कुछ भी नहीं है :)

// SampleRecycler.java
public class SampleRecycler extends RecyclerView.Adapter<SampleHolder> {
    @Override
    public SampleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(SampleHolder holder, int position) {

    }

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

3) अब जब आपका वास्तविक पुनर्नवीनीकरण तैयार नहीं है तो नीचे दिए गए नमूने का उपयोग करें।

RecyclerView myRecycler = (RecyclerView) findViewById(R.id.recycler_id);
myRecycler.setLayoutManager(new LinearLayoutManager(this));
myRecycler.setAdapter(new SampleRecycler());

यह सबसे अच्छा समाधान नहीं है, लेकिन यह काम करता है! आशा है कि यह उपयोगी है।


नमस्ते, कृपया मेरे पास वही त्रुटि है और मुझे नहीं पता कि मुझे कहां जांचना चाहिए कि अगर रिसाइकलर एक खाली एडॉप्टर के लिए तैयार नहीं है) और जहां मैं देख सकता हूं कि रिसाइकलर तैयार है (डेटा के साथ एडॉप्टर पास करने के लिए)
जेम्स

यह बहुत अच्छा है, यहां ड्रैग एन
nmu

9

यह तब होता है जब आप निर्माण के चरण के दौरान एडेप्टर सेट नहीं कर रहे होते हैं:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    ....
}

public void onResume() {
    super.onResume();
    mRecyclerView.setAdapter(mAdapter);
    ....
}

बस एक खाली डेटा के साथ ऑनक्रीट में एडेप्टर को सेट करें और जब आपके पास डेटा कॉल हो:

mAdapter.notifyDataSetChanged();

सुनिश्चित करें कि आपने onadreate पद्धति में कस्टमैडस्केप कंस्ट्रक्टर में डेटा सेट किया है
मोहित सिंह

4

जांचें कि क्या आप अपने एडॉप्टर में इस विधि को कॉल करने से चूक गए हैं

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

3

सुनिश्चित करें कि आपने अपने RecyclerView के लिए लेआउट प्रबंधक सेट किया है:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

इसके बजाय LinearLayoutManager, आप अन्य लेआउट प्रबंधकों का भी उपयोग कर सकते हैं ।


3

मुझे वही त्रुटि थी जो मैंने इसे ठीक करने के लिए तय की थी यदि आप मेरे जैसे डेटा का इंतजार कर रहे हैं, जैसे कि रेट्रोफिट या ऐसा कुछ

Oncreate के सामने रखें

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

उन्हें अपने Oncreate में रखें

 recyclerView = (RecyclerView) findViewById(R.id.cardList);
 recyclerView.setHasFixedSize(true);
 recyclerView.setLayoutManager(new LinearLayoutManager(this));
 adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
 recyclerView.setAdapter(adapter);

जब आप डेटा पुट प्राप्त करते हैं

adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);

अब अपने ArtistArrayAdapter क्लास में जाएं और यह करें कि यह क्या करेगा यदि आपकी सरणी खाली है या अशक्त है तो यह GetItemCount को 0 कर देगा यदि यह इसे आर्टिस्ट सरणी का आकार नहीं देगा

@Override
public int getItemCount() {

    int a ;

    if(artists != null && !artists.isEmpty()) {

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}


2

ऐसा इसलिए होता है क्योंकि वास्तविक फुलाया हुआ लेआउट उससे भिन्न होता है जो कि recyclerView को खोजते समय आपके द्वारा संदर्भित किया जा रहा है। डिफ़ॉल्ट रूप से जब आप टुकड़ा बनाते हैं, तो ऑनक्रिएट व्यू विधि निम्नानुसार दिखाई देती है: return inflater.inflate(R.layout.<related layout>,container.false);

इसके बजाय, अलग से दृश्य बनाएं और उपयोग करें कि recyclerView को देखें View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;


2

पहले एडॉप्टर को इनिशियलाइज़ करें

public void initializeComments(){
    comments = new ArrayList<>();

    comments_myRecyclerView = (RecyclerView) findViewById(R.id.comments_recycler);
    comments_mLayoutManager = new LinearLayoutManager(myContext);
    comments_myRecyclerView.setLayoutManager(comments_mLayoutManager);

    updateComments();
    getCommentsData();

}

public void updateComments(){

    comments_mAdapter = new CommentsAdapter(comments, myContext);
    comments_myRecyclerView.setAdapter(comments_mAdapter);
}

जब कभी डेटासेट सेट में कोई बदलाव होता है, तो बस अपडेटकॉमेंट विधि को कॉल करें।


2

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

मैं एडॉप्टर के लिए सब कुछ सही ढंग से कनेक्ट और कर रहा था, लेकिन मैंने कभी बाध्यकारी नहीं किया। @Prateek अग्रवाल के इस जवाब से मेरे लिए यह सब होता है, लेकिन यहाँ अधिक विस्तार है।

Kotlin

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    val rootView =  inflater?.inflate(R.layout.fragment_layout, container, false)
    recyclerView = rootView?.findViewById(R.id.recycler_view_id)
    // rest of my stuff
    recyclerView?.setHasFixedSize(true)
    recyclerView?.layoutManager = viewManager
    recyclerView?.adapter = viewAdapter
    // return the root view
    return rootView
}

जावा

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView= inflater.inflate(R.layout.fragment_layout,container,false);
    recyclerview= rootView.findViewById(R.id.recycler_view_id);
    return rootView;
}

1
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);

बस इसके साथ उपरोक्त कोड को प्रतिस्थापित करें और इसे काम करना चाहिए। लेआउट प्रबंधक को कॉल करने से पहले आपने जो किया वह गलत था।


1

यह वास्तव में एक साधारण त्रुटि है जो आपको मिल रही है, इसमें कोई कोड करने की आवश्यकता नहीं है। यह त्रुटि गतिविधि द्वारा उपयोग की गई गलत लेआउट फ़ाइल के कारण होती है। आईडीई द्वारा मैंने स्वचालित रूप से एक लेआउट का लेआउट v21 बनाया जो गतिविधि का एक डिफ़ॉल्ट लेआउट बन गया। सभी कोड जो मैंने पुराने लेआउट फ़ाइल में किए थे और नए थे उनमें केवल कुछ xml कोड थे, जिससे वह त्रुटि हुई।

समाधान: पुराने लेआउट के सभी कोड कॉपी करें और लेआउट v 21 में पेस्ट करें


1

मेरे मामले में, मैं कॉलपॉइंट के अंदर एडेप्टर सेट कर रहा था onLocationChanged()और एमुलेटर में डिबगिंग कर रहा था । चूंकि यह एक स्थान परिवर्तन का पता नहीं लगा, इसलिए इसे कभी नहीं हटाया गया जब मैंने उन्हें मैन्युअल रूप से एमुलेटर के विस्तारित नियंत्रणों में सेट किया तो यह उम्मीद के मुताबिक काम किया।


1

मैंने इस त्रुटि को हल कर दिया है। आपको बस लेआउट प्रबंधक जोड़ने और खाली एडेप्टर जोड़ने की आवश्यकता है।

इस कोड की तरह:

myRecyclerView.setLayoutManager(...//your layout manager);
        myRecyclerView.setAdapter(new RecyclerView.Adapter() {
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                return null;
            }

            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

            }

            @Override
            public int getItemCount() {
                return 0;
            }
        });
//other code's 
// and for change you can use if(mrecyclerview.getadapter != speacialadapter){
//replice your adapter
//}

1
मैं इसे शुरुआती उपयोगकर्ताओं के लिए करता हूं
mehdi janbarari

1

बस करने के लिए निम्नलिखित जोड़ें RecyclerView

app:layoutManager="android.support.v7.widget.LinearLayoutManager"

उदाहरण:

   <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
        app:layout_constraintBottom_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

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

1

मेरे पास यह त्रुटि थी, और मैंने कुछ समय तक हल करने की कोशिश की जब तक कि मुझे समाधान नहीं मिला।

मैंने एक निजी तरीका buildRecyclerView बनाया, और मैंने इसे दो बार कॉल किया, पहला onCreateView पर और फिर मेरे कॉलबैक (जिसमें मैं एक एपीआई से डेटा प्राप्त करता हूं) के बाद। यह मेरा तरीका है मेरी फ्रेगमेंट में buildRecyclerView:

private void buildRecyclerView(View v) {
        mRecyclerView = v.findViewById(R.id.recycler_view_loan);
        mLayoutManager = new LinearLayoutManager(getActivity());
        ((LinearLayoutManager) mLayoutManager).setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new LoanAdapter(mExampleList);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
}

इसके अलावा, मुझे अपने एडॉप्टर में मेथड-आइटम-काउंट को संशोधित करना होगा, क्योंकि ऑन-क्रिएट-व्यू लिस्ट अशक्त है और यह एक त्रुटि के माध्यम से है। तो, मेरा गेट-आइटम-गणना निम्नलिखित है:

@Override
    public int getItemCount() {
        try {
            return mLoanList.size();
        } catch (Exception ex){return 0;}

    }

0

मेरी स्थिति में यह एक भूल गया घटक था जो व्यूहॉल्ड क्लास में स्थित है, लेकिन यह लेआउट फ़ाइल में स्थित नहीं था


0

मैं एक ही समस्या थी और महसूस किया कि मैं दोनों की स्थापना की गई थी LayoutManage r और अनुकूलक मेरे स्रोत से डेटा प्राप्त करने के बजाय दो सेट करने के बाद onCreate विधि।

salesAdapter = new SalesAdapter(this,ordersList);
        salesView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        salesView.setAdapter(salesAdapter);

फिर डेटा परिवर्तन पर एडाप्टर को सूचित किया

               //get the Orders
                Orders orders;
                JSONArray ordersArray = jObj.getJSONArray("orders");
                    for (int i = 0; i < ordersArray.length() ; i++) {
                        JSONObject orderItem = ordersArray.getJSONObject(i);
                        //populate the Order model

                        orders = new Orders(
                                orderItem.getString("order_id"),
                                orderItem.getString("customer"),
                                orderItem.getString("date_added"),
                                orderItem.getString("total"));
                        ordersList.add(i,orders);
                        salesAdapter.notifyDataSetChanged();
                    }

0

यह समस्या इसलिए है क्योंकि आप LayoutManagerअपने लिए कोई जोड़ नहीं रहे हैं RecyclerView

एक और कारण यह है कि आप इस कोड को नॉनयूथ्रेड में कह रहे हैं। इस कॉल को UIThread में करना सुनिश्चित करें।

समाधान केवल आपके लिए UI थ्रेड में आपके LayoutManagerलिए RecyclerViewपहले जोड़ना है setAdapter

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

यदि आपको LayoutManager को सेट करने में देरी करने की आवश्यकता है, तो आपको अपनी कॉलबैक विधि से यह करना चाहिए: recyclerView.post ((- -> {recyclerView.setLayoutManager) (mGridLayoutManager); recyclerView.addItemDecoration (new ItemOffsetDecoration (itemGap));
आइजेन

0

मेरी समस्या यह थी कि मेरा पुनर्नवीनीकरण दृश्य इस तरह दिखता था

        <android.support.v7.widget.RecyclerView
        android:id="@+id/chatview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">
    </android.support.v7.widget.RecyclerView>

जब ऐसा दिखना चाहिए था

       <android.support.v7.widget.RecyclerView
        android:id="@+id/chatview"
        android:layout_width="395dp"
        android:layout_height="525dp"
        android:layout_marginTop="52dp"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="8dp"></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>

0

अपने RecyclerViewएडेप्टर वर्ग में, उदाहरण के लिए MyRecyclerViewAdapter, निम्न पार्म्स के साथ एक कंस्ट्रक्टर बनाएं।

MyRecyclerViewAdapter(Context context, List<String> data) {
    this.mInflater = LayoutInflater.from(context); // <-- This is the line most people include me miss
    this.mData = data;
}

mDataवह डेटा है जिसे आप एडॉप्टर से पास करेंगे। यदि आपके पास पास होने के लिए कोई डेटा नहीं है तो यह वैकल्पिक है। mInflaterवह LayoutInflaterवस्तु है जिसे आपने बनाया है और आप OnCreateViewHolderएडॉप्टर के कार्य में उपयोग करते हैं ।

इसके बाद, आप एडॉप्टर को मेनऐक्टिविटी में संलग्न करते हैं या जहां भी आप मुख्य / यूआई थ्रेड को ठीक से पसंद करना चाहते हैं

MyRecyclerViewAdapter recyclerAdapter;
OurDataStuff mData;

    ....
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Like this:

        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerAdapter = new RecyclerAdapter(this, mData); //this, is the context. mData is the data you want to pass if you have any
        recyclerView.setAdapter(recyclerAdapter);
    }
   ....

0

प्रारंभिक खाली सूची और एडेप्टर को नीचे की ओर सेट करके और परिणाम आने पर अधिसूचित किए गए CallDataSetChanged को हल करके।

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerviewItems.setLayoutManager(linearLayoutManager);
    someAdapter = new SomeAdapter(getContext(),feedList);
    recyclerviewItems.setAdapter(someAdapter);

0

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

यह पता लगाने में लंबा समय लगा कि मेरे पास कोई लेआउटमैन क्यों नहीं था - लेकिन स्पष्ट रूप से विचारों को इंजेक्ट किया जाता है, इसलिए वे वास्तव में अशक्त नहीं होंगे, इसलिए रिसाइकलर कभी भी अशक्त नहीं होगा .. वूप्स!

@BindView(R.id.recycler_view)
RecyclerView recyclerView;

    @Override
public View onCreateView(......) {
    View v = ...;
    ButterKnife.bind(this, v);
    setUpRecycler()
 }

public void setUpRecycler(Data data)
   if (recyclerView == null) {
 /*very silly because this will never happen*/
       LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
       //more setup
       //...
    }
    recyclerView.setAdapter(new XAdapter(data));
}

यदि आपको इस तरह का कोई मुद्दा मिल रहा है तो अपना दृष्टिकोण ट्रेस करें और जैसे कुछ का उपयोग करें uiautomatorviewer


0

ज्यादा जवाब नहीं लेकिन मुझे वही समस्या आ रही थी जो कोड के सही होने के साथ भी थी। कभी कभी, इसका सिर्फ सबसे सरल है। इस मामले में, ओपी की त्रुटि <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />मेनिफेस्ट से भी गायब हो सकती है , जो उसी त्रुटि को दोहराता है।


0

मेरे मामले में यह हुआ क्योंकि मैं एक LinearLayout में एक RecyclerView एम्बेडेड था।

मैंने पहले एक लेआउट फाइल की थी जिसमें केवल एक रूट RecyclerView शामिल था

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:listitem="@layout/fragment_products"

    android:name="Products.ProductsFragment"
    app:layoutManager="LinearLayoutManager"
    tools:context=".Products.ProductsFragment"

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"/>

मेरा मानना ​​है कि समस्या 3 लाइनों के भीतर है। वैसे भी, मुझे लगता है कि इसकी एक साधारण समस्या है, कल इस पर काम करना; सोचा था कि इस धागे के बारे में भूलने से पहले मुझे जो लिखना चाहिए वह लिखूँ।


0

एक और जवाब जोड़ने के बाद से मैं इस त्रुटि को देखते हुए धागा आया। मैं इनिशियलाइज़ करने की कोशिश कर रहा था PreferenceFragmentCompatलेकिन मैं onCreatePreferencesइस तरह से एक्सएमएल को वरीयता देना भूल गया :

class SettingsFragment : PreferenceFragmentCompat() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val inflater = LayoutInflater.from(context)
        inflater.inflate(R.layout.fragment_settings, null)
    }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        // Missing this line here:
        //   setPreferencesFromResource(R.xml.settings, rootKey)
    }
}

त्रुटि एक रहस्य थी जब तक मुझे एहसास नहीं हुआ कि आंतरिक रूप से PreferenceFragmentCompatउपयोग करना चाहिए RecyclerView


0

// ऐसा तब होता है जब आप निर्माण के चरण के दौरान एडेप्टर सेट नहीं कर रहे होते हैं: जब आपके प्रतिक्रिया को इसकी कार्यप्रणाली मिल रही हो, तो InformDataSetChanged () को कॉल करें।

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);


        magazineAdapter = new MagazineAdapter(getContext(), null, this );
        newClipRecyclerView.setAdapter(magazineAdapter);
        magazineAdapter.notifyDataSetChanged();

       APICall();
}

public void APICall() {
    if(Response.isSuccessfull()){
    mRecyclerView.setAdapter(mAdapter);
   }
}
Just move setting the adapter into onCreate with an empty data and when you have the data call:

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