Подтвердить что ты не робот

Создание списка в фрагменте андроида

В качестве заголовка я хочу создать listview с настраиваемой строкой в ​​Fragment. Мой код ниже.

Класс фрагмента

public class PhotosFragment extends Fragment{

public PhotosFragment(){}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_photos, container, false);

    ArrayList<ListviewContactItem> listContact = GetlistContact();
    ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact);
    lv.setAdapter(new ListviewContactAdapter(getActivity(), listContact));

    return rootView;
}

private ArrayList<ListviewContactItem> GetlistContact(){
    ArrayList<ListviewContactItem> contactlist = new ArrayList<ListviewContactItem>();

    ListviewContactItem contact = new ListviewContactItem();

    contact.SetName("Topher");
    contact.SetPhone("01213113568");
    contactlist.add(contact);

    contact = new ListviewContactItem();
    contact.SetName("Jean");
    contact.SetPhone("01213869102");
    contactlist.add(contact);

    contact = new ListviewContactItem();
    contact.SetName("Andrew");
    contact.SetPhone("01213123985");
    contactlist.add(contact);

    return contactlist; 
    }   
}

Класс адаптера

public class ListviewContactAdapter extends BaseAdapter{
private static ArrayList<ListviewContactItem> listContact;

private LayoutInflater mInflater;

public ListviewContactAdapter(Context photosFragment, ArrayList<ListviewContactItem> results){
    listContact = results;
    mInflater = LayoutInflater.from(photosFragment);
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return listContact.size();
}

@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return listContact.get(arg0);
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}


public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder;
    if(convertView == null){
        convertView = mInflater.inflate(R.layout.contact_item, null);
        holder = new ViewHolder();
        holder.txtname = (TextView) convertView.findViewById(R.id.lv_contact_item_name);          
        holder.txtphone = (TextView) convertView.findViewById(R.id.lv_contact_item_phone);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txtname.setText(listContact.get(position).GetName());
    holder.txtphone.setText(listContact.get(position).GetPhone());

    return convertView;
}

static class ViewHolder{
    TextView txtname, txtphone;
}
}

Но когда я запускаю приложение, которое ничего не отображает. Может ли кто-нибудь сказать мне, что здесь не так, и как я могу это исправить?

4b9b3361

Ответ 1

Я думаю, ваше приложение вылетает из-за NullPointerException.

Измените это

ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact);

к

ListView lv = (ListView)rootView.findViewById(R.id.lv_contact);

Предполагая, что listview относится к компоновке фрагментов.

Остальная часть кода выглядит хорошо

Edit:

Ну, так как ты сказал, что не работает, я сам это пробовал

enter image description here

Ответ 2

Используйте ListFragment. В противном случае это не сработает.

РЕДАКТИРОВАТЬ 1: Тогда вам понадобятся только setListAdapter() и getListView().

Ответ 3

Метод inflate() принимает три параметра:

  • Идентификатор XML файла макета (внутри R.layout),
  • Родительская группа ViewGroup, в которую должен быть вставлен фрагмент View,

  • Третий булев, указывающий, будет ли фрагмент View завышенным от XML файл макета должен быть вставлен в родительскую ViewGroup.

В этом случае мы передаем false, потому что View будет прикреплен к родительской ViewGroup в другом месте, по некоторым из кода Android, который мы вызываем (в другими словами, за нашими спинами). Когда вы передаете false как последний параметр для inflate() родительская ViewGroup все еще используется для компоновки расчеты завышенного представления, поэтому вы не можете передавать null в качестве родительского ViewGroup.

 View rootView = inflater.inflate(R.layout.fragment_photos, container, false);

Итак, вам нужно позвонить rootView здесь

ListView lv = (ListView)rootView.findViewById(R.id.lv_contact);

Ответ 4

вам нужно дать:

public void onActivityCreated(Bundle savedInstanceState)    
{
  super.onActivityCreated(savedInstanceState);
}

внутри фрагмента.

Ответ 5

Вместо

public class PhotosFragment extends Fragment

Вы можете использовать:

public class PhotosFragment extends ListFragment

Измените методы

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ArrayList<ListviewContactItem> listContact = GetlistContact();
        setAdapter(new ListviewContactAdapter(getActivity(), listContact));
    }

onActivityCreated недействителен, и вам не нужно было возвращать представление, например, в onCreateView

Здесь вы можете увидеть пример