2016-03-24 16 views
-1

So im neu in Android Programmierung Ich versuche, eine benutzerdefinierte Listview zu machen. Ich folge einem Tutorial auf YouTube (https://www.youtube.com/watch?v=gAIB4fTm2BA), aber ich kann es nicht an einem Fragment arbeiten.Benutzerdefinierte Liste in Fragmente arbeitet gewohnt

public class DriverFragment extends Fragment implements GeneralFragment { 

ListView listView; 
public DriverFragment() { 

    // Required empty public constructor 
} 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view; 
    view = inflater.inflate(R.layout.fragment_driver, container, false); 
    listView = (ListView) view.findViewById(R.id.driverList); 
    DriverAdapter driverAdapter = new DriverAdapter(getActivity().getApplicationContext(),R.layout.driver_listview); 
    listView.setAdapter(driverAdapter); 
    Driver a = new Driver("John Smith","[email protected]","123"); 

    driverAdapter.add(a); 

    return view; 
} 

Treiber Adapter:

public class DriverAdapter extends ArrayAdapter { 
ArrayList list = new ArrayList(); 

public DriverAdapter(Context context, int resource) { 
    super(context, resource); 
} 


static class Holder{ 
    TextView NAME; 
    TextView EMAIL; 
    TextView PHONE; 
} 
public void add(Driver driver) { 
    list.add(driver); 
    super.add(driver); 

} 

@Override 
public Object getItem(int position) { 
    return this.list.get(position); 
} 

public int getCount(){ 
    return this.list.size(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row; 
    row = convertView; 
    Holder holder; 
    if(convertView == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = layoutInflater.inflate(R.layout.driver_listview, parent, false); 
     holder = new Holder(); 
     holder.NAME = (TextView) row.findViewById(R.id.driverName); 
     holder.EMAIL = (TextView) row.findViewById(R.id.driverMail); 
     holder.PHONE = (TextView) row.findViewById(R.id.driverPhone); 
     row.setTag(holder); 
    }else { 
     holder = (Holder) row.getTag(); 

    } 
    Driver driver = (Driver)getItem(position); 
    holder.NAME.setText(driver.getName()); 
    holder.EMAIL.setText(driver.getMail()); 
    holder.PHONE.setText(driver.getPhone()); 

    return row; 

} 

Die XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="DriverName" 
    android:id="@+id/driverName" 
    android:padding="10dp" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="DriverMail" 
    android:id="@+id/driverMail" 
    android:layout_gravity="center_horizontal" 
    android:padding="10dp" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="DriverPhone" 
    android:id="@+id/driverPhone" 
    android:padding="10dp" /> 

Antwort

0

Meine letzte Antwort nicht zu helfen schien, ich etwas schnell zusammen setzen.

würde ich dringend raten mehr zu diesem Thema lesen up seit Listen und Adapter sind ein integraler Bestandteil der Android-Entwicklung und mit einem Verständnis davon, wie es funktioniert, ist wirklich hilfreich.

public class Driver { 

    private String name; 
    private String email; 
    private String phone; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 
} 

Fragment:

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

     View view = inflater.inflate(R.layout.fragment, container, false); 
     ListView listView = (ListView) view.findViewById(R.id.listView); 

     Driver a = new Driver(); 
     a.setName("Name"); 
     a.setEmail("Email"); 
     a.setPhone("Phone"); 

     ArrayList<Driver> drivers = new ArrayList<>(); 
     drivers.add(a); 

     DriverAdapter driverAdapter = new DriverAdapter(getActivity().getApplicationContext(),R.layout.driver_listview, drivers); 
     listView.setAdapter(driverAdapter); 

     return view; 

    } 

Adapter

public class DriverAdapter extends ArrayAdapter<Driver> { 


    public DriverAdapter(Context context, int resource, List<Driver> objects) { 
     super(context, resource, objects); 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row; 
     row = convertView; 
     Holder holder; 
     if(convertView == null) { 
      LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = layoutInflater.inflate(R.layout.driver_listview, parent, false); 
      holder = new Holder(); 
      holder.name = (TextView) row.findViewById(R.id.driverName); 
      holder.email = (TextView) row.findViewById(R.id.driverMail); 
      holder.phone = (TextView) row.findViewById(R.id.driverPhone); 
      row.setTag(holder); 
     }else { 
      holder = (Holder) row.getTag(); 

     } 
     Driver driver = getItem(position); 
     holder.name.setText(driver.getName()); 
     holder.email.setText(driver.getEmail()); 
     holder.phone.setText(driver.getPhone()); 

     return row; 
    } 

    public class Holder { 
     protected TextView name; 
     protected TextView email; 
     protected TextView phone; 
    } 
} 

Adapter XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/driverName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:text="DriverName" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/black" /> 

    <TextView 
     android:id="@+id/driverMail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:padding="10dp" 
     android:text="DriverMail" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/black" /> 

    <TextView 
     android:id="@+id/driverPhone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:text="DriverPhone" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/black" /> 

</LinearLayout> 

Wenn dies nicht hilft, gibt es ein Problem mit dem Fragment zeigt auf dem Gerät. Wie ich das selbst getestet habe und es auf dem Bildschirm korrekt anzeigt.

0

Sieht aus wie Sie Ihren Adapter an die Listview setzen, bevor Sie etwas hinzufügen, was in Ordnung ist Sie müssen jedoch adapter.notifyDataSetChanged() aufrufen, um die Liste mit den neuen Daten zu aktualisieren.

Obwohl, würde ich vorschlagen, zu ändern, wie Sie Ihren Adapter erstellen. Jedes Mal, wenn ich irgendeine Art von Adapter verwendet habe, erstelle ich meine Datenliste vorher und gebe sie über den Konstruktor weiter. Dann setze es auf meine Listenansicht. So wie:

View view; 
    view = inflater.inflate(R.layout.fragment_driver, container, false); 
    listView = (ListView) view.findViewById(R.id.driverList); 

    Driver a = new Driver("John Smith","[email protected]","123"); 
    ArrayList<Driver> drivers = new ArrayList(); 
    drivers.add(a); 

    DriverAdapter driverAdapter = new DriverAdapter(getActivity().getApplicationContext(),R.layout.driver_listview, drivers); 
    listView.setAdapter(driverAdapter); 

Dies ist ein nur grobes Beispiel dafür, was ich tun würde, ich Sie raten würde, um dieses auf einige Beispiele von Google zu lesen. Lesen Sie auch RecyclerViews anstelle von ListViews, wenn möglich.

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html

https://www.bignerdranch.com/blog/recyclerview-part-1-fundamentals-for-listview-experts/

+0

Ich habe versucht, die notifyDataSetChanged() -Methode und auch ich habe den Adapter nach dem Hinzufügen des Objekts hinzugefügt, aber es immer noch nicht angezeigt. –

1

vor allem, wenn Sie wirklich etwas gutes Tutorial sollen überprüfen, wie

Mit Listen im Android (Listview) - Tutorial http://www.vogella.com/tutorials/AndroidListView/article.html

Unter der Annahme, alles ist in Ordnung Mit deinem Fragment und seiner Sichtbarkeit können wir uns auf deinen Adapter konzentrieren. Da Ihr DriverAdapter über eine eigene ArrayList von Daten verfügt, macht es keinen Sinn, super.add() in seiner add() Methode aufzurufen. Sie rufen nur notifyDataSetChanged() auf, um dem Adapter mitzuteilen, dass der Inhalt auf der Benutzeroberfläche aktualisiert werden soll. Versuchen Sie so etwas wie dieses ..

public class DriverAdapter extends BaseAdapter { 
ArrayList<Driver> data = new ArrayList(); 

public void add(Driver driver) { 
    data.add(driver); 
    notifyDataSetChanged(); 
} 

public void addAll(List<Driver> drivers) { 
    data.addAll(drivers); 
    notifyDataSetChanged(); 
} 

@Override 
public Driver getItem(int position) { 
    return data.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

public int getCount() { 
    return data.size(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Holder holder; 

    if (convertView == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.item_driver_row, parent, false); 
     holder = new Holder(); 
     holder.name = (TextView) convertView.findViewById(R.id.driverName); 
     holder.email = (TextView) convertView.findViewById(R.id.driverMail); 
     holder.phone = (TextView) convertView.findViewById(R.id.driverPhone); 
    } else { 
     holder = (Holder) convertView.getTag(); 

    } 

    Driver driver = getItem(position); 
    holder.name.setText(driver.getName()); 
    holder.email.setText(driver.getEmail()); 
    holder.phone.setText(driver.getPhone()); 
    convertView.setTag(holder); 

    return convertView; 
} 

static class Holder { 
    TextView name; 
    TextView email; 
    TextView phone; 
} 

}

+0

Ich habe versucht, die notifyDataSetChanged() -Methode hinzuzufügen, aber es funktioniert immer noch nicht –