Reputation: 2897
I have the following arrayadapter :
public class SmsArrayAdapter extends ArrayAdapter<String> {
List<String> smsBody;
List<Boolean> Status;
List<String> time;
List<String> SmsMessageId;
Context context;
private static LayoutInflater inflater = null;
String fromNumber;
public SmsArrayAdapter(Context context, int resource, List<String> smsBody,
List<Boolean> Status, List<String> time, List<String> SmsMessageId,
String fromNumber) {
super(context, resource, smsBody);
this.smsBody = smsBody;
this.Status = Status;
this.context = context;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.fromNumber = fromNumber;
this.time = time;
this.SmsMessageId = SmsMessageId;
}
public String getStr(int position) {
return smsBody.get(position);
}
public String getId(int position) {
return SmsMessageId.get(position);
}
public void setRead(int position, String smsMessageId) {
Status.set(position, true);
ContentValues values = new ContentValues();
values.put("read", true);
context.getContentResolver().update(Uri.parse("content://sms/inbox"),
values, "_id=" + smsMessageId, null);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return super.getCount();
}
@Override
public String getItem(int position) {
// TODO Auto-generated method stub
return smsBody.get(position);
}
public static class ViewHolder {
public TextView textfrom;
public TextView text_sms;
public TextView text_time;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
/****** Inflate tabitem.xml file for each row ( Defined below ) *******/
convertView = inflater.inflate(R.layout.row_item, null);
/****** View Holder Object to contain tabitem.xml file elements ******/
holder = new ViewHolder();
holder.textfrom = (TextView) convertView
.findViewById(R.id.textView_from);
holder.text_sms = (TextView) convertView
.findViewById(R.id.textView_sms);
holder.text_time = (TextView) convertView
.findViewById(R.id.textView_time);
/************ Set holder with LayoutInflater ************/
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textfrom.setText(" " + fromNumber);
String smsTextToDisplay = smsBody.get(position);
if (smsTextToDisplay.length() > 100)
smsTextToDisplay = smsTextToDisplay.substring(0, 99) + " ...";
holder.text_sms.setText(smsTextToDisplay);
holder.text_time.setText(time.get(position));
if (Status.get(position) == false) {
convertView.setBackgroundColor(context.getResources().getColor(
R.color.light_blue_overlay));
}
return convertView;
}
}
But when I am using this listview , the following exception i am getting .
09-22 11:27:31.161: E/AndroidRuntime(12067): java.lang.IndexOutOfBoundsException: Invalid index 13, size is 13
09-22 11:27:31.161: E/AndroidRuntime(12067): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
09-22 11:27:31.161: E/AndroidRuntime(12067): at java.util.ArrayList.get(ArrayList.java:308)
09-22 11:27:31.161: E/AndroidRuntime(12067): at com.commlink.smscheck.SmsArrayAdapter.getView(SmsArrayAdapter.java:107)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.widget.AbsListView.obtainView(AbsListView.java:2300)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.widget.ListView.makeAndAddView(ListView.java:1816)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.widget.ListView.fillDown(ListView.java:698)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.widget.ListView.fillGap(ListView.java:662)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5529)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3366)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.widget.AbsListView.onTouchMove(AbsListView.java:3802)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3597)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.View.dispatchTouchEvent(View.java:7790)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2316)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2013)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
09-22 11:27:31.161: E/AndroidRuntime(12067): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
09-22 11:27:31.161: E/AndroidRuntime(12067): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2145)
Why I am getting this error ? How can I avoid this error ?
Upvotes: 1
Views: 73
Reputation: 1551
I believe whatever items you are having in the adapter like smsBody ,status, smsMessageId, time ,please go through the contents of these items.I think all of them don't have same number of content.Check the content of your time List.I think the content of that list is not same as that of other lists.
Upvotes: 0
Reputation: 128458
List<String> smsBody;
List<Boolean> Status;
List<String> time;
List<String> SmsMessageId;
It's a best practice to manage different ArrayLists for managing data for the same object. It would be hard for you to manage different ArrayLists while making some operations like adding or removing data.
Say for example, if you would want to add data, you will have to add data for the same index in each lists.
Rather best practice is to manage a single ArrayList having user-defined objects, e.g. ArrayList<SMSModel>
.
Where SMSModel is a model class having all the attributes related to SMS object, like SMSBody, time, SMS message, etc. and this model class would contain getter/setter methods to get and set items from and into the object.
Upvotes: 3