长按鼠标时突出显示自定义列表视图项

我创build了一个自定义listview ,其左侧有一个ImageView ,右侧有一个TextView 。 并通过操作actionbar上下文菜单实现多选actionbar

问题是,当我长时间点击一个项目,它没有得到突出显示。

这里是我如何设置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<String> { 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

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:weightSum="1" android:orientation="horizontal" > <ImageView android:id="@+id/imageView_passwordIcon" android:layout_height="60dp" android:contentDescription="@string/imageView_passwordIcon" android:layout_width="60dp" /> <TextView android:id="@+id/textView_passwordTitle" android:layout_height="wrap_content" android:layout_width="0dp" android:paddingLeft="10dp" android:paddingTop="15dp" android:textSize="16sp" android:textColor="#000000" android:layout_weight="1" /> </LinearLayout> 

Solutions Collecting From Web of "长按鼠标时突出显示自定义列表视图项"

使用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<String>(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

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/share" android:title="share" android:icon="@android:drawable/ic_menu_share" android:showAsAction="always" /> </menu> 

快照

在这里输入图像说明

由于您怀疑它是否适用于自定义适配器

在这里输入图像说明

编辑:

在res / values-v11 / styles.xml下

 <resources> <style name="AppTheme" parent="android:Theme.Holo.Light"></style> <style name="activated" parent="AppTheme"> <item name="android:background">?android:attr/activatedBackgroundIndicator</item> </style> </resources> 

在根元素的自定义布局中添加

  style="@style/activated" 

在列表的布局文件(在顶层组件中,通常是LinearLayout或RelativeLayout)中设置:

机器人:背景= “机器人:ATTR / activatedBackgroundIndicator”

为了理解它究竟做了什么,请检查这个问题 。