我刚刚在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"/>
我正在附上崩溃日志的截图。我想知道在不同设备中可能导致此崩溃的原因。
答案 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
}