2016-03-21 5 views
0

Was ist die beste Vorgehensweise, um einen Array-Adapter zu haben, der mehrere Objekttypen verarbeiten kann?ArrayAdapter für mehr als eine Klassenart

Adapter extends ArrayAdapter<?>

Ich habe 3 Arten von Klassen A.class, B.class, C.class und die Logik in Adapter ist identisch.

public class Adapter extends ArrayAdapter<A,B,C ?> { 

private int viewResourceId; 
private LayoutInflater inflater; 
private ArrayList<A,B,C ?> list; 

public Adapter(Context context, int viewResourceId, ArrayList<A,B,C ?> list) { 
    super(context, viewResourceId, list); 
    this.viewResourceId = viewResourceId; 
    this.list = list; 

    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

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

@Override 
public View getView(int arg0, View arg1, ViewGroup arg2) { 
    Holder holder; 

    if (arg1 == null || arg1.getTag() == null) { 
     holder = new Holder(); 

     arg1 = inflater.inflate(viewResourceId, null); 
     arg1.setTag(holder); 

     holder.textView = (TextView) arg1.findViewById(R.id.textView); 
    } else { 
     holder = (Holder) arg1.getTag(); 
    } 

    // A,B,C 
    holder.textView.setText(list.get(arg0).getName()); 

    return arg1; 
} 

static class Holder { 
    TextView textView; 
} 

}

Für jetzt habe ich drei verschiedene Adapter für jeden Klassentyp und legen Sie es

listView.setAdapter(new Adapter(this, R.layout.row_item, list<A,B,C ?>))

+4

Öffentlichkeit Klasse Adapter erweitert ArrayAdapter ; private ArrayList Liste; if (T instanceof A) halter.textView (((ArrayList ) Liste) .get (arg0) .getName()) – Wukash

+0

@Wukash if (T instanceof A) Dies wird Kompilierzeit Fehler geben - "Ausdruck erwartet" –

+0

Ja sollte sein, wenn (list instanceof ArrayList )) ... – Wukash

Antwort

2

Sie zur Liste kann es Generika machen -

public class Adapter<T> extends ArrayAdapter<T> { 

    private int viewResourceId; 
    private LayoutInflater inflater; 
    private ArrayList<T> list; 

    public Adapter(Context context, int viewResourceId, ArrayList<T> list) { 
     super(context, viewResourceId, list); 
     this.viewResourceId = viewResourceId; 
     this.list = list; 

     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

    @Override 
    public View getView(int arg0, View arg1, ViewGroup arg2) { 
     Holder holder; 

     if (arg1 == null || arg1.getTag() == null) { 
      holder = new Holder(); 

      arg1 = inflater.inflate(viewResourceId, null); 
      arg1.setTag(holder); 

      holder.textView = (TextView) arg1.findViewById(R.id.txtUse); 
     } else { 
      holder = (Holder) arg1.getTag(); 
     } 

     // A,B,C 
     if(list.get(arg0) instanceof A){ 
      //User A's property to set TextView text 
     } else if(list.get(arg0) instanceof B){ 
      //User B's property to set TextView text 
     } else if(list.get(arg0) instanceof C){ 
      //User C's property to set TextView text 
     } 

     return arg1; 
    } 

    static class Holder { 
     TextView textView; 
    } 
}