2016-04-12 1 views
0

Я пытаюсь заполнить свой списокView адаптером настраиваемого массива, который я создал. В результате я хочу иметь изображение с левой стороны и две метки справа.Android fill listView с пользовательским ArrayAdapter

Когда я добираюсь до фрагмента, который должен отображать listView, приложение падает, но я не могу понять почему. Ошибка java.lang.IllegalStateException: System services not available to Activities before onCreate().

Вот мой код:

фрагмент:

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    getActivity().setTitle("Inbox"); 

    myView = inflater.inflate(R.layout.inbox_layout, container, false); 

    ListView list = (ListView) myView.findViewById(R.id.listViewMyAccount); 
    inboxCellElement[] elts = new inboxCellElement[] {new inboxCellElement(R.drawable.ic_menu_camera, "Val", "Hi !")}; 
    list.setAdapter(new inboxCellAdapter(new NavDrawer(), R.layout.inbox_cell_layout, elts, (NavDrawer) getActivity())); 

    return myView; 
} 

Объект, содержащий данные для передачи в ListView:

public class inboxCellElement { 
    private String name = "", message = ""; 
    private int imgId = 0; 

    public inboxCellElement(int imgId, String name, String message){ 
     this.imgId = imgId; 
     this.name = name; 
     this.message = message; 
    } 

    public int getImgId() { return imgId; } 
    public String getName() { return name; } 
    public String getMessage() { return message; } 
} 

Обычай адаптер:

public class inboxCellAdapter extends ArrayAdapter { 
    inboxCellElement[] elts; 
    NavDrawer navDrawer; 

    // constructor 
    public inboxCellAdapter(Context context, int resource, Object[] objects, NavDrawer navDrawer) { 
     super(context, resource, objects); 
     elts = (inboxCellElement[]) objects; 
     this.navDrawer = navDrawer; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     MyHolder holder = null; 
     LayoutInflater inflater = new NavDrawer().getLayoutInflater(); 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.inbox_cell_layout, null, false); 
      holder = new MyHolder(convertView); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (MyHolder) convertView.getTag(); 
     } 
     holder.getUpperText().setText(elts[position].getName()); 
     holder.getLowerText().setText(elts[position].getMessage()); 
     holder.getImage().setImageResource(elts[position].getImgId()); 

     return convertView; 
    } 

    private class MyHolder { 
     private View row; 
     private TextView upperText = null, lowerText = null; 
     private ImageView img = null; 

     public MyHolder(View row) { 
      this.row = row; 
     } 

     public TextView getUpperText() { 
      if (this.upperText == null) { 
       this.upperText = (TextView) navDrawer.findViewById(R.id.inboxCellName); 
      } 
      return this.upperText; 
     } 

     public TextView getLowerText() { 
      if (this.lowerText == null) { 
       this.lowerText = (TextView) navDrawer.findViewById(R.id.inboxCellMessage); 
      } 
      return this.lowerText; 
     } 

     public ImageView getImage() { 
      if (this.img == null) { 
       this.img = (ImageView) navDrawer.findViewById(R.id.inboxCellImg); 
      } 
      return this.img; 
     } 
    } 
} 

Кажется, при ошибке приходит из нескольких звонков navDrawer.findViewById(...), но я понятия не имею, как это исправить. Может ли кто-нибудь подтвердить, что ошибка происходит здесь, почему и помочь мне ее исправить? Благодаря

EDIT: Добавление StackTrace

--------- начало аварии

04-12 14:32:58.816 2128-2128/t2g.com.travel2gather E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: t2g.com.travel2gather, PID: 2128 
                    java.lang.IllegalStateException: System services not available to Activities before onCreate() 
                     at android.app.Activity.getSystemService(Activity.java:5253) 
                     at android.view.LayoutInflater.from(LayoutInflater.java:229) 
                     at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:178) 
                     at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:137) 
                     at t2g.com.travel2gather.adapters.inboxCellAdapter.<init>(inboxCellAdapter.java:0) 
                     at t2g.com.travel2gather.inboxFragment.onCreateView(inboxFragment.java:30) 
                     at android.app.Fragment.performCreateView(Fragment.java:2220) 
                     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973) 
                     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
                     at android.app.BackStackRecord.run(BackStackRecord.java:793) 
                     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
                     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482) 
                     at android.os.Handler.handleCallback(Handler.java:739) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:148) 
                     at android.app.ActivityThread.main(ActivityThread.java:5417) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

вы можете разместить полную трассировку стека? –

+0

Я добавил его в конце сообщения – Dliix

+0

Вы когда-нибудь вызывали 'getSystemService (Context.CONNECTIVITY_SERVICE);'? –

ответ

2

Вы не можете использовать конструктор активность, чтобы обеспечить context (как вы сказали в комментариях NavDrawer это ваш MainActivity). Так что измените это onCreateView вот так.

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    getActivity().setTitle("Inbox"); 

    myView = inflater.inflate(R.layout.inbox_layout, container, false); 

    ListView list = (ListView) myView.findViewById(R.id.listViewMyAccount); 
    inboxCellElement[] elts = new inboxCellElement[] {new inboxCellElement(R.drawable.ic_menu_camera, "Val", "Hi !")}; 
    list.setAdapter(new inboxCellAdapter(getActivity(), R.layout.inbox_cell_layout, elts, (NavDrawer) getActivity())); 

    return myView; 
} 

Точно так же в вас адаптер:

public class inboxCellAdapter extends ArrayAdapter { 
    inboxCellElement[] elts; 
    NavDrawer navDrawer; 
    Activity activity; 

    // constructor 
    public inboxCellAdapter(Activity activity, int resource, Object[] objects, NavDrawer navDrawer) { 
     super(context, resource, objects); 
     this.activity = activity; 
     elts = (inboxCellElement[]) objects; 
     this.navDrawer = navDrawer; 
    } 

Следовательно getView будет как:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    MyHolder holder = null; 
    LayoutInflater inflater = activity.getLayoutInflater(); 
+0

Спасибо за помощь. Кажется, я понимаю, почему это происходит. Я думаю, что вы допустили ошибку, назвав «супер (контекст, ресурс, объекты)», поскольку мы удалили переменную «context». Однако я заменил его на 'activity', но у меня все еще есть сбой:' java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.widget.TextView.setText (java.lang.CharSequence)' на нулевом объекте ссылка на t2g.com.travel2gather.adapters.inboxCellAdapter.getView (inboxCellAdapter.java:42) '. Почему 'holder.getUpperText()' null? – Dliix

+0

EDIT: Я нашел ошибку: в держателе я использовал 'activity.findViewById()' вместо 'row.findViewById()' Спасибо за помощь! – Dliix

+0

Отлично! Счастливое кодирование. :) –