The following error appears in my crash list, and I have no idea how to associate it with my code, since it looks general and unconvincing
java.lang.IndexOutOfBoundsException:
at java.util.ArrayList.throwIndexOutOfBoundsException (ArrayList.java:255)
at java.util.ArrayList.get (ArrayList.java:308)
at android.widget.ArrayAdapter.getItem (ArrayAdapter.java:337)
at android.widget.ArrayAdapter.createViewFromResource (ArrayAdapter.java:390)
at android.widget.ArrayAdapter.getView (ArrayAdapter.java:362)
at android.widget.Spinner.makeView (Spinner.java:661)
at android.widget.Spinner.layout (Spinner.java:609)
at android.widget.Spinner.onLayout (Spinner.java:568)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1703)
at android.widget.LinearLayout.layoutHorizontal (LinearLayout.java:1692)
at android.widget.LinearLayout.onLayout (LinearLayout.java:1468)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout (LinearLayout.java:1466)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.FrameLayout.layoutChildren (FrameLayout.java:579)
at android.widget.FrameLayout.onLayout (FrameLayout.java:514)
at android.widget.ScrollView.onLayout (ScrollView.java:1511)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.support.v4.view.ViewPager.onLayout (ViewPager.java:1795)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.RelativeLayout.onLayout (RelativeLayout.java:1077)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout (LinearLayout.java:1466)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.FrameLayout.layoutChildren (FrameLayout.java:579)
at android.widget.FrameLayout.onLayout (FrameLayout.java:514)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout (LinearLayout.java:1466)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.FrameLayout.layoutChildren (FrameLayout.java:579)
at android.widget.FrameLayout.onLayout (FrameLayout.java:514)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout (LinearLayout.java:1466)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.widget.FrameLayout.layoutChildren (FrameLayout.java:579)
at android.widget.FrameLayout.onLayout (FrameLayout.java:514)
at android.view.View.layout (View.java:16075)
at android.view.ViewGroup.layout (ViewGroup.java:5300)
at android.view.ViewRootImpl.performLayout (ViewRootImpl.java:2119)
at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1873)
at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1073)
at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:5988)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:767)
at android.view.Choreographer.doCallbacks (Choreographer.java:580)
at android.view.Choreographer.doFrame (Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:753)
at android.os.Handler.handleCallback (Handler.java:739)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:135)
at android.app.ActivityThread.main (ActivityThread.java:5930)
at java.lang.reflect.Method.invoke (Native Method)
at java.lang.reflect.Method.invoke (Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200)
I am new to Android programming, any help on how to fix this problem is much appreciated.
Becos, everyone asks for the adapter code, I'll post one adapter sample here,
public class ChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int REP_TYPE = 1;
public static final int ME_TYPE = 2;
public static final int FILE_TYPE = 4;
public static final int FILE_DONE = 5;
public static final int FILE_DONE_REP = 6;
public static final int FOOTER_TYPE = 3;
List<Message> messages;
String rep_photo;
String me_photo;
Context context;
public ChatAdapter(Context context) {
this.context = context;
messages = new ArrayList<>();
}
public ChatAdapter(Context context, String rep_photo, String me_photo) {
messages = new ArrayList<>();
this.rep_photo = rep_photo;
this.me_photo = me_photo;
this.context = context;
}
public void setMessages(List<Message> messageList){
messages = messageList;
notifyDataSetChanged();
}
public void addMessage(Message message){
messages.add(0, message);
notifyItemInserted(0);
}
public void addMessageList(List<Message> messageList){
int size = this.messages.size();
this.messages.remove(size -1);
notifyItemRemoved(size - 1);
size = this.messages.size();
this.messages.addAll(messageList);
notifyItemRangeInserted(size, messageList.size());
}
public void replaceFileMessage(){
int position = 0;
for (Message message1 : messages){
if (message1.msg.contains("::FILE::")){
position = messages.indexOf(message1);
messages.remove(position);
break;
}
}
notifyItemRemoved(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case FILE_TYPE: return new FileHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_me_chat_file, parent, false));
case FILE_DONE: return new FileDoneHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_me_chat_file_done, parent, false));
case FILE_DONE_REP: return new FileDoneRepHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rep_chat_file_done, parent, false));
case FOOTER_TYPE: return new FooterHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.footer_user_list, parent, false));
case ME_TYPE: return new MeHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_me_msg, parent, false));
default: return new RepHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rep_message, parent, false));
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Message message = messages.get(position);
if (holder instanceof MeHolder){
MeHolder meHolder = (MeHolder) holder;
meHolder.bind(message);
}else if (holder instanceof RepHolder){
RepHolder repHolder = (RepHolder) holder;
repHolder.bind(message);
}else if (holder instanceof FileHolder){
FileHolder fileHolder = (FileHolder) holder;
fileHolder.bind(message);
}else if (holder instanceof FileDoneHolder){
FileDoneHolder fileDoneHolder = (FileDoneHolder) holder;
fileDoneHolder.bind(message);
}else if (holder instanceof FileDoneRepHolder){
FileDoneRepHolder fileDoneRepHolder = (FileDoneRepHolder) holder;
fileDoneRepHolder.bind(message);
}
}
@Override
public int getItemViewType(int position) {
if (messages.size() > 0 && messages.size() > 25 &&
position == messages.size() - 1 && messages.get(position) == null){
return FOOTER_TYPE;
}else {
Message message = messages.get(position);
if (message.from_user.equals(AppSetting.getInstance().getUserData().user_id) && message.msg.contains("::FILE::")) {
return FILE_TYPE;
}else if (message.from_user.equals(AppSetting.getInstance().getUserData().user_id) && message.msg.contains("::FILE_DONE::")) {
return FILE_DONE;
}else if (message.to_user.equals(AppSetting.getInstance().getUserData().user_id) && message.msg.contains("::FILE_DONE::")) {
return FILE_DONE_REP;
}else if(message.from_user.equals(AppSetting.getInstance().getUserData().user_id)){
return ME_TYPE;
} else {
return REP_TYPE;
}
}
}
@Override
public int getItemCount() {
return messages.size();
}
class RepHolder extends RecyclerView.ViewHolder implements Html.ImageGetter{
@BindView(R.id.ivUser)
CircleImageView ivUser;
@BindView(R.id.tvMsg)
BlackTextView tvMsg;
@BindView(R.id.tvTime)
BlackTextView tvTime;
public RepHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public void bind(final Message message){
for(String s : ChatActivity.smilesMapReplaces.keySet()){
if (message.msg.contains(s)){
String img = "<img src='" + s + "' />";
if (s.equals(":)")){
s = ":\\)";
}else if(s.equals(":(")){
s = ":\\(";
}else if(s.equals(";)")){
s = ";\\)";
}
message.msg = message.msg.replaceAll(s, img);
}
}
tvMsg.setText(Html.fromHtml(message.msg, this, null));
Picasso.with(ivUser.getContext()).load(rep_photo).into(ivUser);
tvTime.setText(DateUtils.getDisplayTime(tvTime.getContext(), message.created, DateUtils.DATE_FORMAT_ISO_8601));
ivUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((BaseActivity)ivUser.getContext()).startActivity(ProfileActivity.class, AppSetting.getInstance().getUserData().user_id.equals(message.from_user) ? message.to_user : message.from_user, false);
}
});
if (message.msg.startsWith("http")){
tvMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(message.msg));
tvMsg.getContext().startActivity(browserIntent);
}
});
}
}
@Override
public Drawable getDrawable(String source) {
if (source.contains("http")) {
LevelListDrawable d = new LevelListDrawable();
Drawable empty = tvMsg.getContext().getResources().getDrawable(R.drawable.logo);
d.addLevel(0, 0, empty);
d.setBounds(0, 0, empty.getIntrinsicWidth(), empty.getIntrinsicHeight());
new LoadImage().execute(source, d);
return d;
}else{
int id = ChatActivity.smilesMapReplaces.get(source);
Drawable d = tvMsg.getContext().getResources().getDrawable(id);
d.setBounds(0,0,d.getIntrinsicWidth() * 3/2,d.getIntrinsicHeight() * 3/2);
return d;
}
}
class LoadImage extends AsyncTask<Object, Void, Bitmap> {
private LevelListDrawable mDrawable;
@Override
protected Bitmap doInBackground(Object... params) {
String source = (String) params[0];
mDrawable = (LevelListDrawable) params[1];
try {
InputStream is = new URL(source).openStream();
return BitmapFactory.decodeStream(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
BitmapDrawable d = new BitmapDrawable(bitmap);
mDrawable.addLevel(1, 1, d);
mDrawable.setBounds(0, 0, bitmap.getWidth()*3, bitmap.getHeight()*3);
mDrawable.setLevel(1);
CharSequence t = tvMsg.getText();
tvMsg.setText(t);
}
}
}
}
class FileHolder extends RecyclerView.ViewHolder{
@BindView(R.id.tvName)
BlackTextView tvName;
@BindView(R.id.tvTime)
BlackTextView tvTime;
@BindView(R.id.ivUser)
ImageView ivUser;
public FileHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public void bind(Message message){
String fileName = message.msg.substring(8, message.msg.length());
tvName.setText(fileName);
Picasso.with(ivUser.getContext()).load(me_photo).into(ivUser);
tvTime.setText(DateUtils.getDisplayTime(tvTime.getContext(), message.created, DateUtils.DATE_FORMAT_ISO_8601));
}
}
class FileDoneHolder extends RecyclerView.ViewHolder{
@BindView(R.id.tvName)
BlackTextView tvName;
@BindView(R.id.tvTime)
BlackTextView tvTime;
@BindView(R.id.ivUser)
ImageView ivUser;
@BindView(R.id.ivFile)
ImageView ivFile;
@BindView(R.id.ivAttachment)
ImageView ivAttachment;
public FileDoneHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public void bind(Message message){
final String fileName = message.msg.substring(13, message.msg.length());
tvName.setText(fileName);
Picasso.with(ivUser.getContext()).load(me_photo).into(ivUser);
tvTime.setText(DateUtils.getDisplayTime(tvTime.getContext(), message.created, DateUtils.DATE_FORMAT_ISO_8601));
tvName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File fileDir = new File(Environment.getExternalStorageDirectory().toString() + "/araliya/");
if (!fileDir.exists()){
fileDir.mkdir();
}
File file = new File(Environment.getExternalStorageDirectory().toString() + "/araliya/" + fileName);
if (file.exists()){
UIUtils.openFile(context, file.getAbsolutePath());
}else{
new DownloadFileFromURL(fileName).execute(Constants.BASE_FILE_URL + fileName);
}
}
});
ivAttachment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File fileDir = new File(Environment.getExternalStorageDirectory().toString() + "/araliya/");
if (!fileDir.exists()){
fileDir.mkdir();
}
File file = new File(Environment.getExternalStorageDirectory().toString() + "/araliya/" + fileName);
if (file.exists()){
UIUtils.openFile(context, file.getAbsolutePath());
}else{
new DownloadFileFromURL(fileName).execute(Constants.BASE_FILE_URL + fileName);
}
}
});
}
}
class FileDoneRepHolder extends RecyclerView.ViewHolder{
@BindView(R.id.tvName)
BlackTextView tvName;
@BindView(R.id.tvTime)
BlackTextView tvTime;
@BindView(R.id.ivUser)
ImageView ivUser;
@BindView(R.id.ivAttachment)
ImageView ivAttachment;
public FileDoneRepHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public void bind(Message message){
final String fileName = message.msg.substring(13, message.msg.length());
tvName.setText(fileName);
Picasso.with(ivUser.getContext()).load(rep_photo).into(ivUser);
tvTime.setText(DateUtils.getDisplayTime(tvTime.getContext(), message.created, DateUtils.DATE_FORMAT_ISO_8601));
ivAttachment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File fileDir = new File(Environment.getExternalStorageDirectory().toString() + "/araliya/");
if (!fileDir.exists()){
fileDir.mkdir();
}
File file = new File(Environment.getExternalStorageDirectory().toString() + "/araliya/" + fileName);
if (file.exists()){
UIUtils.openFile(context, file.getAbsolutePath());
}else{
new DownloadFileFromURL(fileName).execute(Constants.BASE_FILE_URL + fileName);
}
}
});
tvName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File fileDir = new File(Environment.getExternalStorageDirectory().toString() + "/araliya/");
if (!fileDir.exists()){
fileDir.mkdir();
}
File file = new File(Environment.getExternalStorageDirectory().toString() + "/araliya/" + fileName);
if (file.exists()){
UIUtils.openFile(context, file.getAbsolutePath());
}else{
new DownloadFileFromURL(fileName).execute(Constants.BASE_FILE_URL + fileName);
}
}
});
}
}
class MeHolder extends RecyclerView.ViewHolder implements Html.ImageGetter{
@BindView(R.id.ivUser)
CircleImageView ivUser;
@BindView(R.id.tvMsg)
BlackTextView tvMsg;
@BindView(R.id.tvTime)
BlackTextView tvTime;
public MeHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public void bind(final Message message){
for(String s : ChatActivity.smilesMapReplaces.keySet()){
if (message.msg.contains(s)){
String img = "<img src='" + s + "' />";
if (s.equals(":)")){
s = ":\\)";
}else if(s.equals(":(")){
s = ":\\(";
}else if(s.equals(";)")){
s = ";\\)";
}
message.msg = message.msg.replaceAll(s, img);
}
}
tvMsg.setText(Html.fromHtml(message.msg, this, null));
Picasso.with(ivUser.getContext()).load(me_photo).into(ivUser);
ivUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((BaseActivity)ivUser.getContext()).startActivity(ProfileActivity.class, AppSetting.getInstance().getUserData().user_id, false);
}
});
if (message.msg.startsWith("http")){
tvMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(message.msg));
tvMsg.getContext().startActivity(browserIntent);
}
});
}
tvTime.setText(DateUtils.getDisplayTime(tvTime.getContext(), message.created, DateUtils.DATE_FORMAT_ISO_8601));
}
@Override
public Drawable getDrawable(String source) {
if (source.contains("http")) {
LevelListDrawable d = new LevelListDrawable();
Drawable empty = tvMsg.getContext().getResources().getDrawable(R.drawable.logo);
d.addLevel(0, 0, empty);
d.setBounds(0, 0, empty.getIntrinsicWidth(), empty.getIntrinsicHeight());
new LoadImage().execute(source, d);
return d;
}else{
int id = ChatActivity.smilesMapReplaces.get(source);
Drawable d = tvMsg.getContext().getResources().getDrawable(id);
d.setBounds(0,0,d.getIntrinsicWidth() * 3/2,d.getIntrinsicHeight() * 3/2);
return d;
}
}
class LoadImage extends AsyncTask<Object, Void, Bitmap> {
private LevelListDrawable mDrawable;
@Override
protected Bitmap doInBackground(Object... params) {
String source = (String) params[0];
mDrawable = (LevelListDrawable) params[1];
try {
InputStream is = new URL(source).openStream();
return BitmapFactory.decodeStream(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
BitmapDrawable d = new BitmapDrawable(bitmap);
mDrawable.addLevel(1, 1, d);
mDrawable.setBounds(0, 0, bitmap.getWidth()*3, bitmap.getHeight()*3);
mDrawable.setLevel(1);
CharSequence t = tvMsg.getText();
tvMsg.setText(t);
}
}
}
}
class FooterHolder extends RecyclerView.ViewHolder{
public FooterHolder(View itemView) {
super(itemView);
}
}
class DownloadFileFromURL extends AsyncTask<String, String, String> {
String fileName;
public DownloadFileFromURL(String fileName) {
this.fileName = fileName;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... f_url) {
int count;
try {
URL url = new URL(f_url[0]);
URLConnection conection = url.openConnection();
conection.connect();
int lenghtOfFile = conection.getContentLength();
InputStream input = new BufferedInputStream(url.openStream(),
8192);
OutputStream output = new FileOutputStream(Environment
.getExternalStorageDirectory().toString()
+ "/araliya/" + fileName);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress("" + (int) ((total * 100) / lenghtOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
e.printStackTrace();
return null;
}
return fileName;
}
protected void onProgressUpdate(String... progress) {
}
@Override
protected void onPostExecute(String file_url) {
if (file_url != null){
UIUtils.openFile(context, Environment.getExternalStorageDirectory().toString() + "/araliya/" + file_url);
}
}
}
}