我在ListView
中有一个PopupWindow
。 PopupWindow
像这样初始化
window.setContentView(root);
window.setTouchable(true);
window.setFocusable(true);
window.setOutsideTouchable(true);
window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
然后是ListView
:
fileList = (ListView) root.findViewById(R.id.explorer_list);
fileList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
fileList.setSelector(android.R.drawable.screen_background_light_transparent);
fileList.setOnItemClickListener(this);
[...]
@Override
public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) {
selected = (File) fileList.getItemAtPosition(pos);
}
像这样,一切都正常,除了选择器在滚动ListView
之前不会显示在选择上(在滚动列表之前,没有任何直观显示为选中状态,尽管正确选择了项目)。
如果我将PopupWindow
设置为不可聚焦,则视觉选择正常工作(点击时可以直观地选择项目)但是onItemClick()
从未被调用,因此我无法获得所选项目。
ListView.getSelectedItem()
始终会返回null
,即使有所选项目也是如此。
有关如何解决这种情况的任何想法?提前谢谢。
答案 0 :(得分:2)
我最后使用自定义适配器存储所选值并从那里使用它来标记它:
public class FileExplorerAdapter extends ArrayAdapter<File> {
/** File names */
private List<File> values = new ArrayList<File>();
/** Currently selected position */
private int selected = -1;
public FileExplorerAdapter(Context context, List<File> values) {
super(context, R.layout.explorer_row, values);
this.values = values;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// I know that my layout is always a TextView
TextView row = (TextView) convertView;
if (row == null) {
row = (TextView) ViewHelper.inflateViewById(getContext(),
R.layout.explorer_row);
}
// More code...
// Set up the background for selected element
if (selected == position) {
row.setBackgroundColor(Color.LTGRAY);
// Override background selector
} else {
row.setBackgroundColor(Color.TRANSPARENT);
}
// More code...
return row;
}
/** This sets the selected position */
public void setSelected(int position) {
selected = position;
}
}
在为关联的OnItemClickListener
实现ListView
的类中,我在适配器中设置了当前选定的项目。
@Override
public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) {
FileExplorerAdapter fileadapter = (FileExplorerAdapter) fileList
.getAdapter();
fileadapter.setSelected(pos);
}
答案 1 :(得分:1)
//将listview focusable属性设置为false
机器人:可聚焦= “假”
答案 2 :(得分:1)
我有类似的问题,但在我的情况下PopupWindow.setFocusble(false)
是必需的(并且在我的情况下使用ListPopupWindow
不是解决方案,因为项目中的很多内容已经使用了基础PopupWindow
的功能包括扩展)。
如果处于相同情况的某人有基于错误讨论的某种解决方法here(第9条)
主要思想是ListView
的层次结构仍然接收触摸事件,因此我们可以手动触发onItemClick()
。
然而,这种方法与真正的ListView
触摸处理并不是100%完全相同(就像点击一行时没有选择的亮点一样),这对我来说非常好。
如果某人有更准确的解决方案,请分享。
所以,这里是完整的Adapter
代码,可以与ListView
PopupWindow
setFocusable(false)
内的private LayoutInflater mInflater;
private ListView mOwningListView;
public CustomAdapter(Context context, List<String> objects, ListView listView) {
super(context, android.R.layout.simple_list_item_1, objects);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mOwningListView = listView;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.font_pick_row, null);
}
// this is the key point of workaround
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*
* as every row is still receiving their touches
* we can use this to manually trigger onItemClick
* since it doesn't firing in popupWindow.setFocusable(false)
*/
mOwningListView.getOnItemClickListener().onItemClick(mOwningListView, v, position, getItemId(position));
}
});
//... other stuff
return convertView;
}
一起使用:
私有类CustomAdapter扩展了ArrayAdapter {
{{1}}
}
答案 3 :(得分:0)
使用此
fileList.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int pos, long arg3) {
selected = (File) fileList.getItemAtPosition(pos);
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
} );