2013-12-16 1 views
2

나는 서로 크게 다른 많은 맞춤 개체를 가지고 있습니다. 이러한 개체는 다른 목록에 저장되며 다른 ListView에 표시됩니다. 이러한 ListView의 디자인으로 인해, 나는 자신의 커스텀 ArrayAdapter를 생성해야한다. 문제는 ListView 디자인은 목록의 개체와 관계없이 모든 ListView에 대해 동일하게 간주됩니다.Android : 다른 맞춤 개체 용 맞춤 ArrayAdapter (들)

이렇게하기 위해 모든 유형의 객체에 대해 ArrayAdapter를 만들었습니다. 예 : 커스텀 객체 인 coA를 위해 나는 ArrayAdapter coAAdapter를 만들었고, 커스텀 객체 인 coB를 위해서 나는 ArrayAdapter coBAdapter를 만들었다. 제외하고 이러한 어댑터 사이에 차이가 옆에 있기 때문에 이것은 나에게 매우 불필요한 보이는 ArrayAdapter와 종류의 사용자 정의 확장 어댑터 및 생성자 : 클래스 CoA를위한

어댑터 : 클래스 COB에 대한

public class CoAAdapter extends ArrayAdapter<CoA> { 
    public CoAAdapter (Context context, int resource, List<CoA> objects) {...} 
} 

어댑터 :

public class CoBAdapter extends ArrayAdapter<CoB> { 
    public CoBAdapter (Context context, int resource, List<CoB> objects) {...} 
} 

이 사용하는 가정하는 방법을 사용자 정의 ArrayAdapters, 아니면 모든 사용자 정의 개체에 대한 하나의 사용자 정의 ArrayAdapter와있는 같이 많은 간단한이 디자인을 만들 수있는 방법은 무엇입니까?

일반 사용자 정의 어댑터를 작성하거나 내 사용자 정의 오브젝트에 대한 공통 기본 클래스를 작성하여 상속을 사용하는 것과 같은 몇 가지 다른 솔루션에 대해 생각해 보았습니다. 그러나 일부 연구 후에는 이들 중 아무 것도 좋은 접근 방법이 아닙니다.

+0

의 모든의 ListView 당신의 행에 대해 동일한 레이아웃을 사용하십니까? – Apoorv

+0

모든 개체에 적합한 하나의 인터페이스를 만들고 필요한 모든 데이터를 그릴 수 있습니다. 그런 다음 해당 인터페이스의 어댑터를 작성할 수 있습니다. – Gooziec

+0

@Apoorv 예, 다소 차이가 있습니다. 나는 텍스트 색상 만 다른 목록 항목에 대한 몇 가지 레이아웃을 가지고 있지만, 그렇지 않은 경우에는 동일합니다. – HigiPha

답변

3

이 같은 어댑터를 정의 할 수 있습니다 :

public class MyArrayAdapter<T> extends ArrayAdapter<T> 
{ 
     HashMap<T, Integer> mIdMap = new HashMap<T, Integer>(); 

     public MyArrayAdapter(Context context, int textViewResourceId, List<T> objects) { 
     super(context, textViewResourceId, objects); 
     for (int i = 0; i < objects.size(); ++i) { 
      mIdMap.put(objects.get(i), i); 
     } 
     } 
    } 
+0

이 접근 방식은 내 마음을 넘어 섰지 만, 이것이 유형 안전하지 않기 때문에 위대한 해결책이 아님을 읽었습니까? – HigiPha

+0

그것은 유형 안전합니다. 왜 그렇지 않다고 생각하니? – Salil

+0

죄송합니다. 비슷한 질문으로 읽었습니다. 답변 중 하나를 잘못 해석했습니다. 나는 그 때 그것을 시도 할 것이다! – HigiPha

0

아마 BaseAdapter을 사용하고 싶을 것입니다. 그리고 해당 어댑터의 getView()에서 객체의 instanceof을 확인한 다음 적절하게 수행하십시오.

0
public interace SomeInterface 
{ 
    public String getString(); 
} 

public class classA implements SomeInterface 
{ 
    ... 

    @Override 
    public String getString() 
    { 
     return "blabla"; 
    } 
} 

public class classB implements SomeInterface 
{ 
    ... 

    @Override 
    public String getString() 
    { 
     return "whatever"; 
    } 
} 

public class InterfaceAdapter extends ArrayAdapter<SomeInterface> 
{ 
    public InterfaceAdapter (Context context, int resource, List<SomeInterface> objects) {...} 
}