我已经在主要详细信息视图中实现了ListView
:onItemClick()
根据列表项调用新的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;
}
}
}