2013-01-23 2 views
3

두 개 이상의 listview에 대해 동일한 어댑터를 사용하는 것이 좋은지 알고 싶습니다.Android : 재사용 가능한 어댑터 및 다른 onclicklistener

내 코드에는 많은 listviews가 있고 각각에는 imageview 및 textview와 같은 UL 구성 요소가 포함되어 있으므로 각각에 대해`MyAdapter extends BaseAdapter`를 사용하는 것이 좋습니다. 또는 각각을 위해 어댑터를 만드는 것이 더 낫습니다.

하나의 어댑터를 사용해야하는 경우 각 listview에 대해 button, imageview 및 textview에 대한 서로 다른 onclick 작업을 처리하는 방법은 무엇입니까? 어쨌든 각 목록보기 용 어댑터의 새로운 인스턴스를 생성해야하므로

class MyAdapter extends BaseAdapter { 

    public MyAdapter() { 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 
+0

예, 동일한 UI 구성 요소를 포함하는 동일한 어댑터를 여러 번 사용할 수 있으며 직접 클릭하여 onclick을 관리 할 수 ​​있습니다. 버튼, 이미지 뷰 등의 다른 onclick 액션에 대해 원하는 기능을 기반으로 스스로 생각할 필요가 있습니다. – GrIsHu

+0

onclick은 getview 내부에 있어야하므로 어떻게 다른 클릭을 할 수 있습니까? –

답변

0

그것은, 어떤 차이가 자원이 많다는 어느쪽으로 할 것입니다. 그러나 두 개의 서로 다른 어댑터의 기능을 하나로 통합하려고하면 너무 복잡합니다. 나는 디자인의 명확성을 위해 두 개의 다른 어댑터를 만들 것이라고 말할 것이다. 디버깅과 관련하여 장기적으로 당신의 삶이 훨씬 쉬워 질 것입니다.

목록이 동일한 기능을 수행하고 각각에 대해 동일한 어댑터를 사용해야하는 경우 각 목록의 동작이 다른 경우에주의하십시오.

0

어댑터 또는 클래스의 인스턴스를 다시 사용하는 것에 대해 이야기하고 있습니까? 클래스는 광고 infinatum 재사용 할 수 있습니다.

그러나 인스턴스는 재사용하지 않는 것이 안전합니다. 그 이유는 이전 AdapterView에서 충돌 또는 아티팩트가있을 가능성이 높기 때문입니다. 어댑터 생성은 단순하지 않으므로 안전하지 않고 각 AdapterView에 대해 새로운 어댑터를 만드는 것이 어떻습니까?

+0

나는 클래스를 재사용하는 것에 대해 이야기하고있다. 또한 각리스트 뷰에 대해 새로운 어댑터를 만드는 것이 더 쉽지만 표준 방법을 아는 것이 중요하다. –

0

이것은 종종 제가 자주 고심하는 좋은 질문입니다. 그렇게 불필요한 어댑터 코드를 다른 작업에만 복제하는 것은 불필요한 것 같습니다. 나는 여전히 디자인 문제로이 질문에 어려움을 겪고 있으므로 내 대답은 이에 대한 답을 제공하기위한 것이 아닙니다. 그러나 어댑터를 재사용하는 것과 관련하여 질문하는 부분에 대해 목록/어댑터를 다시 사용하려면 다음을 수행하십시오.

각 유형의 목록에 대해 식별자로 작동하는 전역 상수 값을 만듭니다 그 종류의 목록. 내가 어댑터의 새 인스턴스를 만들 때 나는 어댑터에 RequestID가/listTypeId을 제공 :

내 어댑터에서
//first i create the constants somewhere globally 
TYPE_ID_A = 0; 
TYPE_ID_B = 1; 
TYPE_ID_C = 2 

//then i feed them to my adapter and set the clickListener on my list 
mList.setAdapter(new MyListAdapter(mContext, listData, TYPE_ID_A)); 
mList.setOnItemClickListener(this); 

나는이 ID를 반환하는 멤버 변수로이 유형 ID를 설정하고 더 후 공용 함수를 만듭니다

public class MyListAdapter extends ArrayAdapter<JSONArray> { 

    private final Context mContext; 
    private final JSONArray mItems; 
    private final int mListType; 

    //assign the values in the constructor of the adapter 
    public SearchListAdapter(Context context, JSONArray items, int listType) { 
     super(context, R.layout.item_filter_list); 
     mItems = items; 
     mContext = context; 
     mListType = listType; 
    } 

    //function to return the list id 
    public int getListType(){ 
     return mListType; 
    } 
} 

마지막으로, 내 온 클릭 리스너 안에 내가 다음에 더 무엇을 식별하기 위해 전역 상수를 비교하려면 listTypeId를 반환하는 내 어댑터 내부에서이 함수를 호출 :

@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
    MyListAdapter adapter = (MyListAdapter) adapterView.getAdapter(); 
    int listType = adapter.getListType(); //get the listTypeId now 

    //now see which list type was clicked: 
    switch(listType){ 
     case(TYPE_ID_A): 
      //to action for list A 
      break; 
     case(TYPE_ID_B): 
      //to action for list B 
      break; 
    } 
} 

이것은 나를 위해 일하지만 나는 그 위대한 생각을하지 않는다. 하나가 다른 적절한 디자인 패턴이 있다면 알려 주시기 바랍니다!