android - PopupWindow 中 ListView 的问题

标签 android listview popupwindow

我在 PopupWindow 中有一个 ListViewPopupWindow 是这样初始化的

    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,即使存在选定项也是如此。

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

最佳答案

我最终使用自定义适配器来存储所选值并从那里使用它来标记它:

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

在为关联的 ListView 实现 OnItemClickListener 的类上,我在适配器中设置了当前选定的项目。

@Override
public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) {
    FileExplorerAdapter fileadapter = (FileExplorerAdapter) fileList
            .getAdapter();
    fileadapter.setSelected(pos);
}

关于android - PopupWindow 中 ListView 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12706520/

相关文章:

javascript - 如何在 Chrome 中禁用弹出窗口的位置栏和滚动条?

android - 从 Assets 文件夹升级 Android SQLite 数据库

android - 如何在自定义 ListView 上放置图像

android - 如何识别 ListViewItem 以更新单行

android - 在弹出窗口android中的EditText上添加TextChangedListener()

android - 如何从 Intent 调用创建自定义 PopupWindow?

java - Android:如何告诉我的 Activity 从我的服务启动新 Activity ?

android - 为什么 Google map 在 Android 上不显示具体点?

android - 在 DialogFragment 中单击 "Cancel"按钮后如何启动软键盘?

android - Android onResume后ListView为空