2012-08-28 3 views
1

사용자 정의 목록 항목 (확인란, 아이콘 및 일부 텍스트)이있는 SherlockListFragment가 있습니다. 제대로 작동합니다. 이 목록은 사용자 정의 CursorAdapter에서 채워지며 여기에는 Checkbox 이벤트가 트랩되어 있으므로 방향 변경을 통해 데이터를 보존 할 수도 있습니다. 사용자가 하나 이상의 체크 박스를 검사하여 액션 바 항목을 표시 할 때 ListFragment에서 이벤트를 발생시킬 수 있기를 원합니다.CursorAdapter의 ListFragment에서 사용자 지정 리스너 호출 이벤트

이벤트를 승인하기 위해 조각에 인터페이스를 구현했으나 cursoradapter의 체크 박스 onClick listener에서 프래그먼트 이벤트를 발생시키는 구문을 해결할 수 없습니다 - 이벤트는 정상적으로 트리거되지만 리스너는 호출 할 수 없습니다. 사용할 물건을 슬퍼하지 마라.

조각 :

public class ContactListFragment extends SherlockListFragment implements 
     LoaderManager.LoaderCallbacks<Cursor> 
{ 
    public interface ListItemCheckedListener 
    { 
    public void OnListItemChecked(int count); 
    } 

    private SimpleCursorAdapter mAdapter; 
    public ListItemCheckedListener checkListener; 

    public void setListItemListener(ListItemCheckedListener listener) 
    { 
    checkListener = listener; 
    } 

<snip> 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) 
    { 
    super.onActivityCreated(savedInstanceState); 

<snip> 

    setListItemListener(new ListItemCheckedListener() 
     { 
      @Override 
      public void OnListItemChecked(int count) 
      { 
       // Turn on/off Action Bar Item 
       //if (count > 0)... 
      } 
     }); 

CursorAdapter : 나는 "무엇인가"에 대한 개체의 모든 방법을 시도했지만 꽤 잘 하나를 얻을 수없는 것

public class ContactCursorAdapter extends SimpleCursorAdapter 
    {  
<snip> 
    @Override 
    public void bindView(View view, Context context, Cursor cursor) 
    { 
<snip> 
     CheckBox cBox = (CheckBox)view.findViewById(R.id.checkBox); 

     final int pos = cursor.getPosition(); 

     cBox.setOnClickListener(new OnClickListener() 
      { 
       public void onClick(View view) 
       { 
       CheckBox cb = (CheckBox)view.findViewById(R.id.checkBox); 

       if (cb.isChecked()) 
       { 
        itemChecked.set(pos, true); 
        countChecked++; 
        <something>.checkListener(countChecked); // <----- Umm? 
       } 

       else if (!cb.isChecked()) 
       { 
        itemChecked.set(pos, false); 
        countChecked--; 
        <something>.checkListener(countChecked); // <----- ditto 
       } 
       } 
      });    
     cBox.setChecked(itemChecked.get(pos)); 
    } 

.

도움말 ... 제발 ...!

답변

1

꽤 많은 막 다른 길 끝에 마침내 해결 방법이 생겼습니다. 그것이 좋은 해결책인지 또는 그것이 "올바른"방법인지는 모르겠지만 작동하는지 ...

공용 ListItemCheckedListener 변수를 CursorAdapter 클래스에 추가하고 ListFragment ListItemCheckedListener 인스턴스를 어댑터를 설정 한 직후에, CursorAdapter 내에서 리스너의 로컬 인스턴스를 호출하면 이벤트가 ListFragment로 전달됩니다.

ListFragment :

public class ContactListFragment extends SherlockListFragment implements 
      LoaderManager.LoaderCallbacks<Cursor>// , OnQueryTextListener 
{ 

    private ContactCursorAdapter   _adapter; // <----- HERE 

    <snip> 

@Override 
public void onActivityCreated(Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 

    setListItemListener(new ContactListItemCheckedListener() 
    { 
     @Override 
     public void OnListItemChecked(int count) 
     { 
      if (count > 0) 
      { 
       if (_mode == null) 
       { 
       _loaderManager = getLoaderManager(); 

       ContactsActivity activity = (ContactsActivity)getActivity(); 

       _mode = activity.startActionMode(_actionModeCallback); 
       } 

       if (_contactInvite != null) 
       _contactInvite.setRecipCount(count); 
      } 

      else 
      { 
       if (_mode != null) 
       { 
       _mode.finish(); 

       _mode = null; 
       } 
      } 
     } 
    }); 

    _fragment = this; 

    setListProcessedListener(new ContactListProcessedListener() 
    { 
     public void OnListProcessed(int contactMethod) 
     { 
      for (int i = 0; i < _adapter.itemChecked.size(); i++) 
       _adapter.itemChecked.set(i, false); 

      _fragment.setListAdapter(_adapter); 

      _loaderManager.initLoader(0, null, _fragment); 
     } 
    }); 

    setEmptyText(this.getString(R.string.contacts_none)); 

    setHasOptionsMenu(true); 

    _adapter = new ContactCursorAdapter(getActivity(), 
             R.layout.contact_list_item, 
             null, 
             new String[] { Contacts._ID, 
               Contacts.DISPLAY_NAME, 
               Contacts.CONTACT_STATUS }, 
             CONTACT_SUMMARY_FIELDS, 
             0); 

    _adapter.checkListener = checkListener; 

    boolean[] iChecked = null; 
    if (savedInstanceState != null) 
    { 
    if (savedInstanceState.containsKey("itemChecked")) 
    { 
     iChecked = savedInstanceState.getBooleanArray("itemChecked"); 

     for (int i = 0; i < iChecked.length; i++) 
      _adapter.itemChecked.add(i, iChecked[i]); 

     _adapter.countChecked = savedInstanceState.getInt("countChecked"); 

     checkListener.OnListItemChecked(_adapter.countChecked); 
    } 
    } 

    try 
    { 
    setListAdapter(_adapter); 

    setListShown(false); 

    // Prepare the loader. Either re-connect with an existing one, 
    // or start a new one. 
    getLoaderManager().initLoader(0, null, this); 

    ((ContactsActivity)getActivity()).setSearchTextListener(new ContactsActivity.SearchTextListener() 
     { 
      @Override 
      public void OnSearchTextChange(String text) 
      { 
       onQueryTextChange(text); 
      } 
     }); 
    } 

    catch (Exception e) 
    { 
    Singletons.Logger().error(TAG + ".onActivityCreated() failed", 
           e.getMessage()); 
    } 
} 

CursorAdapter :

public class ContactCursorAdapter extends SimpleCursorAdapter 
    {  

    <snip> 

    public ListItemCheckedListener checkListener; // <----- HERE 

    <snip> 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) 
    { 

<snip> 

     cBox.setOnClickListener(new OnClickListener() 
      { 
       public void onClick(View view) 
       { 
       CheckBox cb = (CheckBox)view.findViewById(R.id.checkBox); 

       if (cb.isChecked()) 
       { 
        itemChecked.set(pos, true); 
        countChecked++; 
        checkListener.OnListItemChecked(countChecked); // <----- HERE 
       } 

       else if (!cb.isChecked()) 
       { 
        itemChecked.set(pos, false); 
        countChecked--; 
        checkListener.OnListItemChecked(countChecked); // <----- HERE 
       } 
       } 
      }); 

     cBox.setChecked(itemChecked.get(pos)); 
    } 

아주 간단하고 내가 그렇게 자신을 말할 경우, 상당히 우아한. 글쎄 ... 적어도 내 이전에 실패한 시도 (!)와 비교하면된다. 나는 여전히 그것을하는 가장 좋은 방법이 아니라는 느낌을 받는다. 어떻게 든 그냥 잘못 느껴지지만, 헤이 ... 작동한다.

누구든지이 일을하는 더 좋은 방법이 있다면, 나는 그 이야기를 듣고 싶습니다. 그 사이에, 나는 이것이 다른 누군가를 돕기를 바랍니다.

+0

마이크, 체크 박스 수신기를 우리와 공유해 주셔서 감사합니다. 나는 이것을 위해 일할 수 없습니다. ContactListFragment 클래스의 전체 목록을 게시 하시겠습니까? 이것은 제가 실종 된 것을 보여줍니다. 미리 감사드립니다. – moberme

+0

@moberme 전체 onActivityCreated() 메서드를 포함하도록 코드를 업데이트했으며, mAdapter 변수를 클래스 수준 범위 (_adapter)로 옮겼습니다. 전체 클래스는 500 라인을 넘어서는 길이며 다양한 관련성이없는 코드가 있으므로 도움이 될지 의심 스럽습니다. – Mike