2013-01-20 2 views
5

배열 어댑터에서 조각 및 목록보기를 사용하려고하는데 배열 어댑터의 onClickListener에서 내 메서드를 호출하는 데 문제가 있습니다.비즈니스 로직이 위의 조각 또는 활동에 있어야합니까?

패턴을 올바르게 이해하면 조각이 자급 자족해야하므로 비즈니스 논리를 그 안에 넣어야합니다. 하지만 배열 어댑터에서 호출 할 수는 없습니다. 내가 주된 활동에 넣으면 나는 그것을 부를 수있다. 그러나 그것은 내가 다른 활동에서 그 단편을 사용하는 것을 배제하고 패러다임을 깨뜨리지 않는다?

비즈니스 로직이 잘못된 위치에 있습니까? 아니면 올바르게 부르고 있지 않습니까?

여기 내 ArrayAdapter입니다.

public class RecipientsListAdapter extends ArrayAdapter<Recipient>{ 

    Context context; 
    int layoutResourceId; 
    Recipient data[] = null; 

    public RecipientsListAdapter(Context context, int layoutResourceId, Recipient[] data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     RecipientHolder holder = null; 

     final boolean isLastRow = (position == data.length-1); 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new RecipientHolder(); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (RecipientHolder)row.getTag(); 
     } 

     final Recipient recipient = data[position]; 
     holder.txtTitle.setText(recipient.displayName); 
     holder.imgIcon.setImageResource(recipient.icon); 

     row.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ((MainActivity)context).onChildItemSelected(position); 
       if(isLastRow){ 
       //((RecipientsFragment).getContext()).launchContactPicker(); 


        ((MainActivity)context)).launchContactPicker(); 


       } 
       else{ 
        Toast.makeText(getContext(), recipient.displayName, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

     return row; 
    } 

답변

2

Adapter 모든 클릭 리스너를 호출하고 getView() 방법에 클릭 리스너를 부착하지 않아야 무엇을해서는 안됩니다. 대신 ListFragment을 사용해야하며 조각에 onListItemClick()을 간단히 덮어 쓰기 만하면됩니다. 그런 다음 리스너 인터페이스 콜백을 호출하여 해당 이벤트를 Activity으로 전달하거나 Fragment 내에서 직접 처리 할 수 ​​있습니다. SDK 11이 출시되기 전에 Android 버전을 지원하려면 support library을 사용할 수도 있습니다.

2

사용자가 지정한 컨텍스트를 업 캐스팅하지 마십시오. 이것은 생성자에서 어댑터를 암시하지 않고 해당 특정 활동에 암시 적으로 연결합니다 서명.

강력한 커플 링이 있으므로 생성자에 매개 변수로 RecipientsFragment을 추가하거나 Joe가 제안한 내용을 수행하여 Fragment 자체의 ListView에 onListItemClick을 사용하십시오. 그러나 어댑터에서 OnClickListener을 사용하는 데 합법적 인 용도 (예 : 여러 클릭 할 수있는 항목)가있는 경우가 많으므로 그 경우에는 단편 자체를 전달해야합니다.

두 개 이상의 다른 것들이 해당 어댑터 (예 : 3 개의 서로 다른 단편)를 사용한다는 것을 알게되면 콜백 인터페이스를 도입하고 단편을 구현하고 해당 인터페이스를 생성자에 대한 매개 변수로 전달하게하십시오.

관련 문제