3

私は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選択したアイテムがある場合でも、どちらの場合も常に戻ります。

この状況を解決する方法について何かアイデアはありますか?前もって感謝します。

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

//リストビューのフォーカス可能なプロパティをfalseに設定します

android:focusable = "false"

于 2013-03-13T14:15:21.447 に答える
1

私も同様の問題を抱えていましたが、私の場合PopupWindow.setFocusble(false)は必要でした(そしてListPopupWindow、プロジェクトの多くのものがPopupWindow拡張を含むベースの機能をすでに使用していたため、使用は私の場合の解決策ではありませんでした)。

同じ状況にある誰かがここでのバグディスカッションに基づいた一種の回避策があります(投稿#9)

主なアイデアは、ListViewの階層は引き続きタッチイベントを受信するため、手動でトリガーできるということonItemClick()です。

ただし、このアプローチは、実際ListViewのタッチ処理と100%同一ではありません(行をタップしているときに選択の輝きがないなど)。これは、今のところ私にとってはかなりうまくいきました。

誰かがこの問題のより正確な解決策を持っているなら、共有してください。

だから、ここにある内部でAdapter使用できる完全なのコードがあります:ListViewPopupWindowsetFocusable(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 に答える
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 に答える