سؤال

أرغب في تعيين مجموعة من البيانات "المعقدة" إلى ListView. في شكل مبسط للغاية ، سيبدو نموذج البيانات الخاص بي وكأنه شيء مثل هذا:

class ListPlacesValues {

  String idObject;
  String name;
  String city;
  String country;
  ArrayList<String> classification;
  double distance_quantity;
  DistanceUnit distance_unit;
            [...more stuff ...]
}

أعلم أنه يمكنني تحويل بياناتك المعقدة إلى قائمة تجزئة ثم فقط استخدم simpleadapter:

   SimpleAdapter mAdapter = new SimpleAdapter(
     this,
     hashList,
     R.layout.places_listitem,
     new String[] { "name", "city", "country"}, 
     new int[] { R.id.name, R.id.city, R.id.country}
   );  

ومع ذلك ، أفضل استخدام نموذج البيانات الخاص بي مباشرة ، لكن ليس لدي أي فكرة عن أين وكيف تبدأ ، بحيث يمكنني في النهاية أن أفعل شيئًا كهذا:

ArrayList<ListPlacesValues> values = getData();  
MyAdapter mAdapter = new MyAdapter(
          this,
          values,
          R.layout.places_listitem,
          ListPlacesValues { values.name, values.city, values.country}, 
          new int[] { R.id.name, R.id.city, R.id.country}
);  

المحلول: لقد وجدت عينة Android API (List14) ، والتي كانت مفيدة حقا.

هل كانت مفيدة؟

المحلول

يمكنك تمديد ArrayAdapter. إليك مثال رمز لك. في هذا المثال - SearchItem هو بعض Pojo المخصص. تحتاج بشكل أساسي إلى تجاوز طريقة GetView () لإنشاء صفك عن طريق تضخيم تخطيط الصف ثم ملء القيم بناءً على قائمة العناصر والموضع الحالي

class SearchItemsAdapter extends ArrayAdapter<SearchItem> {
Activity context;
List<SearchItem> items;
SearchHeader header;

@SuppressWarnings("unchecked")
public SearchItemsAdapter(final Activity context,
        final Map<SearchHeader, List<SearchItem>> result) {
    super(context, R.layout.item, (List) ((Object[]) result.values()
            .toArray())[0]);
    this.context = context;
    this.header = result.keySet().iterator().next();
    this.items = result.get(this.header);
}

@Override
public View getView(final int position, final View convertView,
        final ViewGroup parent) {
    final View view = this.context.getLayoutInflater().inflate(
            R.layout.item, null);
    final SearchItem item = this.items.get(position);
    ((TextView) view.findViewById(R.id.jt)).setText(item.jt);
    ((TextView) view.findViewById(R.id.dp)).setText(item.dp);
    ((TextView) view.findViewById(R.id.cn)).setText(item.cn);
    ((TextView) view.findViewById(R.id.loc)).setText(item.loc.name);
    final TextView body = ((TextView) view.findViewById(R.id.e));
    body.setText(item.e);
    body.setTag(item.src[0]);
    ((TextView) view.findViewById(R.id.src)).setText(item.src[1]);
    return view;
}
}

نصائح أخرى

هناك مأزق واحد مع ConvertView في العينة التي قمت بربطها

if(convertView != null){ //reuse
   convertView.setAnimation(null);
   convertView.setAnyCustomFieldsIdontWantFilledWithData(null);
}

تريد ضبط جميع الرسوم المتحركة أو الحقول غير المستخدمة على Null وإلا فقد تحتوي العناصر الخاصة بك على بيانات أو الرسوم المتحركة التي لا تريدها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top