3

我有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

4 回答 4

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);
}
于 2012-10-04T09:33:55.537 回答
1

我有类似的问题,但在我的情况下PopupWindow.setFocusble(false)是必需的(在我的情况下 usingListPopupWindow不是解决方案,因为项目中的很多东西已经使用了 basePopupWindow的功能,包括扩展)。

如果有人处于同样的情况,这里有一种基于 bug 讨论的解决方法(post #9)

主要思想是,它ListView的层次结构仍然接收触摸事件,因此我们可以手动触发onItemClick()

然而,这种方法与 real 的触摸处理并非 100% 相同ListView(就像在点击一行时没有选择发光一样),这对我来说目前做得很好。

如果有人对此问题有更精确的解决方案,请分享。

所以,这里是完整Adapter的代码,可以在ListView里面PopupWindow使用setFocusable(false)

私有类 CustomAdapter 扩展 ArrayAdapter {

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;
}

}

于 2014-02-13T13:22:43.773 回答
1

//设置listview可聚焦属性为false

安卓:可聚焦=“假”

于 2013-03-13T14:15:21.447 回答
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

        }

    } );
于 2012-10-03T10:30:30.230 回答