GVKun编程网logo

android-如何解决java.lang.IndexOutOfBoundsException:无效的索引0,大小为0?(无效的索引定义)

4

本文的目的是介绍android-如何解决java.lang.IndexOutOfBoundsException:无效的索引0,大小为0?的详细情况,特别关注无效的索引定义的相关信息。我们将通过专业的研

本文的目的是介绍android-如何解决java.lang.IndexOutOfBoundsException:无效的索引0,大小为0?的详细情况,特别关注无效的索引定义的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解android-如何解决java.lang.IndexOutOfBoundsException:无效的索引0,大小为0?的机会,同时也不会遗漏关于Android android.database.CursorIndexOutOfBoundsException:请求索引x,大小为x、Android ArrayList的IndexOutOfBoundsException、android – IndexOutOfBoundsException setSpan(0 … 1)结束超过0、android – RecyclerView java.lang.IndexOutOfBoundsException:检测到不一致.视图夹适配器位置无效.由于更改getItemCount()的知识。

本文目录一览:

android-如何解决java.lang.IndexOutOfBoundsException:无效的索引0,大小为0?(无效的索引定义)

android-如何解决java.lang.IndexOutOfBoundsException:无效的索引0,大小为0?(无效的索引定义)

我有两个autocompletetextviews,在第一个autocompletetextview中,我正在使用json从服务器获取项目,以下是对此的响应

{"status":"success","clientlist":[{"cid":"1","name":"margi"},{"cid":"2","name":"steven"}],"productBoxtype":[{"pbxid":"1","pbxname":"1 Dozen","qtyperBox":"12"},{"pbxid":"2","pbxname":"2 Dozens","qtyperBox":"24"},{"pbxid":"3","pbxname":"3 Dozens","qtyperBox":"36"}]}

我可以在第一个自动填充中获取名称,并且可以正常运行,

现在的问题是假设用户选择项目“ margi”,其cid为1,因此我再次向服务器发送请求并尝试获取“ margi”的产品名称,其响应为

{"status":"success","clientproduct":[{"pid":"4","name":"kangan pair","unitprice":"1500","Boxqty":"1","bulkprice":[{"minqty":"10","price":"1500"},{"minqty":"15","price":"1470"},{"minqty":"20","price":"1460"}]}]}

