2013-05-07 148 views
0

我正在創建自定義ListView。但我不斷收到NullPointerException,我不知道爲什麼。 我在stackOVerflow的另一個問題上看到一個人有同樣的問題,他不得不刪除if(itemView == null)。這解決了他的問題。但是這對我來說不起作用... 你們可以幫我嗎?Android:NullPointerException自定義ListView適配器

FavoriteActivty

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageButton; 
import android.widget.ListView; 
import android.widget.TextView; 

public class FavoriteActivity extends Activity { 

private List<Favorite> favoriteItem = new ArrayList<Favorite>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.favorite); 

    populateFavoriteList(); 
    populateListview(); 

} 

private void populateFavoriteList() { 
    favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 1")); 
    favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 2")); 
    favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 3")); 
    favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 4")); 
    favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 5")); 
    favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 6")); 
    favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 7")); 
    favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 8")); 
} 

private void populateListview() { 
    ArrayAdapter<Favorite> adapter = new MyListAdapter(); 
    ListView list = (ListView) findViewById(R.id.favoriteList); 
    Log.v("PASSED","found the list by ID"); 
    list.setAdapter(adapter); 
    Log.v("PASSED","adapter setted"); 
} 

private class MyListAdapter extends ArrayAdapter<Favorite> { 
    public MyListAdapter() { 
     super(FavoriteActivity.this, R.layout.favorite_row, favoriteItem); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // To be sure we have a view, because null is possible 
     View itemView = convertView; 
     if (itemView == null) { 
      itemView = getLayoutInflater().inflate(R.layout.favorite_row, 
        parent, false); 
     } 

     // Find the item to work with 
     Favorite currentItem = favoriteItem.get(position); 

     // Filling the View 
     ImageButton thumbnail = (ImageButton) findViewById(R.id.favoriteThumbnail); 
     thumbnail.setBackgroundResource(currentItem.getThumbnail()); 

     TextView name = (TextView) findViewById(R.id.favoriteName); 
     name.setText(currentItem.getName()); 

     return itemView; 

    } 
    } 
} 

Favorite.class

public class Favorite { 

private int favoriteThumbnail; 
private String favoriteName;  

public Favorite(int favoriteThumbnail, String favoriteName){ 
    super(); 
    this.favoriteThumbnail = favoriteThumbnail; 
    this.favoriteName = favoriteName; 
} 

public int getThumbnail(){ 
    return favoriteThumbnail; 
} 

public String getName(){ 
    return favoriteName; 
} 
} 

favorite_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:weightSum="4" > 

    <ImageButton 
     android:layout_width="100dp" 
     android:layout_height="wrap_content" 
     android:contentDescription="thumbnail" 
     android:src="@drawable/icon_camera" 
     android:layout_weight="1" 
     android:background="@null" 
     android:id="@+id/favoriteThumbnail" 
     /> 
<TextView 
    android:id="@+id/favoriteName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:text="Name" 
    android:textSize="20sp" /> 

<ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:contentDescription="Direction" 
    android:layout_weight="1" 
    android:src="@drawable/icon_directions" 
    android:background="@null" 
    android:id="@+id/favoriteDirections"/> 

<ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:contentDescription="Delete from favorite" 
    android:layout_weight="1" 
    android:src="@drawable/icon_delete" 
    android:background="@null" 
    android:id="@+id/favoriteDelete"/> 

logcat的

05-07 19:40:41.450: V/PASSED(26227): found the list by ID 
05-07 19:40:41.450: V/PASSED(26227): adapter setted 
05-07 19:40:41.480: D/AndroidRuntime(26227): Shutting down VM 
05-07 19:40:41.480: W/dalvikvm(26227): threadid=1: thread exiting with uncaught exception (group=0x4187e2a0) 
05-07 19:40:41.500: E/AndroidRuntime(26227): FATAL EXCEPTION: main 
05-07 19:40:41.500: E/AndroidRuntime(26227): java.lang.NullPointerException 
05-07 19:40:41.500: E/AndroidRuntime(26227): at com.example.spui.FavoriteActivity$MyListAdapter.getView(FavoriteActivity.java:68) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.AbsListView.obtainView(AbsListView.java:2461) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.ListView.measureHeightOfChildren(ListView.java:1250) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.ListView.onMeasure(ListView.java:1162) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.View.measure(View.java:15473) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.View.measure(View.java:15473) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5056) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.View.measure(View.java:15473) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.LinearLayout.measureVertical(LinearLayout.java:833) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.View.measure(View.java:15473) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5056) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2361) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.View.measure(View.java:15473) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1974) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1217) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1390) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1112) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4472) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.Choreographer.doFrame(Choreographer.java:525) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.os.Handler.handleCallback(Handler.java:615) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.os.Looper.loop(Looper.java:137) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at android.app.ActivityThread.main(ActivityThread.java:4898) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at java.lang.reflect.Method.invokeNative(Native Method) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at java.lang.reflect.Method.invoke(Method.java:511) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
05-07 19:40:41.500: E/AndroidRuntime(26227): at dalvik.system.NativeStart.main(Native Method) 
+0

提供您的logcat的請。 – bclymer 2013-05-07 18:39:25

+0

只是片刻,只是要編輯:)編輯:LogCat添加 – mXX 2013-05-07 18:40:22

+0

@mXX你也應該考慮使用視圖持有人的平滑滾動和性能。 – Raghunandan 2013-05-07 19:05:23

回答

3

您不應該使用getView中的活動視圖,而是使用適配器提供的視圖。

public View getView(int position, View convertView, ViewGroup parent) { 

// stuff 

ImageButton thumbnail = (ImageButton) itemView.findViewById(R.id.favoriteThumbnail); 

注意itemView之前的findViewById。活動視圖沒有任何內容,編號爲favoriteThumbnail

編輯:這當然,應當在getView適用於所有的意見,不只是thumbnail

+0

這解決了我的問題,作爲第一!感謝bclymer爲您的快速響應。 – mXX 2013-05-07 19:04:43

+0

投票百次如果我可以 – Rasel 2015-12-16 15:20:09

1
ImageButton thumbnail = (ImageButton)itemview.findViewById(R.id.favoriteThumbnail); 
TextView name = (TextView) itemview.findViewById(R.id.favoriteName); 

您必須使用ItemView控件找到IDS。你沒有,因此你得到NPE

你也應該考慮使用視圖持有人的平滑滾動和性能。

入住視圖持有人在下面的鏈接

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

而且在標題保持查看對象的話題在鏈接看看下面的視頻

https://www.youtube.com/watch?v=wDBM6wVEO70

+0

非常感謝您的鏈接!只是在其中實現了View持有者,是否應該聰明地使用異步任務,或者在使用視圖持有者時不需要? – mXX 2013-05-07 19:11:36

+0

如果您從服務器下載圖像是使用asynctask。如果答案可以幫助您投票相同 – Raghunandan 2013-05-07 19:12:58

2

替換:

ImageButton thumbnail = (ImageButton) findViewById(R.id.favoriteThumbnail); 
thumbnail.setBackgroundResource(currentItem.getThumbnail()); 

TextView name = (TextView) findViewById(R.id.favoriteName); 
name.setText(currentItem.getName()); 

通過:

ImageButton thumbnail = (ImageButton) itemView.findViewById(R.id.favoriteThumbnail); 
thumbnail.setBackgroundResource(currentItem.getThumbnail()); 

TextView name = (TextView) itemView.findViewById(R.id.favoriteName); 
name.setText(currentItem.getName());