在嵌套列表视图中使用弹出窗口

Posted

技术标签:

【中文标题】在嵌套列表视图中使用弹出窗口【英文标题】:Use Popup Window in nested listviews 【发布时间】:2016-01-12 06:38:42 【问题描述】:

我是 android 新手,在我的应用程序中,我正在尝试添加一个功能,当用户单击布局格式为按钮的布局时会出现一个弹出窗口。

问题在于,在我想实现这一点的活动中,我列出了列表视图,每个视图都适应了自己独特的定制基础适配器。

我觉得这对我的应用来说是一个非常低效和繁重的设计,但到目前为止我想不出更好的方法来实现我的目标。我所有的其他功能都运行良好(因为它们对“点击”的响应非常好)。我还通过记录popup.isShown()检查了弹出窗口的可见性,它告诉我点击layout时这是真的。

我现在可以猜到的一件事是将根视图(活动视图)传递到我制作弹出窗口的位置,但由于多种原因,我认为这不是一个好主意,我相信其中一个可能会损坏/操纵数据,因为我已经通过参数将大量信息传递给我的“内部”适配器。

那么,任何人都可以为我的应用提供更好、更轻巧的结构设计以及解决弹出窗口问题的解决方案吗?提前致谢。

简化:

-我的应用有一个名为“CoffeeSelectActivity”的活动,其中显示了所选咖啡馆提供的饮品列表(显示在 ID 为“drinks_list”的列表视图中

-这个列表视图被item_cafe_menu 夸大了。为了做到这一点,我创建了一个名为DrinksItem的自定义baseadatper

-在item_cafe_menu 中,我有一个列表视图,显示正在选择的杯子以及当用户单击drinks_list 的列表项时出现的客户希望添加的特定选项(额外的镜头等)。为此,我在 DrinksItem 中使用了一个名为 Dropdown 的私有类

-在Dropdown 类中,我为item_cafe_menu_dropdown.xml 中的dropdown_options_list 列表视图实现了另一个定制的baseadapter,名为DropdownOptionsItem。这会使用选项名称后跟选项填充所选饮料的可用选项,例如,选择大而不是常规尺寸,dropdown_option_name 文本视图将显示Sizedropdown_option_selected_option 文本视图将显示@987654336 @。

-为了实现这个功能,我想在用户点击dropdown_option_selection_layout时显示一个弹出窗口。所以我在DropdownOptionsItem 中为这个布局添加了一个onclick 事件,当前在我的设备上没有显示任何内容,但Log 显示trueisShowing()

-我知道这是一个非常讨厌的代码,所以我想了解如何改进代码并使这个弹出窗口出现在屏幕上。

代码:

CoffeeSelectActivity.java

//code snipplet that sets adapter to my list
drinksListAdapter = new DrinksItem(this, menuList);
drinksList.setAdapter(drinksListAdapter);

activity_coffee_select.xml

<ListView
    android:layout_
    android:layout_
    android:id="@id/drinks_list">
</ListView>

DrinksItem.java

package com.morning_coffee.morningmorning;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * Created by user on 15. 10. 11..
 */
public class DrinksItem extends BaseAdapter 

    private Context context;
    private ArrayList<DrinkInfo> drinkInfos;

    private static class ViewHolder 
        public LinearLayout layout, dropdown;
        public TextView name, price;
    

    public DrinksItem(Context context, ArrayList<DrinkInfo> drinkInfos) 
        super();
        this.context = context;
        this.drinkInfos = drinkInfos;
    

    @Override
    public int getCount() 
        return drinkInfos.size();
    

    @Override
    public Object getItem(int position) 
    return drinkInfos.get(position).getDrinkName();


@Override
public long getItemId(int position) 
    return position;


@Override
public View getView(final int position, View convertView, ViewGroup parent) 
    ViewHolder holder;

    //reuse views
    if(convertView == null) 
        convertView = LayoutInflater.from(context).inflate(R.layout.item_cafe_menu, null);

        holder = new ViewHolder();
        holder.layout = (LinearLayout) convertView.findViewById(R.id.menu_layout);
        holder.name = (TextView) convertView.findViewById(R.id.menu_name);
        holder.price = (TextView) convertView.findViewById(R.id.menu_price);

        setOnClickEvents(convertView, holder, position);

        convertView.setTag(holder);
    

    //fill data
    holder = (ViewHolder) convertView.getTag();

    holder.name.setText(drinkInfos.get(position).getDrinkName());
    holder.price.setText(drinkInfos.get(position).getDrinkPrice());

    return convertView;


private void setOnClickEvents(final View view, final ViewHolder viewHolder, final int position) 
    viewHolder.layout.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            ViewGroup group = (ViewGroup)view.findViewById(R.id.menu_dropdown_layout);

            if(viewHolder.dropdown == null) 
                //show dropdown menu
                viewHolder.dropdown = new Dropdown(context, drinkInfos, group, viewHolder.dropdown, position);

                //set bottom margin
                ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) viewHolder.layout.getLayoutParams();
                p.bottomMargin = 13;
            
            else 
                //remove dropdown menu and clear child views from viewgroup
                viewHolder.dropdown = null;
                group.removeAllViews();

                //set bottom margin
                ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) viewHolder.layout.getLayoutParams();
                p.bottomMargin = 0;
            
        
    );


