2014-03-16 5 views
0

Я пытаюсь использовать собственный адаптер с ListView в своем основном действии, и он сбой. Я везде искал ответ, пожалуйста, помогите!NullPointerException при настройке настраиваемого адаптера

Моя основная деятельность/ListActivity:

public class ListRestaurantsMain extends ListActivity { 

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

    //access myApp 
    MyApplication myApp = MyApplication.getInstance(); 
    ArrayList <RestaurantObj> arr = new ArrayList <RestaurantObj>(); 

    arr = myApp.getArray(); 

    ListView lv = (ListView) findViewById(android.R.id.list); 
    RatingAdapter adapter = new RatingAdapter(getApplicationContext(), arr); 
    lv.setAdapter(adapter); 


} 
    @Override 
    protected void onListItemClick(ListView lv, View v, int position, long id) { 
     super.onListItemClick(lv, v, position, id); 

     Log.v("ClickListener", "Item at pos: " + position + " clicked."); 
    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.list_restaurants_main, menu); 
    return true; 
} 



} 

Мой заказ адаптер:

class RatingAdapter extends ArrayAdapter<RestaurantObj> { 

public RatingAdapter(Context context, ArrayList<RestaurantObj> objects) { 
    super(context, R.layout.list_row, R.id.title, objects); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 

    //get info from Restaurant Object 
    RestaurantObj restObj = getItem(position); 

    // create new inflater 
     row = LayoutInflater.from(getContext()).inflate(R.layout.list_row, null); 


    //display name of restaurant 
    TextView restName = (TextView)row.findViewById(R.id.title); 
    restName.setText(restObj.getName()); 

    //display rating 
    RatingBar rb = (RatingBar) row.findViewById(R.id.ratingbar); 
    rb.setRating(3); //grab rating from object 

    return row; 
} 
} 

Logcat

03-16 03:04:16.679: E/AndroidRuntime(1865): FATAL EXCEPTION: main 
03-16 03:04:16.679: E/AndroidRuntime(1865): Process: com.example.restaurantrater, PID: 1865 
03-16 03:04:16.679: E/AndroidRuntime(1865): java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.example.restaurantrater/com.example.restaurantrater.ListRestaurantsMain}: java.lang.NullPointerException 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.app.ActivityThread.access$800(ActivityThread.java:135) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.os.Handler.dispatchMessage(Handler.java:102) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.os.Looper.loop(Looper.java:136) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at java.lang.reflect.Method.invoke(Method.java:515) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at dalvik.system.NativeStart.main(Native Method) 
03-16 03:04:16.679: E/AndroidRuntime(1865): Caused by: java.lang.NullPointerException 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.widget.ListView.setAdapter(ListView.java:480) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at com.example.restaurantrater.ListRestaurantsMain.onCreate(ListRestaurantsMain.java:32) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.app.Activity.performCreate(Activity.java:5231) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
03-16 03:04:16.679: E/AndroidRuntime(1865):  ... 11 more 

Я проверил все идентификаторы в XMLs и все они существуют и этажерки ... Я подозреваю, что мой пользовательский адаптер является проблемой, но я не понимаю, что я делаю неправильно. Пострадавшему здесь студенту с ограниченным опытом работы в андроиде, пожалуйста, помогите!

+1

Просьба указать logcat. – Aashir

+2

Почти наверняка, что myApp.getArray() возвратил null –

+0

@Aashir Logcat. – JustineS

ответ

0

Во-первых, вы должны повторно использовать представления, если они существуют, вместо того, чтобы создавать новые, когда это не нужно, это экономит RAM и повышает производительность. Измените метод GetView(), как следующее:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_row, null); 
    } 

    RestaurantObj restObj = getItem(position); 

    TextView restName = (TextView)row.findViewById(R.id.title); 
    restName.setText(restObj.getName()); 

    RatingBar rb = (RatingBar) row.findViewById(R.id.ratingbar); 
    rb.setRating(3); 

    return convertView; 
} 

Onto решения вашей проблемы, а также сказал Гейб, то getArray() метод из вашего класса приложения является перенастройка нуля. Проверь это.

Смежные вопросы