2015-03-12 3 views
0

мне нужно поместить ListView в фрагменте, когда я делаю это приложение врезатьсяОшибка при размещении ListView в фрагменте

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 

Код:

public class FindPeopleFragment extends Fragment { 

    public FindPeopleFragment(){} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     //This layout contains your list view 
      View view = inflater.inflate(R.layout.tst, container, false); 

      //now you must initialize your list view 
      ListView listview =(ListView)view.findViewById(R.id.lvUsers); 

      //EDITED Code 
      ArrayList<User> arrayOfUsers = User.getUsers(); 
      CustomUsersAdapter adapter = new CustomUsersAdapter(getActivity(), arrayOfUsers); 


      listview.setAdapter(adapter); 

      //To have custom list view use this : you must define CustomeAdapter class 
      // listview.setadapter(new CustomeAdapter(getActivity())); 
      //getActivty is used instead of Context 
     return view; 
    } 
} 

public class CustomUsersAdapter extends ArrayAdapter<User> { 
    public CustomUsersAdapter(Context context, ArrayList<User> users) { 
     super(context, 0, users); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     User user = getItem(position);  
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_user, parent, false); 
     } 
     TextView tvName = (TextView) convertView.findViewById(R.id.tvName); 
     TextView tvHome = (TextView) convertView.findViewById(R.id.tvHometown); 
     tvName.setText(user.name); 
     tvHome.setText(user.hometown); 
     return convertView; 
    } 
} 

public class User { 
    public String name; 
    public String hometown; 

    public User(String name, String hometown) { 
     this.name = name; 
     this.hometown = hometown; 
    } 

    public static ArrayList<User> getUsers() { 
     ArrayList<User> users = new ArrayList<User>(); 
     users.add(new User("Harry", "San Diego")); 
     users.add(new User("Marla", "San Francisco")); 
     users.add(new User("Sarah", "San Marco")); 
     return users; 
    } 
} 

Если я пытаюсь использовать простой arrayadapter он работает нормально рабочий код

public class CommunityFragment extends Fragment { 

    public CommunityFragment(){} 

    @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
       // Inflate the layout for this fragment 
       //This layout contains your list view 
        View view = inflater.inflate(R.layout.tst, container, false); 

        //now you must initialize your list view 
        ListView listview =(ListView)view.findViewById(R.id.list); 

        //EDITED Code 
        String[] items = new String[] {"Item 1", "Item 2", "Item 3"}; 
        ArrayAdapter<String> adapter = 
        new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items); 

        listview.setAdapter(adapter); 

        //To have custom list view use this : you must define CustomeAdapter class 
        // listview.setadapter(new CustomeAdapter(getActivity())); 
        //getActivty is used instead of Context 
       return view; 
      } 
} 

ответ

0

причина в том, вы используете неправильный layoutResourceId в конструкторе, редактировал сотрудничество де как:

public class CustomUsersAdapter extends ArrayAdapter<User> { 

    private Context context; 
    private ArrayList<User> users; 
    private int layoutId; 

    public CustomUsersAdapter(Context context, int layoutResourceId, ArrayList<User> users) { 

     super(context, layoutResourceId, users); 

     this.context = context; 
     this.users = users; 
     this.layoutId = layoutResourceId; 
    } 

@Override 
public int getCount() 
{ 

    return users.size(); 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    User user = getItem(position);  
    if (convertView == null) { 

     //use 'context' here 
     convertView = LayoutInflater.from(context).inflate(layoutId, parent, false); 
    } 
    TextView tvName = (TextView) convertView.findViewById(R.id.tvName); 
    TextView tvHome = (TextView) convertView.findViewById(R.id.tvHometown); 
    tvName.setText(user.name); 
    tvHome.setText(user.hometown); 
    return convertView; 
} 

}

Кроме того, изменить свой адаптер вызов в FindPeopleFragment кодах, как:

ArrayList<User> arrayOfUsers = User.getUsers(); 
     CustomUsersAdapter adapter = new CustomUsersAdapter(getActivity(), R.layout.item_user, arrayOfUsers); 

Надеется, что это помощь!

+0

Попытка вызвать виртуальный метод 'void android.widget.ListView.setAdapter (android.widget.ListAdapter)' на ссылку нулевого объекта – user3060030

+0

Вы точно используете мои коды «CustomUsersAdapter»? скопируйте весь код, чтобы заменить свой старый «CustomUsersAdapter» – Xcihnegn

+0

супер удален. Неявный супер-конструктор ArrayAdapter () не определен. Должен явно ссылаться на другой конструктор – user3060030

0

проверить это:

 @Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    User user = getItem(position);  
    if (convertView == null) { 
    LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_user, parent, false); 
    } 
    TextView tvName = (TextView) convertView.findViewById(R.id.tvName); 
    TextView tvHome = (TextView) convertView.findViewById(R.id.tvHometown); 
    tvName.setText(user.name); 
    tvHome.setText(user.hometown); 
    return convertView; 
} 
+0

Привет получать контекст не может быть решена 'LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);' использовали вместо getActivity(), но те же результаты – user3060030

+0

Как объявить LayoutInflater В вашем CustomUserAdapter? – aldakur

0

Вам нужно добавить значение в список. Если вы хотите добавить значения непосредственно в список, попробуйте это.

arrayOfUsers.add(Variable/Value); 

InstEd из

ArrayList<User> arrayOfUsers = User.getUsers(); 

ИЛИ

Если вы хотите добавить значения других класса в соответствии с вашим кодом «Пользователь» это класс, так что вы должны добавить объект этого класса в список

User obj = new User(parameters if any); 
arrayOfUsers.add(obj); 
+0

мой пользовательский класс ls ниже открытого класса Пользователь { \t public String name; \t общественный String родной город; \t общественный пользователь (название строки, родной город String) { \t \t this.name = name; \t \t это.hometown = родной город; \t} \t общественные статические ArrayList getUsers() { \t \t ArrayList пользователи = новый ArrayList (); \t \t users.add (новый пользователь («Гарри», «Сан-Диего»)); \t \t пользователей.добавить (новый пользователь («Марла», «Сан-Франциско»)); \t \t users.add (новый пользователь («Сара», «Сан-Марко»)); \t \t возвращение пользователей; \t} } – user3060030

+0

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

+0

отредактировал мое сообщение сейчас вы можете посмотреть – user3060030

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