MAniActivity

   public class MainActivity extends Activity {

    private AutoCompleteTextView acTextView;

    private String catidtemp;
    private String catid;

    JSONParser jsonParser = new JSONParser();
    private AutoCompleteTextView autoproduct;
    private static final String FeedBACK_URL = "";
    private static final String FeedBACK_SUCCESS = "status";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        acTextView = (AutoCompleteTextView) findViewById(R.id.autocmplte_clorder_clname);
        acTextView.setAdapter(new SuggestionAdapterClientList(this,acTextView.getText().toString()));

        autoproduct=(AutoCompleteTextView)findViewById(R.id.autocmplte_clorder_product);
        autoproduct.setAdapter(new SuggestionAdapterClientProduct(this, autoproduct.getText().toString()));

        acTextView.setonItemClickListener(new OnItemClickListener() {


            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // Todo Auto-generated method stub


                JsonParseClientProduct jp=new JsonParseClientProduct();
                List<SuggestGetSetClientProduct> list1 = new ArrayList<SuggestGetSetClientProduct>();
                list1 =jp.getParseJsonWCF(autoproduct.getText().toString());
                if(position < list1.size())
                new AttemptLogin(Integer.parseInt(list1.get(position).getId())).execute();
            }
        });

    }

      class AttemptLogin extends AsyncTask<String, String, String> {

        boolean failure = false;
        private ProgressDialog pDialog;

        private int selected_cid=1;
        AttemptLogin(int selected_cid){
        this.selected_cid=selected_cid;
        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Sending..");
            pDialog.setIndeterminate(true);
          //  pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress));
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @SuppressWarnings("unused")
        @Override
        protected String doInBackground(String...args) {
            //Check for success tag
            //int success;
            Looper.prepare();



             try {

                 JsonParseClientList jp=new JsonParseClientList();
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                 List<SuggestGetSetClientList> list =jp.getParseJsonWCF(acTextView.getText().toString());

                     for(int i = 0;i<list.size();i++)
                     {
                       if(list.get(i).getName().equals(acTextView.getText().toString()))
                       // params.add(new BasicNameValuePair("cid",list.get(i).getId()));

                           params.add(new BasicNameValuePair("cid",String.valueOf(selected_cid)));

                         //  catid=list.get(i).getId();
                      // catidtemp=list.get(i).getId();


                     }

                    catidtemp=String.valueOf(selected_cid);
                // catidtemp=list.get(i).getId();
                 System.out.println("cattttttiiiiddd????"+catidtemp);
                 params.add(new BasicNameValuePair("action", "clientproduct"));

                 System.out.println("su gayu server ma????"+params);

                 Log.d("request!", "starting");
                 // getting product details by making HTTP request
                 JSONObject json = jsonParser.makeHttpRequest (
                     FeedBACK_URL, "POST", params);
                 //check your log for json response
                 Log.d("Login attempt", json.toString());

                 JSONObject jobj = new JSONObject(json.toString());
                 final String msg = jobj.getString("msg");




                 return json.getString(FeedBACK_SUCCESS);

             }catch (JSONException e) {
                 e.printstacktrace();
             }
             return null;
        }

        // After completing background task dismiss the progress dialog

        protected void onPostExecute(String file_url) {
            //dismiss the dialog once product deleted
            pDialog.dismiss();

            //parentcat.getText().clear();
    }}
      public class SuggestGetSetClientProduct {

            String id,name;
            public SuggestGetSetClientProduct(String id, String name){
                this.setId(id);
                this.setName(name);
            }
            public String getId() {
                return id;
            }

            public void setId(String id) {
                this.id = id;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }
        }

       public class JsonParseClientProduct {


            double current_latitude,current_longitude;
            public JsonParseClientProduct(){}
            public JsonParseClientProduct(double current_latitude,double current_longitude){
                this.current_latitude=current_latitude;
                this.current_longitude=current_longitude;
            }
            public List<SuggestGetSetClientProduct> getParseJsonWCF(String sName)
               {
                List<SuggestGetSetClientProduct> ListData = new ArrayList<SuggestGetSetClientProduct>();
                try {
                   String temp=sName.replace(" ", "%20");


                   System.out.println("what the...."+js);
                   URLConnection jc = js.openConnection();
                   BufferedReader reader = new BufferedReader(new InputStreamReader(jc.getInputStream()));
                   String line = reader.readLine();
                   JSONObject jsonResponse = new JSONObject(line);
                   Log.d("test", "Response : " +jsonResponse);
                   JSONArray jsonArray = jsonResponse.getJSONArray("clientproduct");
                   for(int i = 0; i < jsonArray.length(); i++){
                       JSONObject r = jsonArray.getJSONObject(i);
                       ListData.add(new SuggestGetSetClientProduct(r.getString("pid"),r.getString("name")));
                   }


               } catch (Exception e1) {
                   // Todo Auto-generated catch block
                   e1.printstacktrace();
               }
                return ListData;

               }
        }
        public class SuggestionAdapterClientProduct extends ArrayAdapter<String>{


            protected static final String TAG = "SuggestionAdapter";
            List<String> suggestions = new ArrayList<String>();
           // private List<String> suggestions;
            public SuggestionAdapterClientProduct(Activity context, String nameFilter) {
                super(context, android.R.layout.simple_dropdown_item_1line);
                suggestions = new ArrayList<String>();
            }

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

            @Override
            public String getItem(int index) {
                return suggestions.get(index);
            }

            @Override
            public Filter getFilter() {
                Filter myFilter = new Filter() {
                    @Override
                    protected FilterResults performFiltering(CharSequence constraint) {
                        FilterResults filterResults = new FilterResults();
                        JsonParseClientProduct jp=new JsonParseClientProduct();
                        if (constraint != null) {
                            // A class that queries a web API, parses the data and
                            // returns an ArrayList<GoEuroGetSet>

                            List<SuggestGetSetClientProduct> new_suggestions = new ArrayList<SuggestGetSetClientProduct>();
                            new_suggestions =jp.getParseJsonWCF(constraint.toString());
                            Log.d("test", "Size of array : " +new_suggestions.size());
                          //List<SuggestGetSetClientProduct> new_suggestions =jp.getParseJsonWCF(constraint.toString());
                            suggestions.clear();
                            /*for (int i=0;i<new_suggestions.size();i++) {
                            suggestions.add(new_suggestions.get(i).getName());
                        }*/

                        for (int i=0;i<new_suggestions.size();i++) {
                            String name=new_suggestions.get(i).getName();
                            String id=new_suggestions.get(i).getId();
                            System.out.println("checis id"+id);
                            if(name.contains(constraint)){
                            suggestions.add(new_suggestions.get(i).getName());


                               }   
                        }
                            // Now assign the values and count to the FilterResults
                            // object
                            filterResults.values = suggestions;
                            filterResults.count = suggestions.size();
                        }
                        return filterResults;
                    }

                    @Override
                    protected void publishResults(CharSequence contraint,
                            FilterResults results) {
                        if (results != null && results.count > 0) {
                            notifyDataSetChanged();
                        } else {
                            notifyDataSetInvalidated();
                        }
                    }
                };
                return myFilter;
            }
        }
}

