পুনর্ব্যবহারযোগ্য কোনও অ্যাডাপ্টার সংযুক্ত নয়; স্কিপিং লেআউট


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
আপনি যদি উইন্ডোটি সংযুক্ত হওয়ার সাথে সাথে পুনর্ব্যবহারযোগ্য পর্যবেক্ষণটি শুরু না করে থাকেন তবে আপনি এটি দেখতে পাচ্ছেন।
ইজিগিত

1
@ হাইজিট আমি ডেটা ডাউনলোড করার জন্য পুনঃনির্মাণের জন্য অপেক্ষা করছি এবং প্রদত্ত কোডটি রান শেষ করার পরে!
ইক্যুথার্ন

3
এই ত্রুটিটি কতটা গুরুতর? এটিকে কি উপেক্ষা করা যায়? যাইহোক আমি ত্রুটি এড়াতে সেটএডাপ্টার (নাল) ব্যবহার করি।
priyankvex

উত্তর:


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 কল করুন not নোটডাইটা ডেটাসেট চেঞ্জড (), এটি আমার জন্য কাজ করা।
ডমোনলি

2
এই সমাধানটি আমাকে সহায়তা করছে না। আসলে এই থ্রেডের কোনও সমাধান আমাকে সাহায্য করছে না। কেউ কি দয়া করে আমার
কেসটি

41

আমি আমার কোডে দুটি জিনিস স্থির না করা পর্যন্ত একই দুটি ত্রুটি বার্তা পাচ্ছিলাম:

(1) ডিফল্টরূপে, আপনি যখন RecyclerView.Adapterউত্পন্ন পদ্ধতিতে প্রয়োগ করেন :

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

আপনি নিজের কোড আপডেট করেছেন তা নিশ্চিত করুন যাতে এটি বলে:

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

স্পষ্টতই যদি আপনার আইটেমগুলিতে শূন্য আইটেম থাকে তবে আপনি পর্দায় প্রদর্শিত শূন্য জিনিস পাবেন।

(২) উপরের উত্তরে দেখানো হিসাবে আমি এটি করছিলাম না: কার্ডভিউ লেআউট_উইডথ = "ম্যাচ_পিতা" পিতামাতার পুনর্ব্যবহারযোগ্য ভিউয়ের সাথে মেলে না

//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);

(3) সম্পাদনা করুন: বোনাস: আপনি এটির 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);
3:00

এটি আমার পক্ষে কাজ করে: @ সার্বজনীন int getItemCount () artists ফিরিয়ে দিন শিল্পী.সাইজ (); }
অ্যাস্টনচিয়া

4
ওহ খোদা. সেই মুহুর্তে যখন আপনি এস-তে ফিরে আসেন, এবং এমন একটি উত্তর দেখুন যা আপনি ইতিমধ্যে উত্সাহিত করেছেন এবং বুঝতে পারবেন যে আপনি একই বোকা কাজটি করেছিলেন। আবার ধন্যবাদ মাইক্রো।
androidevil

20

আপনার সাথে আমারও একই অবস্থা, প্রদর্শনটি ঠিক আছে, তবে ত্রুটিতে ত্রুটির উপস্থিতি রয়েছে। এটি আমার সমাধান: (1) পুনর্ব্যবহারযোগ্য ভিউ আরম্ভ করুন এবং অ্যাডাপ্টারটি তৈরি করুন তৈরি করুন ()

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

(২) আপনি যখন ডেটা পাবেন তখন কল করুন notifyDataStateChanged

adapter.notifyDataStateChanged();

রিসাইকেলারভিউয়ের উত্স কোডে, তথ্যের স্থিতি পরীক্ষা করতে অন্য থ্রেড রয়েছে।

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

আমার এই সমস্যাটি রয়েছে, কয়েক সময় সমস্যাটি রিসাইকেলভিউ স্ক্রোলভিউ অবজেক্টে রাখা হয়েছে

বাস্তবায়ন পরীক্ষা করার পরে, কারণটি নিম্নলিখিত হিসাবে উপস্থিত রয়েছে। যদি রিসাইক্লারভিউ কোনও স্ক্রোলভিউতে পরিণত হয়, তবে পরিমাপের সময় এর উচ্চতাটি অনির্দিষ্ট করা হয় (কারণ স্ক্রোলভিউ যে কোনও উচ্চতার অনুমতি দেয়) এবং ফলস্বরূপ, ন্যূনতম উচ্চতার সমান হয় (বাস্তবায়ন হিসাবে) যা আপাতদৃষ্টিতে শূন্য।

