我一直在努力解决这个问题很长一段时间,虽然我很确定这个问题已经解决了一千多次。我已经在SO和其他地方查看了其他各种类似的问题,但我无法解决这个问题。
核心问题是:
如果我的列表项中有可点击的组件,如果我长按一行(用于显示上下文操作栏),则不会显示该行的选择器。但是长时间点击是被触发的 - 没有任何视觉反馈表明长时间点击正在发生。
请注意,仅当行布局包含可单击的项目时才会出现此问题。以下是我已经尝试过的一系列快速清单:
drawSelectorOnTop
设置为true
(在XML和getListView()
choiceMode
设置为singleChoice
(在XML和getListView()
listSelector
设置为各种值 - 透明,白色等。(在XML和getListView()
中都尝试了这一点。LinearLayout
将longClickable
设置为true
。如果没有这个,长按就不会被注册。无论我做什么,长按列表项都不显示任何类型的选择器,虽然长按确实发生了,我确实收到了OnItemLongClick
回调。
有关导致此问题的任何线索?
重现问题的代码:
<?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:baselineAligned="true"
android:longClickable="true"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/btnGo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="@android:drawable/btn_star_big_on" />
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/configurations" >
</ListView>
</LinearLayout>
public class MainActivity extends ListActivity {
private ListView mListView;
private Context mContext;
private RowAdapter mAdapter;
private static final String LOG_TAG = "ListViewLongClick";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mListView = getListView();
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
mListView.setSelector(android.R.color.white);
mListView.setDrawSelectorOnTop(true);
mAdapter = new RowAdapter(mContext, R.layout.list_item, R.id.tvTitle,
getResources().getStringArray(R.array.configurations));
mListView.setAdapter(mAdapter);
mListView.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(mContext, "Long-click on item " + position,
Toast.LENGTH_SHORT).show();
return true;
}
});
}
static class RowAdapter extends ArrayAdapter<String> {
private int mResource;
private String[] configs;
public RowAdapter(Context context, int resource,
int textViewResourceId, String[] objects) {
super(context, resource, textViewResourceId, objects);
this.mResource = resource;
this.configs = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View viewToReturn = convertView;
if (convertView == null) {
viewToReturn = LayoutInflater.from(getContext()).inflate(
this.mResource, null, false);
}
TextView label = (TextView) viewToReturn.findViewById(R.id.tvTitle);
label.setText(configs[position]);
Button btn = (Button) viewToReturn.findViewById(R.id.btnGo);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d(LOG_TAG, "Aha! You clicked on the star button");
}
});
return viewToReturn;
}
}
}
<resources>
<string name="app_name">ListViewLongClick</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string-array name="configurations">
<item >Phone-Port</item>
<item >Phone-Land</item>
<item >Tab7-Port</item>
<item >Tab7-Land</item>
<item >Tab10-Port</item>
<item >Tab10-Land</item>
</string-array>
</resources>
答案 0 :(得分:4)
您应该像这样更改list_items:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="true"
android:longClickable="true"
android:orientation="horizontal"
android:background="@android:drawable/list_selector_background"
>
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/btnGo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="@android:drawable/btn_star_big_on" />
</LinearLayout>
我在android:background="@android:drawable/list_selector_background"
中添加了LinearLayout
。
希望这可以帮助你=)
答案 1 :(得分:0)
在res / menu文件夹中创建一个ContextMenu并覆盖onCreateContextMenu方法:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
menu.setHeaderTitle("Please select:");
inflater.inflate(R.menu.context_menu, menu);
}
重写onContextItemSelected方法。并且不要忘记在onCreate方法中添加以下行:
registerForContextMenu(getListView());
有关详细信息,请参阅以下link。