某些特定Android设备中的ArrayIndexOutOfBoundsException

时间:2014-09-17 17:04:05

标签: java android exception android-listview indexoutofboundsexception

我刚刚在Google Play上发布了一个应用程序。在一项活动中,我正在填写列表,它可以在许多不同的设备上工作,包括我的设备Motorola Moto G.但是今天我使用LG G3的朋友告诉我,当它向下滚动时它会在某些时候崩溃。这也发生在其他特定设备上。

每次滚动并在列表的同一点时都会发生此错误。所以我认为这不是内存错误。我想强调它不会发生在我的设备中。您可以在下面找到我的代码:

public View getView(int position, View view, ViewGroup parent) 
{
    LayoutInflater inflater = context.getLayoutInflater();
    View rowView = inflater.inflate(R.layout.list_programim_item, null, true);
    TextView txtTitle = (TextView) rowView.findViewById(R.id.programim_item_name);

    ImageView imageView = (ImageView) rowView
            .findViewById(R.id.programim_item_img);

    // Don't use web but getItem call on the adapter itself
    txtTitle.setText(getItem(position));
    txtTitle.setTypeface(font);
    imageView.setImageResource(imageId[position]); //CRASHES HERE ArrayIndexOutOfBoundsException
    return rowView;
}

我正在从文本文件中填充imageId。

    public void setHareketler() {
    AssetManager am = getAssets();
    InputStreamReader ims = null;
    BufferedReader reader = null;
    String data = "File not available!";
    try {
        ims = new InputStreamReader(am.open(hareketTipi + ".txt"), "UTF-8");
        reader = new BufferedReader(ims);
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (ims != null) {
        try {
            String mLine = reader.readLine();
            data = "";
            while (mLine != null) {
                data += mLine;

                // mLine bossa dur
                if (mLine == null)
                    break;

                arrHareketIsimleri.add(mLine); // hareket isimleri eklendi

                // buradan itibaren hareket resimleri eklenmesi icin
                mLine = mLine.replace(" ", "_");
                mLine = mLine.replace("-", "_");
                mLine = mLine.replace("(", "");
                mLine = mLine.replace(")", "");
                mLine = mLine.toLowerCase();
                mLine = "_" + mLine + "_thumb";
                try {
                    Class res = R.drawable.class;
                    //mLine = "_6_inch_leg_lifts"; // bu kaldirilacak
                    Field field = res.getField(mLine);
                    int drawableId = field.getInt(null);
                    arrHareketResimleri.add(drawableId); // hareket
                                                            // resimleri
                                                            // ekleniyor
                } catch (Exception e) {
                    Log.e("MyTag", "Failure to get drawable id.", e);
                }
                mLine = reader.readLine();

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>

<ImageView
    android:id="@+id/programim_item_img"
    android:layout_height="60dp"
    android:layout_width="60dp"
    android:layout_alignParentLeft="true"
    android:layout_marginRight="4dp"
    android:layout_centerVertical="true"/>

<TextView 
    android:id="@+id/programim_item_name"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_toRightOf="@id/programim_item_img"
    android:layout_toLeftOf="@+id/programim_right_arrow"
    android:layout_marginLeft="16dp"
    android:textSize="26sp"
    android:textColor="@color/dark_gray" 
    android:layout_centerVertical="true"/>

<ImageView
    android:id="@+id/programim_right_arrow"
    android:src="@drawable/right_arrow"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_marginRight="4dp"
    android:layout_centerVertical="true"/>

我正在附上崩溃日志的截图。我想知道在不同设备中可能导致此崩溃的原因。 enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

似乎(使用给定的信息)当您到达列表视图的末尾时,您将面临此问题。我不认为与设备有关,但似乎这个错误并不总是触发自己。

我的建议:

确保数组imageId的长度与ListView的长度相同。为此,请使用适配器中的getCount()方法。看来你的listView试图获得项目编号45(位置44,因为它从0开始),你的数组长度是44。

如果它是一个错误,我不这么认为,你没有找到任何其他解决方案,尝试忽略这些行如下。

if(position < imageId.length)
{
   txtTitle.setText(getItem(position));
   txtTitle.setTypeface(font);
   imageView.setImageResource(imageId[position]);
}

通过这种方式,您将获得空行,但它可以帮助您找到问题

希望有所帮助

答案 1 :(得分:0)

从您的堆栈跟踪中,我猜您正在重新填充您的视图,但 imageId [] 的可用位置数量有限。

尝试这样的事情,

  public View getView(int position, View view, ViewGroup parent) 
    {
        View rowView;
        if(view==null){
        LayoutInflater inflater = context.getLayoutInflater();
        rowView = inflater.inflate(R.layout.list_programim_item, null, true);
        TextView txtTitle = (TextView) rowView.findViewById(R.id.programim_item_name);

        ImageView imageView = (ImageView) rowView
                .findViewById(R.id.programim_item_img);

        txtTitle.setText(getItem(position));
        txtTitle.setTypeface(font);
        imageView.setImageResource(imageId[position]);
        }else{
           rowView=(View)view;
        }
       return rowView;
    }

编辑: 如果你返回 imageId [] 的最大大小(即说 imageId [] 有55个图像你应该返回55)在这个你覆盖的方法中,你会显示所有图像。 如果 imageId [] 是一个数组列表 imageId.size()将会这样做。

        @Override
        public int getCount() {
            return imageId[]'s size; //e.g return 55 if you have 55 images
        }