我创建了一个自定义ImageView ,右侧是TextView 。 并使用操作actionbar上下文菜单实现多选Listview 。
问题是,当我长时间点击某个项目时,它没有突出显示。
以下是我在ListFragment设置listview的ListFragment
PasswordsFragment.java
package mohd.itcs.safewallet; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AbsListView.MultiChoiceModeListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; public class PasswordsFragment extends ListFragment { private String titles[] = { "item1", "item2", "item3" }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new CustomPasswordsList(getActivity(), titles)); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); /* * Setup Multiple Selection Mode */ getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); getListView().setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView listview, View item, int position, long id) { getListView().setItemChecked(position, true); return true; } }); getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() { @Override public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) { // TODO Auto-generated method stub return false; } /* * Inflate Actionbar Menu for Passwords Multiple Selection */ @Override public boolean onCreateActionMode(ActionMode arg0, Menu menu) { getActivity().getMenuInflater().inflate( R.menu.passwords_context_menu, menu); return true; } @Override public void onDestroyActionMode(ActionMode arg0) { } @Override public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) { return false; } @Override public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean arg3) { /* * Change Title bar to number of selection */ int checkedItems = getListView().getCheckedItemCount(); actionMode.setTitle(String.valueOf(checkedItems) + " Selected"); } }); } }
CustomPasswordsList.java
package mohd.itcs.safewallet; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; public class CustomPasswordsList extends ArrayAdapter { private final Context context; private final String values[]; public CustomPasswordsList(Context context, String[] values) { super(context, R.layout.password_list_item, values); this.context = context; this.values = values; } public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View rowView = inflater.inflate(R.layout.password_list_item, parent, false); TextView passwordTitle = (TextView) rowView.findViewById(R.id.textView_passwordTitle); ImageView passwordIcon = (ImageView) rowView.findViewById(R.id.imageView_passwordIcon); passwordTitle.setText(values[position]); passwordIcon.setImageResource(R.drawable.facebook); return rowView; } }
passwords_list_item
使用getActivity()就足够了
setListAdapter(new CustomPasswordsList(getActivity(), titles));
您需要覆盖onItemCheckedStateChanged
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { final int checkedCount = getListView().getCheckedItemCount(); // get checked items count
从样品中抽取@
android-sdk-linux/samples/android-17/ApiDemos/src/com/example/android/apis/view/List16
示例:根据您的需要修改以下内容
public class MainActivity extends ListActivity { String[] GENRES = new String[] { "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama", "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ListView lv = getListView(); lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); lv.setMultiChoiceModeListener(new ModeCallback()); setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_activated_1, GENRES)); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); getActionBar().setSubtitle("Long press to start selection"); } private class ModeCallback implements ListView.MultiChoiceModeListener { public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.list_select_menu, menu); mode.setTitle("Select Items"); return true; } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return true; } public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.share: Toast.makeText(MainActivity.this, "Shared " + getListView().getCheckedItemCount() + " items", Toast.LENGTH_SHORT).show(); mode.finish(); break; default: Toast.makeText(MainActivity.this, "Clicked " + item.getTitle(), Toast.LENGTH_SHORT).show(); break; } return true; } public void onDestroyActionMode(ActionMode mode) { } public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { final int checkedCount = getListView().getCheckedItemCount(); switch (checkedCount) { case 0: mode.setSubtitle(null); break; case 1: mode.setSubtitle("One item selected"); break; default: mode.setSubtitle("" + checkedCount + " items selected"); break; } } } }
list_select_menu.xml
快照
因为您怀疑它是否适用于自定义适配器
编辑:
在res / values-v11 / styles.xml下
在根元素添加的自定义布局中
style="@style/activated"
在列表行的布局文件中设置(在顶级组件中,通常是LinearLayout或RelativeLayout):
机器人:背景= “机器人:ATTR / activatedBackgroundIndicator”
要了解它的确切function,请查看其他问题 。