gpt4 book ai didi

android - 从 CursorAdapter 事件调用 ListFragment 中的自定义监听器

转载 作者:行者123 更新时间:2023-11-30 04:03:12 24 4
gpt4 key购买 nike

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

我已经在 fragment 中实现了一个接口(interface)来接受事件,但无法计算出在 cursoradapter 的复选框 onClick 监听器中引发 fragment 事件的语法 - 事件触发正常但无法调用监听器,可以'不确定要使用的对象。

fragment :

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)...
}
});

游标适配器:

  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 类添加了一个公共(public) ListItemCheckedListener 变量,在设置适配器后直接将我的 ListFragment ListItemCheckedListener 实例分配给它,然后可以在 CursorAdapter 中调用监听器的本地实例,事件将传播到 ListFragment .

列表 fragment :

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());
}
}

游标适配器:

  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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com