Android 从CursorAdapter事件调用ListFragment中的自定义侦听器

Android 从CursorAdapter事件调用ListFragment中的自定义侦听器,android,events,listener,fragment,android-cursoradapter,Android,Events,Listener,Fragment,Android Cursoradapter,我有一个SherlockListFragment,其中有一个自定义列表项(复选框、图标和一些文本)-工作正常。该列表是从自定义游标适配器填充的,在这里我捕获了复选框事件(因此我也可以通过方向更改来保留数据,也可以工作)。当用户选中一个或多个复选框以显示actionbar项目时,我希望能够在ListFragment中引发事件 我已经在片段中实现了一个接口来接受事件,但无法在cursoradapter的复选框onClick listener中计算出引发片段事件的语法-事件触发正常,但a无法调用侦听器

我有一个SherlockListFragment,其中有一个自定义列表项(复选框、图标和一些文本)-工作正常。该列表是从自定义游标适配器填充的,在这里我捕获了复选框事件(因此我也可以通过方向更改来保留数据,也可以工作)。当用户选中一个或多个复选框以显示actionbar项目时,我希望能够在ListFragment中引发事件

我已经在片段中实现了一个接口来接受事件,但无法在cursoradapter的复选框onClick listener中计算出引发片段事件的语法-事件触发正常,但a无法调用侦听器,无法使用对象

片段:

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)...
           }   
        });
公共类ContactListFragment扩展SherlockListFragment实现
LoaderManager.LoaderCallbacks
{   
公共接口ListItemCheckedListener
{
public void OnListItemChecked(整数计数);
}
私人简易程序或适应程序;
公共ListItemCheckedListener checkListener;
public void setListItemListener(ListItemCheckedListener侦听器)
{
checkListener=listener;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
setListItemListener(新ListItemCheckedListener()
{   
@凌驾
public void OnListItemChecked(整数计数)
{
//打开/关闭操作栏项
//如果(计数>0)。。。
}   
});
游标适配器:

  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)); 
     }
  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)); 
     }
公共类ContactCursorAdapter扩展了SimpleCursorAdapter
{      
@凌驾
公共void bindView(视图、上下文上下文、光标)
{
复选框cBox=(复选框)view.findViewById(R.id.CheckBox);
final int pos=cursor.getPosition();
setOnClickListener(新的OnClickListener()
{
公共void onClick(视图)
{
复选框cb=(复选框)view.findViewById(R.id.CheckBox);
if(cb.isChecked())
{
itemChecked.set(位置,正确);
countChecked++;

.checkListener(countChecked);//好吧,在经历了好几个死胡同之后,我终于想出了一个解决方案。不知道这是一个好的解决方案还是一种“正确”的方法,但它确实有效

我只是简单地向CursorAdapter类添加了一个公共ListItemCheckedListener变量,在设置适配器后直接将我的ListFragment ListItemCheckedListener实例分配给它,然后可以在CursorAdapter中调用侦听器的本地实例,事件将传播到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());
  }
}
公共类ContactListFragment扩展SherlockListFragment实现
LoaderManager.LoaderCallbacks//,OnQueryTextListener
{
专用联系人游标适配器_适配器;//0)
{
如果(_mode==null)
{
_loaderManager=getLoaderManager();
ContactsActivity活动=(ContactsActivity)getActivity();
_模式=activity.startActionMode(\u actionModeCallback);
}
如果(_contactInvite!=null)
_contactInvite.setRecipCount(count);
}
其他的
{
如果(_mode!=null)
{
_mode.finish();
_模式=空;
}
}
}
});
_片段=这个;
setListProcessedListener(新的ContactListProcessedListener()
{
public void OnListProcessed(int contactMethod)
{
对于(int i=0;i<_adapter.itemChecked.size();i++)
_adapter.itemChecked.set(i,false);
_fragment.setListAdapter(_adapter);
_initLoader(0,null,_片段);
}
});
setEmptyText(this.getString(R.string.contacts_none));
设置选项菜单(真);
_适配器=新的ContactCursorAdapter(getActivity(),
R.layout.contact\u list\u项目,
无效的
新字符串[]{Contacts.\u ID,
Contacts.DISPLAY_NAME,
Contacts.CONTACT_STATUS},
联系人\u摘要\u字段,
0);
_adapter.checkListener=checkListener;
布尔值[]i选中=空;
如果(savedInstanceState!=null)
{
if(savedInstanceState.containsKey(“itemChecked”))
{
iChecked=savedInstanceState.getBooleanArray(“itemChecked”);
for(int i=0;i
游标适配器:

  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)); 
     }
  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)); 
     }
公共类ContactCursorAdapter扩展了SimpleCursorAdapter
{      

public ListItemCheckedListener checkListener;//好吧,在经历了好几个死胡同之后,我终于想出了一个解决方案。不知道这是一个好的解决方案还是“正确的”