রিসাইক্লিউভিউ ক্রেট ভিউহোল্ডারকে কল করবেন না


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

আমার কাস্টম সারি এক্সএমএল:

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

আপনি কেন রিসাইক্লারভিউ.সেটএডাপ্টার (অ্যাডাপ্টার) সেট করলেন; ২ বার?
পানায়িওটিস ইরাক্লিয়াস

এই সমস্যার আরেকটি কারণ ভুল করে আইটেমের বিন্যাসটি পিতামাতার উচ্চতার সাথে মিলে যায় তাই এক সময় কেবলমাত্র একটি আইটেম প্রদর্শিত হয়।
জো ল্যাপ

আমার ক্ষেত্রে এটিতে সহায়তা করুন: ইনভয়েসস রেসাইক্লারভিউ.সেটহ্যাসফিক্সডসাইজ (সত্য) ইনভয়েসস রিসাইক্লারভিউ.সেটলয়েআউট ম্যানেজার (গ্রিডলআউটআউট ম্যানেজার (এটি, 1))
এ_সুবস্ক্রাইবার

উত্তর:


238

আপনার getItemCountপদ্ধতি returns 0। তাই RecyclerViewকখনও কোনও দৃশ্য তাত্ক্ষণিক করার চেষ্টা করবেন না। এটিকে কিছু ফিরিয়ে দিন greater than 0

উদাহরণ স্বরূপ

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

25
ওগো গো, আমি এখনই খুব বোবা অনুভব করছি! : ফেসপাম: এর জন্য আপনাকে ধন্যবাদ!
শিন্টা এস

3
আমি এটির জন্য মাত্র এক ঘন্টা হারিয়েছি কারণ getItemCount অন্য সমস্ত কোডের নিচে ছিল এবং আমি এটি দেখতে পাই নি। : |
জোয়েল

আমার একটি কাস্টম অ্যাডাপ্টার ছিল এবং আমার সংগ্রহের আকারে আমার আইটেমকন্টটি সেট করতে ভুলে গিয়েছিলাম
ডুই

3
আমার আইটেমের গণনা 3 টি এখনও দৃশ্যমান নয়, অনবাইন্ড বা অনক্রিটহোল্ডারটিতে কোনও ডিবাগ পয়েন্ট আসে না ... তবে এটি আইটেমাউন্টে আসে
ডাঃ এএনড্রো 21

ওহ মানুষ! আমিও এই সাথে লড়াই করে যাচ্ছি যে আমার ব্রেক ব্রেকপয়েন্টটি কেন আঘাত করছে না এবং এখন আমি জানি ... এলএল! অভিশাপ !!! ধন্যবাদ!
ভিঞ্চি

409

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

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এবং আমি Android সাপোর্ট লাইব্রেরি 23.0 ব্যবহার করি। ঠিক করার জন্য, আমি অ্যান্ড্রয়েড সমর্থন লাইব্রেরি 23.2 এ আপডেট করেছি:

বিল্ড.gradle এ:

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


4

হতে পারে এটি কাউকে সহায়তা করে তবে আপনি যদি আপনার রিসাইকেলভিউয়ের দৃশ্যমানতাটি GONE এ সেট করেন তবে অ্যাডাপ্টার পদ্ধতিগুলিকে মোটেই কল করা হবে না ... এটি বের করার জন্য আমাকে কিছুটা সময় নিল।


অবিশ্বাস্য !!!!! ... ট্যাঙ্কস এত ,,,
এক্স-ব্ল্যাক ...

3

আমার একই সমস্যা ছিল, কারণ আমি android.support.constraint.ConstraintLayoutলেআউট রিসোর্স ব্যবহার করছিলাম । সাহায্যে পরিবর্তন করা হচ্ছে FrameLayout


আপনার সমাধানের জন্য আপনাকে ধন্যবাদ। ভিউ প্যারেন্ট হলে এটি কেন এমন আচরণ করে এমন কোনও ধারণা android.support.constraint.ConstraintLayout?
অ্যাড্রিয়ান বুকিউমান

2

অন্য বিকল্পটি হ'ল যদি আপনি এই তালিকাটি getet ব্যবহার করে প্রেরণ করেন, উদাহরণস্বরূপ আপনার সঠিক উল্লেখ রয়েছে কিনা তা যাচাই করুন

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

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

আমার ক্ষেত্রে আমি আমার রিসাইক্লারভিউয়ের আইডি "রিসাইক্লারভিউ" তে সেট করেছি। দেখে মনে হচ্ছে এই আইডিটি ইতিমধ্যে কোথাও সংজ্ঞায়িত ছিল, কারণ যখন আমি এটি আলাদা আইডিতে পরিবর্তন করি তখন অ্যাডাপ্টারের পদ্ধতিগুলি সঠিকভাবে ডাকা হত।


