Als Titel möchte ich eine Listenansicht mit benutzerdefinierten Zeilen in Fragment erstellen. Mein Code unten.
Fragmentklasse
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;
}
}
Adapterklasse
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;
}
}
Aber wenn ich die App starte, wird nichts angezeigt. Könnte mir jemand sagen, was hier falsch ist und wie kann ich das beheben?
Ich denke, Ihre App stürzt ab, weil NullPointerException
.
Ändere das
ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact);
zu
ListView lv = (ListView)rootView.findViewById(R.id.lv_contact);
vorausgesetzt, listview gehört zum Fragment-Layout.
Der Rest des Codes sieht gut aus
Bearbeiten:
Nun, da Sie sagten, dass es nicht funktioniert, habe ich es selbst versucht
Bitte verwenden Sie ListFragment
. Sonst funktioniert es nicht.
EDIT 1: Dann brauchen Sie nur setListAdapter()
und getListView()
.
Eine übergeordnete Ansichtsgruppe, in die die Ansicht des Fragments eingefügt werden soll.
Ein dritter boolescher Wert, der angibt, ob die View-Ansicht des Fragments als aufgeblasen aus der Layout-XML-Datei in die übergeordnete ViewGroup eingefügt werden soll.
In diesem Fall übergeben wir false, da die View an die .__ angehängt wird. Eltern-ViewGroup an anderer Stelle, durch einen Teil des Android-Codes, den wir aufrufen (in mit anderen Worten, hinter unserem Rücken). Wenn Sie als letzten Parameter false übergeben, __. Zum Aufblasen () wird die übergeordnete ViewGroup weiterhin für das Layout .__ verwendet. Berechnungen der aufgeblasenen Ansicht, daher können Sie null nicht als übergeordnetes Element übergeben ViewGroup.
View rootView = inflater.inflate(R.layout.fragment_photos, container, false);
Sie müssen also hier rootView
aufrufen
ListView lv = (ListView)rootView.findViewById(R.id.lv_contact);
du musst geben:
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
}
inneres Fragment.
Stattdessen:
public class PhotosFragment extends Fragment
Sie können verwenden:
public class PhotosFragment extends ListFragment
Es ändern sich die Methoden
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ArrayList<ListviewContactItem> listContact = GetlistContact();
setAdapter(new ListviewContactAdapter(getActivity(), listContact));
}
onActivityCreated ist ungültig und Sie müssen keine Ansicht wie in onCreateView zurückgeben
Sie können ein Beispiel hier sehen