Benutzerdefinierte Adapter getView () - Methode nicht aufgerufen
Hier ist der code, der das fragment in die ich mich festlegen eines benutzerdefinierten adapter in der Liste.
Gibt es keine Fehler, aber die ListView
leer ist. Ich habe umgesetzt getCount()
gibt direkt die Anzahl der Elemente in meine ArrayList. Ich sehe nicht ("Inside", "GetView")
im logcat
Fragment
public class ServiceCarListFragment extends Fragment {
private String url;
private ArrayList<CarDetail> carDetailList = new ArrayList<CarDetail>();
private CarListAdapter adapter;
private ListView mList;
@Override
public void onCreate(Bundle savedInstanceState) {
//TODO Auto-generated method stub
super.onCreate(savedInstanceState);
url = getActivity().getIntent().getStringExtra("url");
new DownloadCarDetail().execute(url);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//TODO Auto-generated method stub
View v = inflater.inflate(R.layout.fragment_service_car_list, container, false);
mList = (ListView) v.findViewById(R.id.list);
mList.setAdapter(adapter);
for (CarDetail car : carDetailList) {
//START LOADING IMAGES FOR EACH STUDENT
car.loadImage(adapter);
}
return v;
}
class DownloadCarDetail extends AsyncTask<String, String, ArrayList<CarDetail>> {
@Override
protected ArrayList<CarDetail> doInBackground(String... params) {
//TODO Auto-generated method stub
ArrayList<CarDetail> carDetailList = JsonParser.parseJson(params[0]);
return carDetailList;
}
@Override
protected void onPostExecute(ArrayList<CarDetail> carDetailList) {
//TODO Auto-generated method stub
ServiceCarListFragment.this.carDetailList = carDetailList;
Log.d("dccs", String.valueOf(ServiceCarListFragment.this.carDetailList.size()));
adapter = new CarListAdapter(getActivity(), ServiceCarListFragment.this.carDetailList);
Log.d("dccs", String.valueOf((adapter.getCount())));
}
}
}
CustomAdapter
public class CarListAdapter extends BaseAdapter {
private ArrayList<CarDetail> items = new ArrayList<CarDetail>();
private Context context;
public CarListAdapter(Context context, ArrayList<CarDetail> items) {
this.context = context;
this.items = items;
}
@Override
public int getCount() {
//TODO Auto-generated method stub
return items.size();
}
@Override
public Object getItem(int position) {
//TODO Auto-generated method stub
return items.get(position);
}
@Override
public long getItemId(int position) {
//TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//TODO Auto-generated method stub
Log.d("Inside", "GetView");
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
ViewHolder holder = null;
CarDetail car = items.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.car_list_row, null);
holder = new ViewHolder();
holder.tvCarName = (TextView) convertView.findViewById(R.id.tvCarName);
holder.tvDailyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue);
holder.tvWeeklyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue);
holder.imgCar = (ImageView) convertView.findViewById(R.id.imgCar);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvCarName.setText(car.getCarName());
if (car.getImage() != null) {
holder.imgCar.setImageBitmap(car.getImage());
} else {
//MY DEFAULT IMAGE
holder.imgCar.setImageResource(R.drawable.ic_action_call);
}
return convertView;
}
static class ViewHolder {
TextView tvCarName;
TextView tvDailyPriceValue;
TextView tvWeeklyPriceValue;
ImageView imgCar;
}
}
InformationsquelleAutor Ravi | 2013-05-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einzigen Gründe
getView
ist nicht genannt sind:getCount
0 zurück.setAdapter
auf dieListView
.ListView
's Sicht (oder dessen Behälter Sichtbarkeit) istGONE
. Dank @TaynãBonaldo für den wertvollen input.ListView
ist nicht an jedem Arbeitsbereich-layout. Das istmListView = new ListView(...)
ohnemyLayout.addView(mListView)
.In der
onPostExcute
, nachdem Sie eine neue Instanz erstellenCarListAdapter
ich schlage vor, Sie aktualisieren Sie die neue Instanz an IhreListView
. In der Tat müssen Sie wieder anrufenEdit:
setAdapter
sollte immer im ui-thread aufgerufen, um zu vermeiden, unerwarteten VerhaltensweisenEdit2:
Gleiches gilt für
RecyclerView
. Stellen Sie sicher, dassgetItemCount
ist gibt einen Wert zurück, reibe als0
(in der Regel die dataset-Größe)setLayoutManager
undsetAdapter
haben genannt zu werden, auf dieUI Thread
VISIBLE
zuerst von allen, niemand kann dir versichern, dass der AsyncTask Ausführung beendet ist, bevor oder nachdem die onCreateView genannt wird. Das ist das, was async bedeutet. Zwei, in der onPostExcute erstellen Sie eine neue CarListAdapter und Ihre ListView muss informiert werden, dass der adapter hat sich geändert
ich meine, durch die Einstellung der adapter in onPosExecute-Methode ist eine gute Möglichkeit für diese Art von situation oder gibt es eine bessere Architektur um solche Probleme zu vermeiden
können Sie formulieren letzter Kommentar?
vielen Dank für den input,
InformationsquelleAutor Blackbelt
müssen Sie überprüfen, ob die Liste Elemente hat, könnte ein Fehler beim hinzufügen von Elementen zur Liste .
Um zu überprüfen , verwenden Sie die Methode:
InformationsquelleAutor Luis Felipe
Ich vor ähnlichen problem. Hier ist eine einfache Arbeit um es zu lösen:
In Ihrem onCreateView, müssen Sie warten, bevor Sie die Ansicht wird erstellt. So ändern Sie Ihre Zeilen von:
ÄNDERN SIE DIE OBEN GENANNTEN ZWEI ZEILEN IN:
Hoffe, dies hilft anderen, die ausgeführt würde, in ähnliches problem
InformationsquelleAutor Gaurav Srivastava
Fehlen Ihnen die super-Klasse im Konstruktor. Siehe mein Beispiel unten:
Du hast Recht, ich hatte nicht entdeckt, dass er war nicht verbindlich, die neuen adapter an den listview in post ausführen. Blackbelt ftw
können Sie näher erläutern, was getan werden sollte, um dies zu vermeiden, race-Bedingung und erklären .. ich bin neu auf android-Entwicklung..es wäre gr8, wenn Sie erklären könnte ..danke
setAdapter bindet einen adapter mit einem listview (sagt die listview, wo die Daten, die es zeigt, ist aus). In onCreate() Sie sind ab der aSyncTask, laden Sie die Daten dann in onCreateView setzen Sie den adapter. Allerdings, wenn es länger dauert das erstellen der adapter (in der aSyncTask), als es zum erreichen der onCreateView () - Funktion, die listview setzen Sie den adapter, bevor es gefüllt ist mit den KFZ-Daten ich.e es ist leer. Die einfache Lösung ist es, nur binden Sie den adapter, NACHDEM Sie WISSEN, Sie haben erstellt es erfolgreich. ich.e als blackbelt gesagt, nur binden Sie den adapter in onPostExecute() 🙂
Eine weitere option ist das erstellen der leeren Adapter in der onCreate und binden es in die onCreateView, in onPostExecute die Aktualisierung der vorhandenen Adapter mit den empfangenen Daten und ruft notifyDataSetChanged, die den adapter aktualisieren Sie die Liste mit den neuen Informationen. Wenn Sie es implementieren diese Weise können Sie auch die Daten zu aktualisieren, wenn Sie später wollen, ohne neue adapter.
InformationsquelleAutor o0rebelious0o
Was Sie getan haben, ist
Den adapter
in Ihrem Fragment
Ich hoffe, Sie werden mit
FragmentActivity
Müssen Sie rufen Sie
wo
YOUR_ACTIVITY_CONTEXT
werden IhreFragmentActivity
InformationsquelleAutor Ameer Moaaviah
Ich hatte das gleiche problem. Und nach dem Versuch, alle oben genannten Tipps meiner getView wurde noch nicht genannt. Also habe ich versucht zu entfernen, die ScrollView, dass ich außerhalb der ListView. Dann wird die getView gut funktioniert. Nur für fügen eine weitere Möglichkeit. Ich Hoffe, dass jemand helfen.
InformationsquelleAutor DaniloLM