web-dev-qa-db-fra.com

Créer listview dans fragment android

En tant que titre, je souhaite créer une liste avec une ligne personnalisée dans Fragment. Mon code ci-dessous.

Classe de 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; 
    }   
}

Classe d'adaptateur

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;
}
}

Mais quand je lance l'application qui n'affiche rien. Quelqu'un pourrait-il me dire ce qui ne va pas ici et comment puis-je le réparer?

26
gamo

Je suppose que votre application se bloque à cause de NullPointerException.

Change ça

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

à

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

en supposant que listview appartient à la disposition des fragments.

Le reste du code a l'air bien

Modifier:

Eh bien, puisque vous avez dit que cela ne fonctionnait pas, j'ai essayé moi-même

enter image description here

40
Raghunandan

Veuillez utiliser ListFragment. Sinon, ça ne marchera pas.

EDIT 1: Alors vous aurez seulement besoin de setListAdapter() et getListView().

4
Julisch

La méthode inflate () prend trois paramètres:

  1. L'id d'un fichier XML de mise en page (dans R.layout),
  2. Un ViewGroup parent dans lequel la vue du fragment doit être insérée,

  3. Un troisième booléen indiquant si la vue du fragment telle que gonflée à partir de Le fichier XML de présentation doit être insérée dans le ViewGroup parent.

Dans ce cas, nous passons false car la vue sera attachée au fichier parent ViewGroup ailleurs, par certains des codes Android que nous appelons (en Autrement dit, derrière notre dos). Lorsque vous passez false en dernier paramètre pour gonfler (), le ViewGroup parent est toujours utilisé pour la mise en page calculs de la vue gonflée, vous ne pouvez donc pas passer à null en tant que parent ViewGroup.

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

Donc, vous devez appeler rootView ici 

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

vous devez donner:

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

fragment intérieur.

2
user3936680

Au lieu:

public class PhotosFragment extends Fragment

Vous pouvez utiliser:

public class PhotosFragment extends ListFragment

Ça change les méthodes

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

onActivityCreated est nul et vous n'avez pas besoin de retourner une vue comme dans onCreateView

Vous pouvez voir un exemple ici

0
VictorPurMar