解决方法:

java.lang.indexoutofboundsexception: Invalid index 0, size is 0 at
java.util.ArrayList.throwindexoutofboundsexception(ArrayList.java:251)

我相信问题就在这里,

 List<SuggestGetSetClientProduct> new_suggestions =jp.getParseJsonWCF(constraint.toString());

您是否初始化了ArrayList?

List<SuggestGetSetClientProduct> new_suggestions = new ArrayList<SuggestGetSetClientProduct>;

在进入For循环之前,请先检查ArrayList的大小.

编辑:

您的代码应该像

                if (constraint != null) {

                   List<SuggestGetSetClientProduct> new_suggestions = new ArrayList<SuggestGetSetClientProduct>();
                   new_suggestions =jp.getParseJsonWCF(constraint.toString());
                   Log.d("test", "Size of array : " +new_suggestions.size());

               // rest code here..//

另外,您也没有在RecommendationionAdapterClientProduct类中初始化列表,

 private List<String> suggestions;

通过初始化您的arrayList

List<String> suggestions = new ArrayList<String>();

在那个班上.

Android android.database.CursorIndexOutOfBoundsException:请求索引x,大小为x

Android android.database.CursorIndexOutOfBoundsException:请求索引x,大小为x

我正在尝试使用HighscoreDB中的数据填充10个textviews.每次我的应用程序的游戏结束时,都要求用户将他们的分数与名称一起存储在数据库中.
然后,我填写10个文本视图(实际上是20个,但有10行,其中包含名称和分数.).这曾经工作(当HighscoreDB中有一些高分记录时),但自从我创建了一个新的模拟器,从而删除了所有高分行,我不断得到
“android.database.Cursorindexoutofboundsexception:索引x请求,大小为x”错误.
x表示我当前有多少行,例如,如果我在数据库中有5个高分行,则错误将是“索引5请求,大小为5”(通过尝试新的方法来解决我的问题找出来)但它仍然存在,我注意到指数也增加了).
任何人都可以指出我做错了什么或如何告诉我如何修复我的代码?

这是我的HighscoreActivity中的代码,其中高分放在textviews中:

                   db = (new HighscoreDB(this)).getWritableDatabase();
cursor = db.rawQuery("SELECT _id, name, score FROM highscore ORDER BY score DESC",  null);
                   cursor.movetoFirst();
             for (int i = 0; i < 10; i++) {



            TableRow row = (TableRow)mHighscoreTable.getChildAt(i+1);
            TextView tvName = (TextView)row.getChildAt(1);

            tvName.setText(cursor.getString(1));
            TextView tvscore = (TextView)row.getChildAt(2);

            tvscore.setText(Integer.toString(cursor.getInt(2)));


            cursor.movetoNext();



    }