1

যদি কোনও কাস্টম অ্যাডাপ্টার ব্যবহার করে আপনার সংগ্রহের আকারের আইটেমকাউন্ট সেট করতে ভুলবেন না।


1

আমার ক্ষেত্রে, আমার তালিকার আকার 0 ছিল এবং এটি অনক্রিটভিউহোল্ডার পদ্ধতিটিকে কল করছে না। আমাকে স্থানধারক হিসাবে খালি তালিকার জন্য কেন্দ্রে একটি বার্তা প্রদর্শন করা দরকার তাই আমি এটি এটি করেছি এবং এটি কবজির মতো কাজ করেছে। @ কনস্টান্টিন বুড়ভের উত্তর সাহায্য করেছে।

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

এটি সত্যিকারের ভাল ধারণা নয়। অ্যাডাপ্টারে ডেটা রাখার সময় খালি বার্তার দৃশ্যমানতা সেট করা ভাল।
অবিশ্বাস্য জানুয়ারী

1

আমার সুইটারটি রিসাইক্লারভিউ.অ্যাডাপ্টরকে কল না করার ওভারবাইন্ডহোল্ডার (ধারক, অবস্থান) ওভাররাইড পদ্ধতি ছিল। ক্রেইটভিউহোল্ডার পদ্ধতিটি কল করা হয়েছিল, getItemCount বলা হয়েছিল। আপনি যদি রিসাইক্লিভিউ অ্যাডাপ্টারের জন্য চশমা পড়েন তবে আপনি শিখবেন যে আপনি যদি বাইন্ড ভিউহোল্ডারকে ওভাররাইড করে থাকেন (ধারক, অবস্থান, তালিকার পেড লোড) আপনার পক্ষে ডাকা হবে। সুতরাং দয়া করে সাবধান হন।


কল না করার সমস্যাটি কীভাবে সমাধান করলেন onBindViewHolder?
কুলমাইন্ড

1

আপনি যদি আপনার তালিকার উচ্চতার পাশাপাশি আপনার আইটেম তালিকার উচ্চতা হিসাবে র‌্যাপ_কন্টেন্টটি রেখে দেন তবে কিছুই প্রদর্শিত হবে না এবং আপনার পুনর্ব্যবহারযোগ্য ফাংশনগুলির কোনওটিকেই ডাকা হবে না। আইটেমটির উচ্চতা স্থির করুন বা তালিকার উচ্চতার জন্য ম্যাচ_পিতাটি রেখে দিন। এটি আমার সমস্যার সমাধান করেছে।


1

আমার ভুলটি ফ্র্যাগমেন্ট অনক্রিয়েটভিউতে ভুল দৃষ্টিভঙ্গি করছিল।


1

আপনার এক্সএমএল যান এবং সামগ্রী মোড়ানো আপনার লেআউট পরিবর্তন করুন। এক উপাদান পরেরটি লুকিয়ে রাখছে, সুতরাং পদ্ধতিগুলি কাজ করছে না!


1
স্টকওভারফ্লো @ কোয়ালায় স্বাগতম! এই দেখুন কিভাবে ভাল উত্তর লিখতে এখানে stackoverflow.com/help/how-to-answer
Shashin Bhayani

0

দয়া করে নিম্নলিখিত জিনিসটি করুন

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

0

ভিউমোডেল এবং ডেটাবাইন্ডিং ব্যবহার করার জন্য ক্রিয়াকলাপ পরিবর্তন করার পরে আমার ক্ষেত্রে, setContentViewপদ্ধতি থেকে onCreateপদ্ধতি কলিং সরিয়ে দিতে আমি ভুলে গিয়েছিলাম । এটিকে সরিয়ে দিয়ে আমার সমস্যার সমাধান হয়েছে।


0

আমার জন্য, কারণ সেটহ্যাসস্টেবলআইডস (সত্য); পদ্ধতি সেট করা হয়েছিল। এটি সরান এবং এটি কাজ করবে


তবে এই পদ্ধতিটি প্রশ্নের ন্যূনতম প্রজননযোগ্য উদাহরণে উপস্থিত হবে না । যদি এই ইঙ্গিতটি মুছে ফেলা কিছু ঠিক করে দেয় তবে এটি সম্ভবত ভিউধারীর বাস্তবায়নে বা সম্ভবত বিজ্ঞাপক হিসাবে একটি বাগের ইঙ্গিত।


0

আপনার XMLএবং Koltin/Javaকোড মিলছে তা নিশ্চিত করুন । আমার ক্ষেত্রে, ViewHolderযেহেতু আমি লিখেছিলাম আমার সাথে সমস্যা ছিল:

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

তবে যেহেতু আমার এক্সএমএল কোডটি হ'ল:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.