2012-04-12 98 views
2

我在这里看到了bug的Android ListView控件崩溃..我有一个从服务器异步填充的列表视图...它填充,然后再显示在列表视图...但是当我向下滚动它崩溃...从日志中我看到它与列表视图和所有的人口无关... ...你能帮我吗?滚动时

04-12 12:39:54.676: E/AndroidRuntime(1984): FATAL EXCEPTION: main 
04-12 12:39:54.676: E/AndroidRuntime(1984): java.lang.NullPointerException 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.widget.AbsListView.obtainView(AbsListView.java:1304) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.widget.ListView.makeAndAddView(ListView.java:1727) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.widget.ListView.fillUp(ListView.java:682) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.widget.ListView.correctTooHigh(ListView.java:1349) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.widget.ListView.fillGap(ListView.java:624) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:2944) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:2065) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.widget.ListView.onTouchEvent(ListView.java:3315) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.View.dispatchTouchEvent(View.java:3766) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.os.Looper.loop(Looper.java:123) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
04-12 12:39:54.676: E/AndroidRuntime(1984):  at dalvik.system.NativeStart.main(Native Method) 

这是一个扩展底座适配器

@Override 
public int getCount() { 

    return mAppIconMapList.size(); 
} 

@Override 
public Object getItem(int position) { 

    return mAppIconMapList.get(position); 
} 

public Object getAppName(int position) { 

    return mAvaiableApps.get(position); 
} 

@Override 
public long getItemId(int position) { 

    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // sets the view onto list view 
    LinearLayout rowLayout = null; 

    System.out.println("getView " + position + " " + convertView); 

    if (convertView == null) { 
     // inflating the row 
     rowLayout = (LinearLayout) mInflater.inflate(
       R.layout.list_custom_row, parent, false); 

     mAppIcon = (ImageView) rowLayout.findViewById(R.id.icon); 
     mAppName = (TextView) rowLayout.findViewById(R.id.application); 
     mAppName.setTextColor(Color.WHITE); 
     mAppHint = (TextView) rowLayout.findViewById(R.id.hint); 
     mAppHint.setTextColor(Color.WHITE); 
     mDownloadButton = (Button) rowLayout.findViewById(R.id.download); 
     mDownloadButton.setFocusable(false); 

    } 
    // else 
    // convertView.getTag(); 


    mIcon = mAppIconMapList.get(position); 
    System.out.println("Icon " + mIcon); 
    mCurrentApplication = mAvaiableApps.get(position); 
    System.out.println("Current App " + mCurrentApplication); 
    mAppIcon.setImageBitmap(mIcon.get(mCurrentApplication)); 
    mAppName.setText(mCurrentApplication.replace(".apk", "")); 
    mAppHint.setText("Click here to view Description"); 

    return rowLayout; 
} 

自定义适配器类而这就是我如何打电话

mCustomAdapter = new BWCustomAdapter(mCategory, avaiableApps, 
          appIconMap, BWListApplication.this); 
        setListAdapter(mCustomAdapter); 

,这是我的列表视图

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="450dip" 
    android:layout_height="300dip" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:fadingEdge="none" 
     android:listSelector="@drawable/list_selector" /> 
</LinearLayout> 
+0

请添加listview的代码,我们无法知道没有代码的问题。 – 2012-04-12 07:21:04

+0

给ouy列表代码也 – vipin 2012-04-12 07:21:04

+0

刚刚更新查询。请参阅让我知道... – 2012-04-12 07:31:07

回答

8

你真的应该使用ViewHolder模式:,同时定义自定义适配器

  • 从下面的代码删除注释您还没有跟随ViewHolder模式。但这不是你看到空指针的原因。 您需要始终为rowLayout分配一个值。

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
        // sets the view onto list view 
        LinearLayout rowLayout = null; 
    
        System.out.println("getView " + position + " " + convertView); 
    
        if (convertView == null) { 
         // inflating the row 
         rowLayout = (LinearLayout) mInflater.inflate(
           R.layout.list_custom_row, parent, false); 
    
    
        } else { 
         rowLayout = convertView; 
        } 
        mAppIcon = (ImageView) rowLayout.findViewById(R.id.icon); 
        mAppName = (TextView) rowLayout.findViewById(R.id.application); 
        mAppName.setTextColor(Color.WHITE); 
        mAppHint = (TextView) rowLayout.findViewById(R.id.hint); 
        mAppHint.setTextColor(Color.WHITE); 
        mDownloadButton = (Button) rowLayout.findViewById(R.id.download); 
        mDownloadButton.setFocusable(false); 
    
    
        mIcon = mAppIconMapList.get(position); 
        System.out.println("Icon " + mIcon); 
        mCurrentApplication = mAvaiableApps.get(position); 
        System.out.println("Current App " + mCurrentApplication); 
        mAppIcon.setImageBitmap(mIcon.get(mCurrentApplication)); 
        mAppName.setText(mCurrentApplication.replace(".apk", "")); 
        mAppHint.setText("Click here to view Description"); 
    
        return rowLayout; 
    } 
    
  • +0

    真正令人惊叹的调试...非常感谢你..它为我工作... – 2012-04-12 08:24:58

    1
    // else 
    // convertView.getTag(); 
    
    +0

    帕雷什,我将使用一个静态类视图持有人持有我所有的小部件...但是我不使用集标记了..所以想到会删除它... – 2012-04-12 08:26:56