private class Dropdown extends LinearLayout 
    private ListView options;
    private ImageButton dec, inc;
    private Button basket;
    private TextView count;
    private ArrayList<DrinkInfo> info;

    private class ViewHolder 
        public ListView op;
        private ImageButton d, i;
        private Button b;
        private TextView c;
    

    public Dropdown(Context context, ArrayList<DrinkInfo> info, ViewGroup group, View view, int position) 
        super(context);
        ViewHolder holder;

        if(group.getChildCount() == 0) 
            view = LayoutInflater.from(context).inflate(R.layout.item_cafe_menu_dropdown, group);
            holder = new ViewHolder();

            holder.d = (ImageButton) view.findViewById(R.id.dropdown_decrement);
            holder.c = (TextView) view.findViewById(R.id.dropdown_count);
            holder.i = (ImageButton) view.findViewById(R.id.dropdown_increment);
            holder.op = (ListView) view.findViewById(R.id.dropdown_options_list);
            holder.b = (Button) view.findViewById(R.id.dropdown_basket_button);

            String[] splitOptions = info.get(position).getDrinkOptions().split(":");
            DropdownOptionsItem adapter = new DropdownOptionsItem(context, Arrays.asList(splitOptions));
            holder.op.setAdapter(adapter);

            setOnClickEvents(holder, position);

            view.setTag(holder);
        

        this.info = info;

        holder = (ViewHolder) view.getTag();
        holder.c.setText(info.get(position).getDrinkCount());
    

    private void setOnClickEvents(final ViewHolder viewHolder, final int position) 
        viewHolder.d.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View v) 
                int t = Integer.parseInt(info.get(position).getDrinkCount());
                if(t > 1) 
                    info.get(position).setDrinkCount((t - 1) + "");
                    viewHolder.c.setText(info.get(position).getDrinkCount());
                
            
        );

        viewHolder.i.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View v) 
                    int t =     Integer.parseInt(info.get(position).getDrinkCount());

                    info.get(position).setDrinkCount((t + 1) + "");
                    viewHolder.c.setText(info.get(position).getDrinkCount());
                
            );

            viewHolder.b.setOnClickListener(new OnClickListener() 
                @Override
                public void onClick(View v) 
                    Log.d("dropdown vh", "basket");
                
            );
        
    

item_cafe_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    android:layout_
    android:layout_
    xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:id="@id/menu_layout">

        <TextView
            android:layout_
            android:layout_
            android:gravity="center"
            android:textSize="40dp"
            android:id="@id/menu_name"/>

        <TextView
            android:layout_
            android:layout_
            android:gravity="center"
            android:textSize="20dp"
            android:id="@id/menu_price" />
    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:id="@id/menu_dropdown_layout" >
    </LinearLayout>

    <View
        android:background="#ffc8c8c8"
        android:layout_
        android:layout_ />
</LinearLayout>