行“for(int i = 0; i< 10; i){”是因为我只想在10行textview中一次显示10个高分. 这就是桌子的制作方法:

private static final String score_TABLE_CREATE = "CREATE TABLE "
                                                 + score_TABLE_NAME
                                                 + " (_id INTEGER PRIMARY KEY autoincrement, "
                                                 + "name TEXT NOT NULL, score INTEGER  NOT NULL)";

这是我最新的错误:

05-25 17:03:16.786: E/AndroidRuntime(780): FATAL EXCEPTION: main
05-25 17:03:16.786: E/AndroidRuntime(780): java.lang.RuntimeException: Unable to start activity ComponentInfo{be.michiel.test/be.michiel.test.HighscoreActivity}: android.database.Cursorindexoutofboundsexception: Index 5 requested, with a size of 5
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1647)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.os.Looper.loop(Looper.java:123)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.app.ActivityThread.main(ActivityThread.java:3683)
05-25 17:03:16.786: E/AndroidRuntime(780):  at java.lang.reflect.Method.invokeNative(Native Method)
05-25 17:03:16.786: E/AndroidRuntime(780):  at java.lang.reflect.Method.invoke(Method.java:507)
05-25 17:03:16.786: E/AndroidRuntime(780):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-25 17:03:16.786: E/AndroidRuntime(780):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-25 17:03:16.786: E/AndroidRuntime(780):  at dalvik.system.NativeStart.main(Native Method)
05-25 17:03:16.786: E/AndroidRuntime(780): Caused by: android.database.Cursorindexoutofboundsexception: Index 5 requested, with a size of 5
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.database.AbstractwindowedCursor.checkPosition(AbstractwindowedCursor.java:214)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.database.AbstractwindowedCursor.getString(AbstractwindowedCursor.java:41)
05-25 17:03:16.786: E/AndroidRuntime(780):  at be.michiel.test.HighscoreActivity.onCreate(HighscoreActivity.java:79)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-25 17:03:16.786: E/AndroidRuntime(780):  at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1611)
05-25 17:03:16.786: E/AndroidRuntime(780):  ... 11 more

请帮我找出错误.我一直试图找出很长一段时间.
提前致谢!

解决方法:

如果不检查下一条记录是否可用,就不应该这样做.尝试更改您的代码,如下所示:

db = (new HighscoreDB(this)).getWritableDatabase();
cur = db.rawQuery("SELECT _id, name, score FROM highscore ORDER BY score DESC",  null);
int noOfscorer=0;
cur.movetoFirst();
    while ((!cur.isAfterLast())&&noOfscorer<11) 
    {
        noOfscorer++;
        TableRow row = (TableRow)mHighscoreTable.getChildAt(noOfscorer);
        TextView tvName = (TextView)row.getChildAt(1);
        TextView tvscore = (TextView)row.getChildAt(2);

        tvName.setText(cur.getString(1));
        tvscore.setText(Integer.toString(cur.getInt(2)));

        cur.movetoNext();
    }

希望这对你有所帮助.

Android ArrayList的IndexOutOfBoundsException

Android ArrayList的IndexOutOfBoundsException

我有一些代码引发IndexOutOfBoundsException异常烦人的问题,我真的不明白为什么。logcat指向以下代码的“
addTimetableItem”,这将无法进一步说明:

if(sortedFridayTimes.size()>0){
    insertDay("Friday");
    for(int i=1; i<sortedFridayTimes.size()+1;i++){
        addTimetableItem(sortedFridayTimes.get(i));
    }
}


sortedFridayTimes”是一个包含我自己的“时间表条目”对象的ArrayList,我已经对其进行了排序。首先检查大小,以查看是否有任何对象,然后检查是否存在“
insertDay”,这将为标题创建一个新的textview并将其添加到布局中(这很好..)。在for循环内,想法是将arraylist中的所有对象添加到布局中。现在我知道“
addTimetableItem”代码已经通过ive测试,但是我的问题是我似乎无法从arraylist中获取最后一个对象。如果我声明for循环仅针对

"i<sortedFridayTimes.size()"

然后程序可以正常运行,但是我没有发现arraylist中存在的最后一个条目,因为我已经调试并监视了变量。如上所示,在添加“
+1”后,我现在得到了IndexOutOfBoundsException,但我真的不知道为什么。就像我说的那样,我已经调试了,而且我知道要尝试指向的arraylist中存在一个条目,但是它崩溃了。如果需要,我可以提供更多代码,但是有人有什么想法吗?

android – IndexOutOfBoundsException setSpan(0 … 1)结束超过0

android – IndexOutOfBoundsException setSpan(0 … 1)结束超过0

我正在使用此库来获取带有标签的材质editText:
https://github.com/rey5137/Material/wiki/Text-Field
好的图书馆:)

但…

我正在使用下一个代码检查输入的符号是否正确:

private boolean hasCorrectSymbols(String input){
        String tre = "[A-Za-z0-9\\@\\#\\$\\%\\&\\*\\(\\)\\-\\+\\_\\;\\:\\?\\.\\,\\!]+$";
        if (input.matches(tre)){
            return true;
        }
        return false;
    }

检查正确的符号我正在使用textWatcher:

