2015-04-27 1 views
0

Я делал домашнее задание для курса coursera, когда я улавливал NPE. Не удается исправить эту проблему в течение нескольких дней и не может продолжаться без фиксации. Google не помогает. ОБНОВЛЕНО КОД ВНИЗ СТРАНИЦА Вот мой код:ListView.setAdapter NullPointerException

MainActivity

List<Selfie> selfies = new ArrayList<Selfie>(); 
private CustomAdapter ADAPTER = new CustomAdapter(this, selfies); 

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

@Override 
protected void onResume() { 
    super.onResume(); 
    File youDir = new File("/sdcard/DailySelfie/"); 

    outer : for (File f : youDir.listFiles()) { 
     //try to find selfie in files 
     if (f.isFile()) { 
      for (Selfie selfie : selfies) { 
       if (selfie.getSelfieName() == f.getName()) { 
        continue outer; 
       } 
       else { continue;} 
      } 
      //code below works only if file doesn't exist in selfies. 
      Bitmap myBitmap = BitmapFactory.decodeFile(f.getAbsolutePath()); 
      try { 
       selfies.add(new Selfie(f.getName(), myBitmap)); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

селфи:

public class Selfie { 
private Bitmap selfieBitmap; 
private String selfieName; 
public Selfie(String selfieName, Bitmap selfieBitmap) { 
    this.selfieName = selfieName; 
    this.selfieBitmap = selfieBitmap; 
} 
public String getSelfieName() { 
    return selfieName; 
} 
public Bitmap getSelfieBitmap() { 
    return selfieBitmap; 
} 
} 

CustomAdapter:

private Context context; 
private List<Selfie> selfies = new ArrayList<Selfie>(); 

public CustomAdapter(Context context, List<Selfie> selfies) { 
    this.context = context; 
    this.selfies = selfies; 
} 

@Override 
public int getCount() { 
    return selfies.size(); 
} 

@Override 
public Object getItem(int position) { 
    return selfies.get(position); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup viewGroup) { 
    Selfie selfie = selfies.get(position); 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = new View(context); 
     //get layout from row.xml 
     rowView = inflater.inflate(R.layout.row, null); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView); 
     imageView.setImageBitmap(selfie.getSelfieBitmap()); 
     TextView textView = (TextView) rowView.findViewById(R.id.text); 
     textView.setText(selfie.getSelfieName()); 
    } 
    return convertView; 
} 
} 

ADB:

04-27 13:17:58.792: E/AndroidRuntime(1979): FATAL EXCEPTION: main 
04-27 13:17:58.792: E/AndroidRuntime(1979): java.lang.NullPointerException 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.AbsListView.obtainView(AbsListView.java:2179) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.ListView.makeAndAddView(ListView.java:1840) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.ListView.fillDown(ListView.java:675) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.ListView.fillFromTop(ListView.java:736) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.ListView.layoutChildren(ListView.java:1655) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.AbsListView.onLayout(AbsListView.java:2012) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.View.layout(View.java:14289) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewGroup.layout(ViewGroup.java:4562) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1660) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1436) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.View.layout(View.java:14289) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewGroup.layout(ViewGroup.java:4562) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.View.layout(View.java:14289) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewGroup.layout(ViewGroup.java:4562) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.View.layout(View.java:14289) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewGroup.layout(ViewGroup.java:4562) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.View.layout(View.java:14289) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewGroup.layout(ViewGroup.java:4562) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.View.layout(View.java:14289) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewGroup.layout(ViewGroup.java:4562) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.View.layout(View.java:14289) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewGroup.layout(ViewGroup.java:4562) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.Choreographer.doFrame(Choreographer.java:532) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.os.Handler.handleCallback(Handler.java:730) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.os.Looper.loop(Looper.java:137) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at java.lang.reflect.Method.invoke(Method.java:525) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-27 13:17:58.792: E/AndroidRuntime(1979):  at dalvik.system.NativeStart.main(Native Method) 

Похоже, что у меня есть NPE по адресу lv.setAdapter(ADAPTER);. Находились те же проблемы в StackOverflow, но ни одно решение не помогло мне. UPDATE: переписал мой код, так что теперь

List<Selfie> selfies; 
ListView lv; 
private CustomAdapter ADAPTER; 

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

    selfies = new ArrayList<Selfie>(); 
    lv = (ListView) findViewById(R.id.listView); 
    ADAPTER = new CustomAdapter(this, selfies); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
... 
lv.setAdapter(ADAPTER); 
} 

