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?
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
Veuillez utiliser ListFragment
. Sinon, ça ne marchera pas.
EDIT 1: Alors vous aurez seulement besoin de setListAdapter()
et getListView()
.
Un ViewGroup parent dans lequel la vue du fragment doit être insérée,
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);
vous devez donner:
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
}
fragment intérieur.
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