mEditPass.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s,int start,int count,int after) {}

            @Override
            public void onTextChanged(CharSequence s,int before,int count) {
                if (s.length() == 1 && !loginPassHasCorrectSymbols(s.toString())){
                    mEditPass.getText().clear();
                    String mess = getString(R.string.toast_login_useLatin);
                    showToastMessage(mess);
                } else if (s.length() >1 && !loginPassHasCorrectSymbols(s.toString())) {
                    String mess = getString(R.string.toast_login_useLatin);
                    showToastMessage(mess);
                    String text = s.toString();
                    text = text.substring(0,start);
                    mEditPass.setText(text);
                    mEditPass.setSelection(start);
                }
            }

            @Override
            public void afterTextChanged(Editable s) {}
        });

如果第一个符号是正确的而第二个符号是错误的 – 系统将剪切最后输入的(错误的)符号并将光标设置到最后一个文本位置,但如果第一个符号是禁止符号 – 它将因此错误而崩溃:

java.lang.indexoutofboundsexception: setSpan (0 ... 1) ends beyond length 0
            at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1016)
            at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:592)
            at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
            at android.text.method.PasswordTransformationMethod.onTextChanged(PasswordTransformationMethod.java:108)
            at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
            at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:683)
            at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:198)
            at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183)
            at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:279)
            at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5097)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

任何想法为什么会发生?以及如何解决这个问题?

解决方法

在此代码段中,您缩短EditText中显示的文本(以便最后一个有效位置为start-1),但仍尝试将选择位置设置为start.

text = text.substring(0,start);
                mEditPass.setText(text);
                mEditPass.setSelection(start);

[EDITED]

假设您的Toast消息提示用户修复错误,我认为您实际想要做的是将选择设置为带有错误符号的EditText中的第一个字符.以下是执行此操作的示例代码:

