তালিকাভিউতে একাধিক দর্শনের জন্য কাস্টম অ্যান্ড্রয়েড অ্যাডাপ্টারের সাথে অ্যারেআইন্ডেক্সআউটঅফবাউন্ডসএক্সপেশন


185

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

কোড:

public class MenuListAdapter extends BaseAdapter {
 private static final String LOG_KEY = MenuListAdapter.class.getSimpleName();

 protected List<MenuItem> list;
 protected Context ctx;
 protected LayoutInflater inflater;

 public MenuListAdapter(Context context, List<MenuItem> objects) {
  this.list = objects;
  this.ctx = context;
  this.inflater = (LayoutInflater)this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  Log.i(LOG_KEY, "Position: " + position + "; convertView = " + convertView + "; parent=" + parent);
  MenuItem item = list.get(position);
  Log.i(LOG_KEY, "Item=" + item );

        if (convertView == null)  {
            convertView = this.inflater.inflate(item.getLayout(), null);
        }

        return convertView;
 }

 @Override
 public boolean areAllItemsEnabled() {
  return false;
 }

 @Override
 public boolean isEnabled(int position) {
  return true;
 }

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

 @Override
 public MenuItem getItem(int position) {
  return this.list.get(position);
 }

 @Override
 public long getItemId(int position) {
  return position;
 }

 @Override
 public int getItemViewType(int position) {
  Log.i(LOG_KEY, "getItemViewType: " + this.list.get(position).getLayout());
  return this.list.get(position).getLayout();
 }

 @Override
 public int getViewTypeCount() {
  Log.i(LOG_KEY, "getViewTypeCount: " + this.list.size());
  return this.list.size();
 }

}

আমি প্রাপ্ত ত্রুটি:

    java.lang.ArrayIndexOutOfBoundsException
  at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:3523)
  at android.widget.ListView.measureHeightOfChildren(ListView.java:1158)
  at android.widget.ListView.onMeasure(ListView.java:1060)
  at android.view.View.measure(View.java:7703)

আমি জানি যে অ্যাপ্লিকেশনটি ফিরছে getViewএবং সবকিছু যথাযথভাবে মনে হচ্ছে।

এর ফলে কী হতে পারে সে সম্পর্কে কোনও ধারণা প্রশংসিত হবে।

ধন্যবাদ,

-Dan


হাই ড্যান, আপনি নিশ্চিত যে গেটকাউন্টে আপনার লিস্টভিউতে প্রদর্শিত মোট উপাদান থাকবে ??? পাবলিক ইন্ট গেটকাউন্ট () {this.list.size () ফিরিয়ে দিন; }
জর্জেসিস

4
তারা কম বর্ণনামূলক ত্রুটি বার্তা নিয়ে আসতে পারেনি ...
জোয়েজে

উত্তর:


515

আপনি যে আইটেম ভিউয়ের ধরণটি দিয়ে ফিরে আসছেন

getItemViewType()হয় >= getViewTypeCount()


24
এই এক খারাপ। এটি ডিবাগ করার কোনও উপায় নেই। অনেক ধন্যবাদ, রোমেন গাই এর ব্যাখ্যা দেওয়ার জন্য।
ইয়ার

113
আরেকটি বিষয় হ'ল ভিউটাইপটি অবশ্যই 0 থেকে শুরু করা উচিত
হেলমিবি

16
আপনি এখনও অবধি উত্তরের জন্য 38 টি upvote পেয়েছেন তাই এটি একটি নিখুঁত উত্তর হতে পারে তবে সমস্যাটি ব্যাখ্যা করার জন্য এবং কীভাবে এটি সমাধান করবেন তার জন্য দয়া করে আরও কিছু পাঠ্য যুক্ত করুন .c কারণ আমি এখনও এ থেকে অনেক কিছুই বুঝতে পারি না।
চিরাগ প্যাটেল

