2015-10-14 40 views
0

我是Android新手,在我的應用程序中,我嘗試添加一個彈出窗口,當用戶單擊格式化爲看起來像按鈕的佈局時,會添加一個函數。在嵌套列表視圖中使用彈出窗口

問題是,在我想實現這個目標的活動中,我列出了每個都適合自己的獨特定製baseadapters的列表視圖。

我覺得這對我的應用來說是一個非常低效和沉重的設計,但我想不出達到目標的更好方法。我的所有其他功能都正常工作(就他們對「點擊」的反應非常好)而言。我還通過登錄popup.isShown()檢查了彈出窗口的可見性,它告訴我點擊layout後是正確的。

我現在可以猜測的一件事是將根視圖(活動的視圖)傳遞到我彈出窗口的位置,但我不認爲這是一個好主意,由於幾個原因,我相信人們可能會腐敗/操縱數據,因爲我已經通過參數向我的「內部」適配器傳遞了大量信息。

因此,有沒有人可以給我提供一個更好更輕的結構設計的見解,以解決我的彈出窗口問題?非常感謝。

簡化:

-My程序有一個名爲「CoffeeSelectActivity」活性,其中它呈現的飲料選擇的咖啡館提供的列表(與

- 該列表視圖膨脹ID爲「drinks_list」列表視圖顯示item_cafe_menu。爲了做到這一點,我創建了一個名爲定製baseadatper DrinksItem

- 在item_cafe_menu,我已經展示在選擇的杯子和客戶希望添加(額外的鏡頭等)出現的特定選項列表視圖當用戶點擊al ist項目drinks_list。對於這一點,我使用的私有類的內部DrinksItem命名Dropdown

- 在Dropdown類,我實現了另一種定製baseadapter我dropdown_options_list列表視圖中item_cafe_menu_dropdown.xml,命名DropdownOptionsItem。這將通過選項名稱和選項填充選定飲料的可用選項,例如,選擇大小而非常規,dropdown_option_name文本視圖將顯示Sizedropdown_option_selected_option文本視圖將顯示Large

- 要實現此功能,我想在用戶單擊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_width="match_parent" 
    android:layout_height="fill_parent" 
    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_width="fill_parent" 
    android:layout_height="fill_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:id="@id/menu_layout"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:textSize="40dp" 
      android:id="@id/menu_name"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:textSize="20dp" 
      android:id="@id/menu_price" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:id="@id/menu_dropdown_layout" > 
    </LinearLayout> 

    <View 
     android:background="#ffc8c8c8" 
     android:layout_width="fill_parent" 
     android:layout_height="1.0dip" /> 
</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_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 
     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1"> 
      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="22.0dip" 
       android:text="count" 
       android:textSize="15.0dip"/> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1"> 
      <ImageButton 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@id/dropdown_decrement" 
       android:src="@mipmap/btn_control_circlebtn_nor_minus" 
       android:background="@null" /> 

      <TextView 
       android:id="@id/dropdown_count" 
       android:layout_width="54.0dip" 
       android:layout_height="22.0dip" 
       android:textSize="15.0dip" 
       android:gravity="center" /> 

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

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@id/dropdown_options_list" /> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     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_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="22.0dip" 
      android:id="@id/dropdown_option_name" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:orientation="horizontal" 
     android:background="@drawable/layout_corners" 
     android:id="@id/dropdown_option_selection_layout"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="22.0dip" 
      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_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@mipmap/arrow_next_2"/> 
    </LinearLayout> 

</LinearLayout> 

回答

0

我已經通過使用startActivityFo解決這個問題rResult