// A reusable Pattern (at the class level) that defines the regex for bad characters.
private static final Pattern ILLEgal_CHAR_PATTERN = Pattern.compile(
    "[^A-Za-z0-9\\@\\#\\$\\%\\&\\*\\(\\)\\-\\+\\_\\;\\:\\?\\.\\,\\!]"
);

    // Replacement for your listener code.
    mEditPass.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s,int after) {
        }

        @Override
        public void onTextChanged(CharSequence s,int count) {
            if (s.length() == 0 || count == 0) {
                return;
            }
            Matcher matcher = ILLEgal_CHAR_PATTERN.matcher(s);
            if (matcher.find()) {
                int firstIllegalPos = matcher.start();
                mEditPass.setSelection(firstIllegalPos);
                String mess = getString(R.string.toast_login_useLatin);
                showToastMessage(mess);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

android – RecyclerView java.lang.IndexOutOfBoundsException:检测到不一致.视图夹适配器位置无效.由于更改getItemCount()

android – RecyclerView java.lang.IndexOutOfBoundsException:检测到不一致.视图夹适配器位置无效.由于更改getItemCount()

我得到一个 java.lang.indexoutofboundsexception:使用RecyclerView检测到不一致,但只有当我似乎把它扔掉时.当我滚动得足够慢时,它不会在我身上崩溃.

我将我的基本适配器用于许多其他子类,但只有某些子类崩溃了.知道为什么会这样吗?

编辑

我发现发生这种情况的原因是因为getItemCount()根据我的页脚加载视图的状态而改变.我相信当它发生变化并且我在滚动时会导致不一致.

我通过总是为getItemCount()中的页眉/页脚加载视图返回2个额外项来测试它.而不是根据其状态动态计算计数.解决这个问题的好方法是什么?

我的适配器

public abstract class BaseRecyclerAdapter<T>
        extends RecyclerView.Adapter<RecyclerView.ViewHolder>
        implements LoadingAndErrorViewHolder.LoadingViewHolderListener {

    public static final int STATUS_HIDDEN = 0;
    public static final int STATUS_LOADING = 1;
    public static final int STATUS_ERROR = 2;

    protected static final int TYPE_HEADER_LOADING = 0;
    protected static final int TYPE_FOOTER_LOADING = 1;
    protected static final int TYPE_norMAL = 2;

    private static final int POSITION_TYPE_HEADER_LOADING = 0;

    private BaseRecyclerAdapterListener mBaseRecyclerAdapterListener;
    private final List<T> mbackingList = new ArrayList<T>();
    private int mHeaderStatus = STATUS_HIDDEN;
    private int mFooterStatus = STATUS_HIDDEN;
    private final int mNumOfheaderItems;

    public interface BaseRecyclerAdapterListener {
        void onErrorHeaderRetryClicked();
        void onErrorFooterRetryClicked();
    }

    public BaseRecyclerAdapter() {
        this(null);
    }

    public BaseRecyclerAdapter(BaseRecyclerAdapterListener listener) {
        this(0,listener);
    }

    public BaseRecyclerAdapter(int numOfheaderItems,BaseRecyclerAdapterListener listener) {
        mNumOfheaderItems = numOfheaderItems;
        mBaseRecyclerAdapterListener = listener;
        setHasstableIds(true);
    }

    @Override
    public long getItemId(int position) {
        final T item = getItem(position);
        if (item != null) {
            return item.hashCode();
        } else {
            return position;
        }
    }

    @Override
    public int getItemCount() {
        int count = mbackingList.size();
        if (mHeaderStatus != STATUS_HIDDEN) {
            count++;
        }
        if (mFooterStatus != STATUS_HIDDEN) {
            count++;
        }
        return mNumOfheaderItems + count;
    }

    @Override
    public int getItemViewType(int position) {
        final int headerAdjustment = mHeaderStatus != STATUS_HIDDEN ? 1 : 0;
        if (position == 0 && mHeaderStatus != STATUS_HIDDEN) {
            return TYPE_HEADER_LOADING;
        } else if (position < mbackingList.size() + headerAdjustment + mNumOfheaderItems) {
            return TYPE_norMAL;
        } else {
            return TYPE_FOOTER_LOADING;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        switch (viewType) {
            case TYPE_HEADER_LOADING: {
                return new LoadingAndErrorViewHolder(inflater.inflate(
                        LoadingAndErrorViewHolder.LAYOUT_ID,parent,false),LoadingAndErrorViewHolder.TYPE_HEADER,this);
            }
            case TYPE_FOOTER_LOADING: {
                return new LoadingAndErrorViewHolder(inflater.inflate(
                        LoadingAndErrorViewHolder.LAYOUT_ID,LoadingAndErrorViewHolder.TYPE_FOOTER,this);
            }
            default: {
                return onCreateItemViewHolder(parent,viewType);
            }
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder,int position) {
        final int viewType = getItemViewType(position);
        switch (viewType) {
            case TYPE_HEADER_LOADING: {
                ((LoadingAndErrorViewHolder) holder).setStatus(mHeaderStatus);
                break;
            }
            case TYPE_FOOTER_LOADING: {
                ((LoadingAndErrorViewHolder) holder).setStatus(mFooterStatus);
                break;
            }
            default: {
                onBindItemViewHolder(holder,position);
            }
        }
    }

    @Override
    public void onHeaderLoadingViewHolderClick() {
        if (mBaseRecyclerAdapterListener != null) {
            mBaseRecyclerAdapterListener.onErrorHeaderRetryClicked();
        }
    }

    @Override
    public void onFooterLoadingViewHolderClick() {
        if (mBaseRecyclerAdapterListener != null) {
            mBaseRecyclerAdapterListener.onErrorFooterRetryClicked();
        }
    }

    public T getItem(int position) {
        final int headerAdjustment = mHeaderStatus != STATUS_HIDDEN ? 1 : 0;
        final int adjustedPosition = position - headerAdjustment - mNumOfheaderItems;
        if (adjustedPosition < 0
                || (mFooterStatus != STATUS_HIDDEN && position == getItemCount() - 1)) {
            return null;
        } else {
            return mbackingList.get(adjustedPosition);
        }
    }

    public List<T> getList() {
        return mbackingList;
    }

    public int getListSize() {
        return mbackingList.size();
    }

    public void setList(List<T> list) {
        if (list != null) {
            clear();
            add(list);
        }
    }

    public void add(T item) {
        if (item != null) {
            mbackingList.add(item);
            notifyItemInserted(getItemCount() - 1);
        }
    }

    public void add(int index,T item) {
        if (item != null) {
            mbackingList.add(index,item);
            notifyItemInserted(index + getItemOffset());
        }
    }

    public void add(List<T> list) {
        if (list != null) {
            final int currentLastIndex;
            if (mbackingList.size() > 0) {
                currentLastIndex = mbackingList.size() - 1;
            } else {
                currentLastIndex = 0;
            }
            mbackingList.addAll(list);
            notifyItemRangeInserted(currentLastIndex + getItemOffset(),list.size());
        }
    }

    public void add(int index,List<T> list) {
        if (list != null) {
            mbackingList.addAll(index,list);
            notifyItemRangeInserted(index + getItemOffset(),list.size());
        }
    }

    public void update(int position,T item) {
        mbackingList.set(position,item);
        notifyItemChanged(position + getItemOffset());
    }

    public void remove(T item) {
        if (item != null && mbackingList.remove(item)) {
            notifyDataSetChanged();
        }
    }

    public void clear() {
        mbackingList.clear();
        notifyDataSetChanged();
    }

    public void setHeaderStatus(int headerStatus) {
        mHeaderStatus = headerStatus;
        notifyItemChanged(POSITION_TYPE_HEADER_LOADING);
    }

    public void setFooterStatus(int footerStatus) {
        mFooterStatus = footerStatus;
        notifyItemChanged(getItemCount() - 1);
    }

    public void checkEndOfList(List<T> data) {
        if (data.isEmpty()) {
            setFooterStatus(STATUS_HIDDEN);
        } else {
            setFooterStatus(STATUS_LOADING);
        }
    }

    protected int getHeaderStatus() {
        return mHeaderStatus;
    }

    protected int getFooterStatus() {
        return mFooterStatus;
    }

    protected abstract RecyclerView.ViewHolder onCreateItemViewHolder(ViewGroup parent,int viewType);

    protected abstract void onBindItemViewHolder(RecyclerView.ViewHolder holder,int position);

    private int getItemOffset() {
        final int headerAdjustment = mHeaderStatus != STATUS_HIDDEN ? 1 : 0;
        return headerAdjustment + mNumOfheaderItems;
    }
}

堆栈跟踪

06-01 10:46:36.230 11448-11448/com.fusionprojects.edmodo E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.fusionprojects.edmodo,PID: 11448
                                                                           java.lang.indexoutofboundsexception: Inconsistency detected. Invalid view holder adapter positionViewHolder{dcf5c3a position=23 id=-1,oldPos=23,pLpos:-1 scrap [attachedScrap] tmpDetached no parent}
                                                                               at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5297)
                                                                               at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5479)
                                                                               at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440)
                                                                               at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436)
                                                                               at android.support.v7.widget.linearlayoutmanager$LayoutState.next(linearlayoutmanager.java:2224)
                                                                               at android.support.v7.widget.linearlayoutmanager.layoutChunk(linearlayoutmanager.java:1551)
                                                                               at android.support.v7.widget.linearlayoutmanager.fill(linearlayoutmanager.java:1511)
                                                                               at android.support.v7.widget.linearlayoutmanager.onLayoutChildren(linearlayoutmanager.java:595)
                                                                               at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3534)
                                                                               at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3310)
                                                                               at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3844)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:636)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                               at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1795)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                                               at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                                               at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                               at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                               at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                                               at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                                               at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                               at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                                               at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                                               at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                               at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
                                                                               at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
