PopupWindow中ListView的问题

时间:2012-10-03 10:24:40

标签: android listview popupwindow

我在ListView中有一个PopupWindowPopupWindow像这样初始化

    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,即使有所选项目也是如此。

有关如何解决这种情况的任何想法?提前谢谢。

4 个答案:

答案 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

        }

    } );