Problems with ListView inside a PopupWindow

后端 未结 4 2143
温柔的废话
温柔的废话 2021-01-06 20:10

I have a ListView in a PopupWindow. The PopupWindow is initialized like this

    window.setContentView(root);
    wind         


        
4条回答
  •  忘掉有多难
    2021-01-06 20:35

    I had similar problem, but in my case PopupWindow.setFocusble(false) was required (and using ListPopupWindow was not a solution in my case as a lot of stuff in the project already used base PopupWindow's functionality including extending).

    If someone in the same situation there is a kind of workaround based on bug discusson here (post #9)

    The main idea is that ListView's hierarchy is still receives touch events so we can manually trigger onItemClick().

    However this approach is not 100% identical to real ListView's touch handling (like there is no glow of selection while tapping a row) this done pretty well for me for the moment.

    If someone has more precise solution of this problem, please share.

    So, here is complete Adapter's code which can be used with ListView inside PopupWindow which is setFocusable(false):

    private class CustomAdapter extends ArrayAdapter {

    private LayoutInflater mInflater;
    private ListView mOwningListView;
    
    public CustomAdapter(Context context, List 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;
    }
    

    }

提交回复
热议问题