06-01 10:46:36.231 11448-11448/com.fusionprojects.edmodo E/AndroidRuntime:     at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                               at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                               at com.android.internal.policy.DecorView.onLayout(DecorView.java:726)
                                                                               at android.view.View.layout(View.java:17641)
                                                                               at android.view.ViewGroup.layout(ViewGroup.java:5575)
                                                                               at android.view.ViewRootImpl.performlayout(ViewRootImpl.java:2346)
                                                                               at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2068)
                                                                               at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
                                                                               at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6343)
                                                                               at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
                                                                               at android.view.Choreographer.doCallbacks(Choreographer.java:686)
                                                                               at android.view.Choreographer.doFrame(Choreographer.java:621)
                                                                               at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:860)
                                                                               at android.os.Handler.handleCallback(Handler.java:751)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:154)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:6126)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

解决方法

我通过在setFooterStatus()方法中调用notifyDataSetChanged()来修复此问题.

我们今天的关于android-如何解决java.lang.IndexOutOfBoundsException:无效的索引0,大小为0?无效的索引定义的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android android.database.CursorIndexOutOfBoundsException:请求索引x,大小为x、Android ArrayList的IndexOutOfBoundsException、android – IndexOutOfBoundsException setSpan(0 … 1)结束超过0、android – RecyclerView java.lang.IndexOutOfBoundsException:检测到不一致.视图夹适配器位置无效.由于更改getItemCount()的相关信息,请在本站查询。

本文标签: