本文的目的是介绍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 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?(无效的索引定义)
我有两个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
我正在尝试使用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
我有一些代码引发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
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)
任何想法为什么会发生?以及如何解决这个问题?
解决方法
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()
我将我的基本适配器用于许多其他子类,但只有某些子类崩溃了.知道为什么会这样吗?
编辑
我发现发生这种情况的原因是因为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)
解决方法
我们今天的关于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()的相关信息,请在本站查询。
本文标签: