Android:在ListFragment中未调用MultiChoiceModeListener

时间:2012-05-15 00:59:34

标签: android android-fragments baseadapter android-listfragment

对于基于ICS的应用程序,我创建了一个ListFragment,后者又使用BaseAdapter实现。我已启用MultiChoiceModeListener()以显示上下文操作栏。但这里的问题是每当我检查CheckBox或长按Label(两者都在BaseAdapter中的View集中)时,根本不会调用MultiChoiceModeListener实现。任何形式的帮助都非常受欢迎,因为我在尝试了许多选项后完全陷入困境!!!

public class ActivitiesFragment extends ListFragment {

public void onActivityCreated(Bundle savedInstanceState) {
    Log.d(TAG, "Entering onActivityCreated()");
    super.onActivityCreated(savedInstanceState);

    this.setAdapter();
    this.setHasOptionsMenu(true);
}

private void setAdapter() {

    HashMap<String, String> activities = DBAdapter
            .getInstance(this.context).getActivities();
    setListAdapter(new ActivitiesList(Util.sortByComparator(activities)));

    ListView listView = getListView();
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    listView.setMultiChoiceModeListener(new MultiSelectionListener());

}

private class ActivitiesList extends BaseAdapter {
    // Other functions declared
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ActivityView view = null;
        String activityName = this.activityList.get(position);
        String colour = this.activities.get(activityName);

        if (convertView == null) {
            // ActivityView is a LinearLayout with CheckBox, Label and a Button
            view = new ActivityView(context, activityName, colour);

        } else {
            view = (ActivityView) convertView;
            view.setActivityName(activityName);
        }
        return view;
    }
}

private class MultiSelectionListener implements MultiChoiceModeListener {
    // implementation
}

}

4 个答案:

答案 0 :(得分:0)

您需要使用ActionMode.CallbackYou should read through these docs,它实际上非常简单易用。

答案 1 :(得分:0)

您应该检查列表中是否有任何onLongClickListener。 我和你有同样的问题,我意识到我的ViewHolder调用了长按,因此从未调用过MultiChoiceListener。

答案 2 :(得分:0)

我遇到了类似的问题,即使ListView中列出的项目有CheckBox,检查它们也不会调用MultiChoiceModeListener。通过一些研究并查看名为CustomChoiceList的示例(您可以从File - &gt; Import Sample在Android Studio中导入),我发现绑定View s ListView必须实现接口Checkable。直接引用CustomChoiceList示例

  

当ListView设置了choiceMode时,它将允许用户“选择”一个或多个项目。该框架提供默认列表项布局,显示标准单选按钮或单行文本旁边的复选框:

     

android.R.layout.simple_list_item_single_choice和android.R.layout.simple_list_item_multiple_choice。

     

在某些情况下,您可能希望自定义此布局。执行此操作时,根视图必须实现Checkable接口。

我知道docs可能更清楚一点需要实现Checkable接口。虽然在最后一段中说它

  

当用户选中该复选框时,您可以调用上下文操作   通过将相应的列表项设置为已检查状态的模式   setItemChecked()。

您不必担心ActionMode.Callback,因为它由MultipleChoiceModeListener

处理

答案 3 :(得分:-3)

您的MultiChoiceModeListener实现中可能存在错误。它对我来说很好。