ListView标记在Contextual ActionBar中onItemLongClick上的选定列表条目

时间:2014-03-10 10:03:39

标签: android listview android-listview contextual-action-bar

我已经在主要详细信息视图中实现了ListViewonItemClick()根据列表项调用新的Activity详细信息。

onItemLongClick调用ActionMode.Callback以提供多个列表项的选择。我已经解决了问题,以避免在onItemClick()中返回true时选择项目时调用onItemLongClick()

问题是在我点击一个项目并从活动中返回后,选择被显示/可视化。

请不要使用标准listSelector。我不确定这是否是正确的方法/解决方案。我尝试实现自定义listSelector,但它无法正常工作。

有什么建议吗?

ListView的XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ResultFragment" >

    <!-- standard list_selector_background -->
    <ListView
        android:id="@+id/fragment_ergebnis_listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:choiceMode="multipleChoice"
        android:divider="@color/gray_3"
        android:dividerHeight="1dp"
        android:listSelector="@android:drawable/list_selector_background"
        android:saveEnabled="true" >
    </ListView>
</LinearLayout>

片段代码

public class ResultPOJOFragment extends Fragment implements OnItemClickListener, OnItemLongClickListener {

    private Activity mActivity;
    private ActionModeCallback mActionModeCallback;
    private ActionMode mActionMode;
    private ListView mListView;
    private ResultAdapter mAdapter;
    private ResultDAO mResultDAO;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mActivity = getActivity();
        mResultDAO = new ResultDAO(mActivity);

        View fragmentView = inflater.inflate(R.layout.fragment_result, container, false);

        mAdapter = new ResultAdapter(mActivity);

        mListView = (ListView) fragmentView.findViewById(R.id.fragment_result_listView);
        mListView.setAdapter(mAdapter);
        mListView.setOnItemClickListener((OnItemClickListener) this);
        mListView.setOnItemLongClickListener((OnItemLongClickListener) this);

        mActionModeCallback = new ActionModeCallback();

        return fragmentView;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        ResultPOJO result = new ResultPOJO();
        result = mAdapter.getItem(position);

        /* Show activity with details */
        Intent resultDetailsIntent = new Intent(getActivity(), ResultPOJODetailsActivity.class);
        if (resultDetailsIntent != null) {
            resultDetailsIntent.putExtra(AppConstants.TAG_RESULT, result);
            startActivity(resultDetailsIntent);
        }
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        if (mActionMode != null) {
            /* true: to avoid calling onItemClick() */
            return true;
        } else {
            mActionMode = mActivity.startActionMode(mActionModeCallback);
            view.setSelected(true);
        }
        mActionMode = mActivity.startActionMode(new ActionModeCallback());

        return true;
    }   

    private void selectAllEntries() {
        for (int i = 0; i < mListView.getChildCount(); i++) {
            mListView.setItemChecked(i, true);
        }
    }

    private void deselectAllEntries() {
        for (int i = 0; i < mListView.getChildCount(); i++) {
            mListView.setItemChecked(i, false);
        }
    }

    private void refreshView() {
        mAdapter.notifyDataSetChanged();
    }

    private class ActionModeCallback implements ActionMode.Callback {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.result_fragment_cab, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
            case R.id.menu_item_cab_result_fragment_select_all:
                selectAllEntries();
                break;
            case R.id.menu_item_cab_result_fragment_deselect_all:
                deselectAllEntries();
                break;
            default:
                break;
            }
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            mActionMode = null;
        }
    }

}

0 个答案:

没有答案