我是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
文本視圖將顯示Size
,dropdown_option_selected_option
文本視圖將顯示Large
。
- 要實現此功能,我想在用戶單擊dropdown_option_selection_layout
時顯示一個彈出窗口。所以我添加此佈局在DropdownOptionsItem
,其中當前沒有顯示我的設備上的任何一個onclick事件,但Log
顯示true
爲isShowing()
- 我知道這是一個非常討厭的代碼,所以我希望得到的見解,改進代碼並使該彈出窗口出現在屏幕上。
代碼:
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>