wake-up-neo.com

Listenansicht in Fragment Android erstellen

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?

26
gamo

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

enter image description here

40
Raghunandan

Bitte verwenden Sie ListFragment. Sonst funktioniert es nicht.

EDIT 1: Dann brauchen Sie nur setListAdapter() und getListView().

4
Julisch

Die inflate () -Methode benötigt drei Parameter:

  1. Die ID einer Layout-XML-Datei (in R.layout),
  2. Eine übergeordnete Ansichtsgruppe, in die die Ansicht des Fragments eingefügt werden soll.

  3. 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);
2
IntelliJ Amiya

du musst geben:

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

inneres Fragment.

2
user3936680

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

0
VictorPurMar