এটি ঠিক করার জন্য আপনার কাছে কয়েকটি বিকল্প রয়েছে:

  1. পুনর্ব্যবহারযোগ্য ভিউতে একটি নির্দিষ্ট উচ্চতা সেট করুন
  2. স্ক্রোলভিউ.ফিলভিউপোর্টকে সত্যে সেট করুন
  3. অথবা স্ক্রোলভিউয়ের বাইরে রিসাইক্লারভিউ রাখুন। আমার মতে, এটি এখন পর্যন্ত সেরা বিকল্প। যদি রিসাইক্লারউভিউ উচ্চতা সীমাবদ্ধ না হয় - এটি যখন স্ক্রোলভিউতে রাখা হয় - তখন সমস্ত অ্যাডাপ্টারের ভিউগুলিতে উল্লম্বভাবে যথেষ্ট জায়গা থাকে এবং সমস্ত একবারে তৈরি হয়ে যায়। আর কোনও পুনর্ব্যবহারযোগ্য দর্শন নেই যা কোন ধরণের রিসাইক্লভিউয়ের উদ্দেশ্যকে ভঙ্গ করে।

( android.support.v4.widget.NestedScrollViewপাশাপাশি অনুসরণ করা যেতে পারে )


আমার সমস্যার সমাধান করতে সত্যে স্ক্রোলভিউ.ফিলভিউপোর্টকে সেট করা, একগুচ্ছ ধন্যবাদ
ইমান

10

1) ভিউহোল্ডার তৈরি করুন যা কিছুই করে না :)

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

2) আবার রিসাইক্লার ভিউ তৈরি করুন যা কিছুই করে না :)

// 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());

এটি যদিও সেরা সমাধান নয় তবে এটি কাজ করে! আশা করি এটি সহায়ক।


হাই, দয়া করে আমারও একই ত্রুটি রয়েছে এবং আমি জানি না কোথায় আমার রিসাইক্লারটি খালি অ্যাডাপ্টারটি পাস করার জন্য প্রস্তুত নয় কিনা তা পরীক্ষা করতে হবে এবং কোথায় আমি পরীক্ষা করতে পারি যে পুনর্ব্যবহারকারী প্রস্তুত রয়েছে (ডেটা সহ অ্যাডাপ্টারটি পাস করার জন্য)
জেমস

এই মহান, এখানে একটি drag'n ড্রপ শৈলী সারকথা এর gist.github.com/anonymous/bcf027945f08f40601090c55d6048e21
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();

আপনি ক্রেইট পদ্ধতিতে কাস্টোম্যাডাপ্টার কনস্ট্রাক্টারে ডেটা সেট করেছেন তা নিশ্চিত করুন
মোহিত সিং

4

আপনি আপনার অ্যাডাপ্টারে এই পদ্ধতিটি কল করতে মিস করেছেন কিনা তা পরীক্ষা করে দেখুন

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

3

নিশ্চিত হয়ে নিন যে আপনি নিজের রিসাইক্লার ভিউয়ের জন্য লেআউট ম্যানেজারটি সেট করেছেন:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

পরিবর্তে LinearLayoutManager, আপনি অন্যান্য লেআউট পরিচালকদেরও ব্যবহার করতে পারেন ।


3

আমার একই ত্রুটিটি ছিল আমি এটি করে ফিক্স করেছিলাম যদি আপনি আমার মতো ডেটার জন্য অপেক্ষা করে থাকেন যেমন retrofit বা এর মতো কিছু

অনক্রিয়েটের সামনে রাখুন

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

এগুলি আপনার অনক্রিয়েটে রাখুন

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

এখন আপনার শিল্পীআরএডাপ্টার ক্লাসে যান এবং এটি করুন যা এটি করবে যদি আপনার অ্যারেটি খালি থাকে বা শূন্য হয় তবে এটি গেটটাইমকন্টকে ফিরে আসবে 0 যদি এটি শিল্পীদের অ্যারের আকার করে না

@Override
public int getItemCount() {

    int a ;

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

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}


2

এটি ঘটে কারণ প্রকৃত স্ফীত লেআউটটি রিসাইক্লার ভিউয়ের সন্ধানের সময় আপনার দ্বারা উল্লেখ করা হয় তার থেকে আলাদা। ডিফল্টরূপে আপনি খণ্ড তৈরি করার সময়, অনক্রিটভিউ পদ্ধতিটি নীচে প্রদর্শিত হয়: return inflater.inflate(R.layout.<related layout>,container.false);