15
যারা স্টাম্পড, তাদের জন্য ভিউটাইপ অবশ্যই একটি শূন্য ভিত্তিক সূচক ফেরত দিতে হবে। যেমন (0, 1, 2 ...)। আমার ক্ষেত্রে আমি ভি টাইপটির জন্য আর.লাইআউট ... পুনরায় ব্যবহার করার চেষ্টা করেছি। আমার ধারণা অভ্যন্তরীণভাবে ভিউটাইপের মানটি পুনর্ব্যবহারযোগ্য পুলের জন্য সূচক হিসাবে ব্যবহৃত হচ্ছে, কী হিসাবে নয়।
স্যামুয়েল

2
এই ত্রুটিটি অ্যান্ড্রয়েড বিকাশকারীদের বিপরীতে এই ত্রুটিটি ব্যাখ্যা করার জন্য ধন্যবাদ যারা যথারীতি তাদের ডকুমেন্টেশনে এই অত্যাবশ্যক শিরোনামটির উল্লেখ করতে বিরক্ত হতে পারে না।
ডব্লিউকেএস

17

গৃহীত উত্তরটি সঠিক। সমস্যা এড়াতে আমি এটিই করছি:

public enum FoodRowType {
    ONLY_ELEM,
    FIRST_ELEM,
    MID_ELEM,
    LAST_ELEM
}

@Override
public int getViewTypeCount() {
    return FoodRowType.values().length;
}

@Override
public int getItemViewType(int position) {
    return rows.get(position).getViewType();  //returns one of the above types
}

কেবলমাত্র ভাল হতে পারে যদি getItemViewTypeint
dvaffication

0

যখন আইটেমটাইপ মানটি ভুল হয় তখন সমস্যা আসে। এই মানটি একটি পূর্ণসংখ্যার হতে হবে এবং 0 থেকে getViewTypeCount () - 1 পর্যন্ত হওয়া উচিত।


-3

কারণটি, সম্ভবতঃ কারণটি আইটেম ভিউটাইপ পদ্ধতিটি ভুল মানগুলি ফিরিয়ে দিচ্ছে! তালিকাগুলির প্রতিটি সারি একটি এক দর্শন। GetItemViewType স্ক্রোল করার সময় দেখুন গণনার চেয়ে বেশি পৌঁছায়।

কি করো? কীভাবে ইস্যু এড়ানো যায়?

প্রথমে আপনার তালিকার ভিউ (সারি) যা প্রথম দেখানো হবে তা নির্ধারণ করুন W স্ক্রোলিং মডিউল সমীকরণ ব্যবহার করার সময়

    @Override
    public int getItemViewType(int position) {
        return choseType(position);//function to use modular equation
    }
    @Override
    public int getViewTypeCount() {
        return 10;
    }

এই উদাহরণে দশটি দর্শন (10 সারি) রয়েছে।

private  int choseType(int position){
    if(position%10==0)
        return 0;
    else if(position%10==1)
        return 1;
    else if(position%10==2)
        return 2;
    else if(position%10==3)
        return 3;
    else if(position%10==4)
        return 4;
    else if(position%10==5)
        return 5;
    else if(position%10==6)
        return 6;
    else if(position%10==7)
        return 7;
    else if(position%10==8)
        return 8;
    else
        return 9;


}

গুরুত্বপূর্ণ

কিছু ব্যবহারকারী স্ট্যাকওভারফ্লো সেই পদ্ধতিতে অন্য প্রশ্নের উপরে উল্লেখ করেছিলেন

পাবলিক ইন্ট গিভিউটাইপকাউন্ট () এবং পাবলিক ইন্ট গিমেটআইটিভিউটাইপ (ইন পজিশন) ঠিক মতো গুগল স্বয়ংক্রিয়ভাবে স্ক্রোলিংয়ের জন্য রাষ্ট্র চেক সক্ষম করে তোলে .. এটি বড় ভুল I

toogleButton.setChecked(false);

getView ওভাররাইড পদ্ধতিতে।

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