еще такая же проблема - NPE. Я попытался пошевелиться «лев = ..; ADAPTER = ...» в onResume, пытался поставить его в начало onResume - это не помогает :(

+0

Попробуйте переместить все в onResume() в OnCreate() – PPartisan

+0

пробовал оба не помогают :( – Azi

+0

Посмотрите на мой ответ ниже и обновите 'GetCount()' метода в адаптере соответственно. Это может быть из-за того, что ваш 'ArrayList' либо пуст, либо пуст. Кроме того, вы должны иметь возможность установить свой адаптер в' onCreate() ', поэтому попробуйте еще раз при тестировании моего ответа. – PPartisan

ответ

0

Я считаю, что NPE относится к вашему ListView. Попробуйте структурировать свое приложение, чтобы вы объявляли переменные класса и инициализировали их в onCreate(). Таким образом, вы ссылаетесь на них позже (как вы делаете в onResume()).

List<Selfie> selfies; 
private CustomAdapter ADAPTER; 
ListView lv; 

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

    lv = (ListView) findViewById(R.id.listView); 
    selfies = new ArrayList<Selfie>(); 
    ADAPTER = new CustomAdapter(this, selfies); 

    lv.setAdapter(ADAPTER); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    /* 
    *I don't quite see the purpose in this below section, 
    *as you can account for a null ArrayList in your adapter class 
    */ 
    if (ADAPTER.getCount() >= 0) { 
    lv.setAdapter(ADAPTER); 
    } 

} 

Кроме того, чтобы объяснить свой комментарий, который я сделал выше немного лучше, вы можете объяснить отсутствие данных в адаптере getCount() путем обработки нулевых данных в виде списка в 0 размер:

getCount() { 
    if (selfies == null || selfies.isEmpty()) { 
     return 0; 
    } 
    return selfies.size; 
} 

Edit: Если проблема ограничена вашим адаптером, то это может быть NPE, исходящий от getView(). Вы можете попробовать выполнить код ниже:

@Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View rowView; 
      Selfie selfie = selfies.get(position); 

      if (convertView == null) { 
       LayoutInflater inflater = (LayoutInflater) parent.getContext(). 
         getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       rowView = inflater.inflate(R.layout.row, parent, false); 
      } else { 
       rowView = convertView; 
      } 
      ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView); 
      imageView.setImageBitmap(selfie.getSelfieBitmap()); 
      TextView textView = (TextView) rowView.findViewById(R.id.text); 
      textView.setText(selfie.getSelfieName()); 

      return rowView; 
     } 
+0

Пробовал это, все еще есть NPE. – Azi

+1

Это помогло. Большое спасибо! – Azi

0

Проверьте, если это возвращает ничего, кроме нулевой:

ListView lv = (ListView) findViewById(R.id.listView); 

может быть, что он не может найти список.

+0

checked, он возвращает listView. – Azi

0

Поскольку вы звоните ListView lv = (ListView) findViewById(R.id.listView); в onResume, setContentView не был вызван. onResume всегда вызывается перед onCreate, так что ваши ListView не в настоящее время в контексте. Следовательно, исключение NullPointerException.

Изменение кода активности на этот

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ListView lv = (ListView) findViewById(R.id.listView); 

} 

@Override 
protected void onResume() { 
    super.onResume(); 
} 
0

Проблема в том о этом вы setteded, когда вы initialazed новый Выборочная .... Вы должны initilizate это onCreate()! (Я имею в виду класс MainActivity)

+0

Инициализировал его в onCreate - все еще NPE. – Azi

1

Добавить

private CustomAdapter ADAPTER = new CustomAdapter(this, selfies); 

в onCreate метод, потому что this контекст использования в классе methods.i.e. переписать в виде

private CustomAdapter ADAPTER; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ADAPTER = new CustomAdapter(this, selfies); 
    } 
+0

переписано как ваш код, не помогает :( – Azi

0

Ваш arraylist of the selfies пуст, потому что я ничего не вижу? также у вашего класса Selfie только есть геттер, но нет сеттеров, так как же вы настроили себе самоуправляемость вашего ариалиста?

+0

Я удалил код настройки для облегчения чтения. Добавил его, может быть, это поможет. – Azi

0

Ответ заключается в том, что в моем коде getView() я вернул convertView, но раздул rowView. Таким образом, convertView остается нулевым. PPartisan показал мне свою ошибку и дал действующий код (ниже). Чтобы повысить рейтинг, у меня должно быть 15 репутации, и у меня их нет. Может кто-нибудь, пожалуйста, поднял его рейтинг и его правильный ответ?

public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView; 
    Selfie selfie = selfies.get(position); 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) parent.getContext(). 
       getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowView = inflater.inflate(R.layout.row, parent, false); 
    } else { 
     rowView = convertView; 
    } 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView); 
    imageView.setImageBitmap(selfie.getSelfieBitmap()); 
    TextView textView = (TextView) rowView.findViewById(R.id.text); 
    textView.setText(selfie.getSelfieName()); 

    return rowView; 
} 
Смежные вопросы