我有一个SherlockListFragment,其中有一个自定义列表项(复选框,图标和一些文本)-工作正常。该列表是从自定义的CursorAdapter填充的,并且在这里捕获了Checkbox事件(因此,我也可以通过方向更改来保留数据-也可以使用)。我希望能够在用户选中一个或多个复选框以显示操作栏项目时在ListFragment中引发事件。
我已经在片段中实现了一个接口来接受事件,但是无法在cursoradapter的复选框onClick侦听器中计算出引发片段事件的语法-该事件会触发ok,但无法调用侦听器,无法暂停使用对象。
分段:
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));
}
我已经尝试过各种方式的“东西”,但似乎还不能完全正确。
请帮助...!
最佳答案
好吧,经过很多死胡同,我终于想出了一个解决方案。不知道这是一个很好的解决方案,还是解决问题的“正确”方法,但是它确实有效...
我只是在CursorAdapter类中添加了一个公共ListItemCheckedListener变量,在设置适配器后立即将我的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));
}
如果我自己说的话,这很简单,也很优雅。好吧...至少与我先前的一些失败尝试相比(!)。我仍然觉得这不是最好的方法,以某种方式感觉不对,但是,嘿,它确实有效。
如果有人有更好的方法,我希望听到他们的声音。同时,我希望这对其他人有帮助。
关于android - 从CursorAdapter事件中调用ListFragment中的自定义监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12161683/