item_cafe_menu_dropdown.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_
    android:layout_>

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal" >
        <LinearLayout
            android:layout_
            android:layout_
            android:layout_weight="1">
            <TextView
                android:layout_
                android:layout_
                android:text="count"
                android:textSize="15.0dip"/>
        </LinearLayout>

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_weight="1">
            <ImageButton
                android:layout_
                android:layout_
                android:id="@id/dropdown_decrement"
                android:src="@mipmap/btn_control_circlebtn_nor_minus"
                android:background="@null" />

            <TextView
                android:id="@id/dropdown_count"
                android:layout_
                android:layout_
                android:textSize="15.0dip"
                android:gravity="center" />

            <ImageButton
                android:layout_
                android:layout_
                android:id="@id/dropdown_increment"
                android:src="@mipmap/btn_control_circlebtn_nor_plus"
                android:background="@null" />
        </LinearLayout>
    </LinearLayout>

    <ListView
        android:layout_
        android:layout_
        android:id="@id/dropdown_options_list" />

    <Button
        android:layout_
        android:layout_
        android:id="@id/dropdown_basket_button"
        android:text="Basket" />
</LinearLayout>

DropdownOptionsItem.java

package com.morning_coffee.morningmorning;

import android.content.Context;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;

import java.util.List;
import java.util.regex.Pattern;

/**
 * Created by user on 15. 10. 12..
 */
public class DropdownOptionsItem extends BaseAdapter 

    private Context context;
    private List<String> options;

    private static class ViewHolder 
        public TextView name, option;
        public LinearLayout layout;
    

    public DropdownOptionsItem(Context context, List<String> options) 
        super();
        this.context = context;
        this.options = options;
    

    @Override
    public int getCount() 
        return options.size();
    

    @Override
    public Object getItem(int position) 
        return options.get(position);
    

    @Override
    public long getItemId(int position) 
        return position;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        ViewHolder holder;

        //initialize if convertView is null
        if(convertView == null) 
            convertView = LayoutInflater.from(context).inflate(R.layout.item_cafe_menu_dropdown_option, null);
            holder = new ViewHolder();

            holder.name = (TextView) convertView.findViewById(R.id.dropdown_option_name);
            holder.option = (TextView) convertView.findViewById(R.id.dropdown_option_selected_option);
            holder.layout = (LinearLayout) convertView.findViewById(R.id.dropdown_option_selection_layout);

            setOnClickEvnets(holder, position);

            convertView.setTag(holder);
        

        holder = (ViewHolder) convertView.getTag();

        //fill data
        holder.name.setText(options.get(position));
        holder.option.setText(options.get(position+1));

        notifyDataSetChanged();

        return convertView;
    

    private void setOnClickEvnets(final ViewHolder viewHolder, final int position) 
        viewHolder.layout.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                LinearLayout l = new LinearLayout(context);
                TextView tv = new TextView(context);
                tv.setText("popup");
                l.addView(tv);

                PopupWindow popup = new PopupWindow();
                popup.setContentView(l);

                popup.getContentView().bringToFront();
                popup.showAsDropDown(viewHolder.layout);
                popup.setWidth(300);
                popup.setHeight(300);
                Log.d("popup", popup.isShowing() + "");
            
        );
    

item_cafe_menu_dropdown_option.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_
    android:layout_ >

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="1">

        <TextView
            android:layout_
            android:layout_
            android:id="@id/dropdown_option_name" />
    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:orientation="horizontal"
        android:background="@drawable/layout_corners"
        android:id="@id/dropdown_option_selection_layout">

        <TextView
            android:layout_
            android:layout_
            android:layout_marginTop="4.0dip"
            android:layout_weight="1.0"
            android:gravity="center"
            android:textSize="15.0dip"
            android:id="@id/dropdown_option_selected_option" />

        <ImageView
            android:layout_
            android:layout_
            android:src="@mipmap/arrow_next_2"/>
    </LinearLayout>

</LinearLayout>

【问题讨论】:

【参考方案1】:

我已经通过使用 startActivityForResult 解决了这个问题

【讨论】:

以上是关于在嵌套列表视图中使用弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

odoo-开发笔记 列表视图 增加记录弹出窗口效果

Jquery 移动列表视图详细信息弹出窗口

您可以使用 JQueryMobile 创建嵌套弹出窗口吗

图像视图在android中的键盘弹出窗口上缩小

在片段中使用列表视图

在弹出窗口中呈现模态视图