এর পরিবর্তে পৃথকভাবে ভিউ তৈরি করুন এবং এটি পুনর্ব্যবহারযোগ্য ভিউতে উল্লেখ করতে ব্যবহার করুন 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 তৈরি করি যা ক্রিয়াকলাপের একটি ডিফল্ট লেআউট হয়ে যায়। পুরানো লেআউট ফাইল এবং আমি নতুন কোডগুলি দিয়েছিলাম এমন সমস্ত কোডগুলিতে কেবল কয়েকটি এক্সএমএল কোড ছিল, যার ফলে ত্রুটি হয়েছিল।

সমাধান: পুরানো লেআউটের সমস্ত কোড অনুলিপি করুন এবং 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
আমি এটি প্রাথমিক ব্যবহারকারীদের জন্য করি
মেহেদি জানবারি

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

আমার এই ত্রুটি ছিল এবং সমাধান না পাওয়া পর্যন্ত আমি কিছুক্ষণের জন্য সমাধানের চেষ্টা করেছি।

আমি একটি বেসরকারী পদ্ধতি বিল্ডরেসাইক্লারভিউ তৈরি করেছি এবং আমি এটি দুটিবার কল করেছিলাম, প্রথমে অনক্রিটভিউতে এবং তারপরে আমার কলব্যাকের পরে (যাতে আমি একটি এপিআই থেকে ডেটা আনি)। এটি আমার খণ্ডে আমার পদ্ধতি বিল্ডআরসিক্রারভিউ:

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

আমার একই সমস্যা ছিল এবং আমি বুঝতে পেরেছিলাম যে আমি উভয়কে অনক্রিয়েট পদ্ধতিতে সেট করার পরিবর্তে আমার উত্স থেকে ডেটা পুনরুদ্ধার করার পরে লেআউটম্যানেজ আর এবং অ্যাডাপ্টার উভয়ই সেট করেছিলাম ।

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

আর একটি কারণ হ'ল আপনি এই কোডটি একটি ননউইথ্রেডে কল করছেন। এই কলটি ইউআইটিথ্রেডে নিশ্চিত করে নিন।

সমাধান শুধুমাত্র আপনি একটি যোগ আছে হয় LayoutManagerজন্য RecyclerViewআপনি আগে setAdapterUI 'তে থ্রেড।

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

যদি আপনার লেআউটম্যানাজার স্থাপনে বিলম্ব করতে হয় তবে আপনার কলব্যাক পদ্ধতি থেকে এটি করা উচিত: রিসাইক্লারভিউ.পোস্ট (() -> cy রিসাইক্লারভিউ.সেটলয়েআউট ম্যানেজার (এমগ্রিডলয়েটম্যানেজার); রিসাইক্লারভিউ.এডডিআইটেমেকেরেশন (নতুন আইটেমঅফসেটডেকচারেশন (আইটেমগ্যাপ));
ievgen

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আপনি অ্যাডাপ্টারে পাস করবেন এমন ডেটা। আপনার কাছে পাস করার মতো কোনও তথ্য না থাকলে এটি optionচ্ছিক। আপনি তৈরি করেছেন 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

নীচে প্রাথমিক খালি তালিকা এবং অ্যাডাপ্টার সেট করে এবং ফলাফল আনার সময় notifyDataSetChanged কল করে সমাধান করা।

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

0

আমি এই ইস্যুটির সাথে আমার জীবনের 16 মিনিট হারিয়েছি, সুতরাং আমি কেবল এই অবিশ্বাস্যরকম বিব্রতকর ভুলটি স্বীকার করব যা আমি করছিলাম I'm আমি বাটারকনিফ ব্যবহার করছি এবং আমি এই খণ্ডে অনক্রিটভিউতে দৃষ্টিভঙ্গি আবদ্ধ করি।

আমার কোনও বিন্যাস ব্যবস্থাপনাকারী কেন ছিল তা নির্ধারণ করতে দীর্ঘ সময় লেগেছে - তবে স্পষ্টতই মতামতগুলি ইনজেকশনের ফলে তারা আসলে নাল হবে না, তাই পুনর্ব্যবহারকারী কখনই নাল হবে না .. উফ!

@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

আমার ক্ষেত্রে এটি ঘটেছিল কারণ আমি একটি লিনিয়ারলয়েটে একটি পুনর্ব্যবহারযোগ্য ভিউ এম্বেড করেছি।

আমার পূর্বে একটি লেআউট ফাইল ছিল যা কেবলমাত্র একটি রুট রিসাইক্লারভিউ অনুসরণ করে

<?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

// আপনি যখন তৈরির পর্যায়ে অ্যাডাপ্টারটি সেট না করে থাকেন তখন এটি ঘটে: যখন এপিআই প্রতিক্রিয়াটি এর কাজ করছে তখন কল করুন notifyDataSetChanged ()

@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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.