2011-12-12 137 views
1

我已经成功实现了列表视图的延迟加载。一切正常;加载图像和文字。我有2条文字信息;名称和说明。我能够完美地显示图像和名称。但是,一旦我尝试在其中包含描述,在某个位置之前似乎没有问题。程序在该位置被强制关闭。无法弄清楚是什么导致它关闭。任何想法可能是什么原因?在logcat上显示的结果仅打印到要打印的项目总数的大约一半。Android - 懒加载列表视图

程序能够检索所有图像并正确显示它们。这是肯定的。但有问题检索整个文本内容。它只检索可用文本总数的一半。

我使用here的示例。在logcat的

LazyAdapter.java

public class LazyAdapter extends BaseAdapter { 

private Activity activity; 
private String[] data; 
private String[] text; 
private static LayoutInflater inflater=null; 
public ImageLoader imageLoader; 

public LazyAdapter(Activity a, String[] d, String[] t) { 
    activity = a; 
    data=d; 
    text = t; 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader=new ImageLoader(activity.getApplicationContext()); 
} 

public int getCount() { 
    return data.length; 
}  

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public static class ViewHolder{ 
    public TextView text; 
    public ImageView image; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    ViewHolder holder; 
    if(convertView==null){ 
     vi = inflater.inflate(R.layout.item, null); 
     holder=new ViewHolder(); 
     holder.text=(TextView)vi.findViewById(R.id.text);; 
     holder.image=(ImageView)vi.findViewById(R.id.image); 
     vi.setTag(holder); 
    } 
    else 
     holder=(ViewHolder)vi.getTag(); 

    holder.text.setText(text[position]); 
    holder.image.setTag(data[position]); 
    imageLoader.DisplayImage(data[position], activity, holder.image); 
    return vi; 
} 
} 

错误异常如下所示。

ERROR/AndroidRuntime(270): java.lang.ArrayIndexOutOfBoundsException 
ERROR/AndroidRuntime(270):  at com.lazy.LazyAdapter.getView(LazyAdapter.java:59) 
ERROR/AndroidRuntime(270):  at android.widget.AbsListView.obtainView(AbsListView.java:1294) 
ERROR/AndroidRuntime(270):  at android.widget.ListView.makeAndAddView(ListView.java:1727) 
ERROR/AndroidRuntime(270):  at android.widget.ListView.fillDown(ListView.java:652) 
ERROR/AndroidRuntime(270):  at android.widget.ListView.fillGap(ListView.java:623) 
ERROR/AndroidRuntime(270):  at android.widget.AbsListView.trackMotionScroll (AbsListView.java:2944) 
ERROR/AndroidRuntime(270):  at android.widget.AbsListView$FlingRunnable.run (AbsListView.java:2485) 
ERROR/AndroidRuntime(270):  at android.os.Handler.handleCallback(Handler.java:587) 
ERROR/AndroidRuntime(270):  at android.os.Handler.dispatchMessage(Handler.java:92) 
ERROR/AndroidRuntime(270):  at android.os.Looper.loop(Looper.java:123) 
ERROR/AndroidRuntime(270):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
ERROR/AndroidRuntime(270):  at java.lang.reflect.Method.invokeNative(Native Method) 
ERROR/AndroidRuntime(270):  at java.lang.reflect.Method.invoke(Method.java:521) 
ERROR/AndroidRuntime(270):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
ERROR/AndroidRuntime(270):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
ERROR/AndroidRuntime(270):  at dalvik.system.NativeStart.main(Native Method) 
+0

你看过logcat吗?它说什么? – Squonk

+0

我在logcat上打印了我的结果,一切都很好。检索结果完全正确。但错误显示 - 07:42:42.230:ERROR/AndroidRuntime(270):java.lang.ArrayIndexOutOfBoundsException,07:42:42.230:ERROR/AndroidRuntime(270):at tp.edu.sg.LazyAdapter.getView(LazyAdapter.java :59) – Hend

+0

当您滚动到最底部的项目时会出现问题吗? –

回答

1

显然你用deiteating一些数组/数组列表在LazyAdapter.java:59你的数据库愚蠢。如果这是最后一次输入,那么最有可能是错误的错误

编写和执行有意义的单元测试可以让您免于此情况。

2

您要发送到适配器的数组或列表可能来自其他某个活动,该列表应该已在该活动的onCreate()之外初始化,因此每次加载列表时都不会更新。

所以很可能的解决方案是在onCreate中初始化它。例如:

public static List<ClassObject> myList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.create_event_main); 
    myList= new ArrayList<ClassObject>(); 
    <b>/***Then set the adapter******/</b> 

    ListView lv; 
    lv = (ListView)findViewById(R.id.cem_listview); 
    adapter = new LazyAdapter(MyActivity.this, R.layout.MyActivity,myList); 
    lv.setAdapter(adapter); 
}