安卓自定义PoPUpWidow(弹窗中含有viewpager+gridView)
来源:互联网 发布:淘宝哪个返利网最好 编辑:程序博客网 时间:2024/05/16 15:17
安卓自定义PoPUpWidow(弹窗中含有viewpager+gridView)
本期开发中需要做一个自定义的popupwindow;自定义的popupwindow很简单;但是本期的开发中需要展示3页的标签页,每页展示12个标签;至多能选择3个标签;并且已选择的标签页展示出来,且已选择的标签置灰;点击展示栏已选择的标签可以删除。我先给大家上一幅图:
- 展示3页的标签页
- 每页展示12个标签
- 至多能选择3个标签
- 已选择的标签展示出来
- 已选择的标签置灰
- 点击展示栏已选择的标签可以删除
- 点击换一换切换页面,页面不可滑动
- 一开始想只用一页,用HashMap记录标签的点击状态,无奈技术有限没有完成,希望哪位大神可以做一下,如果做出来给我发一份demo,可以学习一下,我的邮箱siyu3223@qq.com
src
-com.example.popupwindow
- MainWindowActivity
-com.example.popupwindow.adapter
- BaseListAdapter
-com.example.popupwindow.view
- CustomViewPager
- MyGridView
- PurchasePopUpWindow
xml
- activity_main_window.xml
- home_custom_grid_item.xml
- purchase_gridview.xml
- purchase_popup_window.xml
MainWindowActivity
package com.example.popupwindow;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import com.example.popupwindow.adapter.BaseListAdapter;import com.example.popupwindow.view.CustomViewPager;import com.example.popupwindow.view.MyGridView;import com.example.popupwindow.view.PurchasePopUpWindow;public class MainWindowActivity extends Activity { LayoutInflater inflater; private TextView tv_intention_type, tv_intention_des; private Button btn_one, btn_two, btn_three, btn_submit; private String type = ""; private PurchasePopUpWindow mPopUpWindow; private TextView tv_customization_tag, tv_change_items; private ViewPager vp_details; private LinearLayout ll_above_detail; private MyGridView grid_selected; private ParentIconAdapter parentIconAdapter = new ParentIconAdapter(); private ChildrenIconAdapter adapter_one, adapter_two, adapter_three; private List<String> parentList = new ArrayList<String>(); final int length = 3; View[] mView = new View[length]; private MyGridView[] mGridView = new MyGridView[length]; private MyPagerAdapter mMyadapter; private List<View> listViews; private ArrayList<String> data_one, data_two, data_three; private int mSumOne = 1; private int mSumTwo = 1; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1:// 删除 adapter_one.notifyDataSetChanged(); adapter_two.notifyDataSetChanged(); adapter_three.notifyDataSetChanged(); parentIconAdapter.notifyDataSetChanged(); break; case 2:// 添加 parentIconAdapter.notifyDataSetChanged(); break; default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_window); inflater = LayoutInflater.from(getApplicationContext()); InitViews(); RegisterListener(); } public void InitViews() { tv_intention_type = (TextView) findViewById(R.id.tv_intention_type); tv_intention_des = (TextView) findViewById(R.id.tv_intention_des); btn_one = (Button) findViewById(R.id.btn_one); btn_two = (Button) findViewById(R.id.btn_two); btn_three = (Button) findViewById(R.id.btn_three); listViews = new ArrayList<View>(); listViews.add(inflater.inflate(R.layout.purchase_gridview, null)); listViews.add(inflater.inflate(R.layout.purchase_gridview, null)); listViews.add(inflater.inflate(R.layout.purchase_gridview, null)); } public void RegisterListener() { btn_one.setOnClickListener(listener); btn_two.setOnClickListener(listener); btn_three.setOnClickListener(listener); } OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.ll_above_detail: mPopUpWindow.dismiss(); break; case R.id.btn_submit: if (parentList.size() == 0) { Toast toast = Toast.makeText(getApplicationContext(), "请至少选择一项item", Toast.LENGTH_LONG); toast.show(); return; } String mString = ""; for (int i = 0; i < parentList.size(); i++) { mString += parentList.get(i).toString().trim() + " "; } tv_intention_des.setText(mString); mPopUpWindow.dismiss(); break; case R.id.btn_one: type = "One"; tv_intention_type.setText("订阅项目One"); parentList.clear(); PopUpWindows(); tv_customization_tag.setText("订阅项目One"); break; case R.id.btn_two: type = "Two"; parentList.clear(); tv_intention_type.setText("订阅项目Two"); PopUpWindows(); tv_customization_tag.setText("订阅项目Two"); break; case R.id.btn_three: break; case R.id.tv_change_items: if (type.equals("One")) { if (getDataOne().size() == 0) { Toast toast = Toast.makeText(getApplicationContext(), "无资讯标签数据", Toast.LENGTH_LONG); toast.show(); return; } else { if (getDataOne().size() <= 12) { vp_details.setCurrentItem(0); tv_change_items.setVisibility(View.GONE); } else if (getDataOne().size() > 12 && getDataOne().size() <= 24) { if (mSumOne < 2) { vp_details.setCurrentItem(mSumOne); mSumOne++; } else { mSumOne = 0; vp_details.setCurrentItem(0); } } else { if (mSumOne < 3) { vp_details.setCurrentItem(mSumOne); mSumOne++; } else { mSumOne = 0; vp_details.setCurrentItem(0); } } } } if (type.equals("Two")) { if (getDataTwo().size() == 0) { Toast toast = Toast.makeText(getApplicationContext(), "无资讯标签数据", Toast.LENGTH_LONG); toast.show(); return; } else { if (getDataTwo().size() <= 12) { vp_details.setCurrentItem(0); tv_change_items.setVisibility(View.GONE); } else if (getDataTwo().size() > 12 && getDataTwo().size() <= 24) { if (mSumTwo < 2) { vp_details.setCurrentItem(mSumTwo); mSumTwo++; } else { mSumTwo = 0; vp_details.setCurrentItem(0); } } else { if (mSumTwo < 3) { vp_details.setCurrentItem(mSumTwo); mSumTwo++; } else { mSumTwo = 0; vp_details.setCurrentItem(0); } } } } break; } } }; OnClickListener onClicker = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }; public void PopUpWindows() { mPopUpWindow = new PurchasePopUpWindow(MainWindowActivity.this, onClicker); mPopUpWindow.showAtLocation( MainWindowActivity.this.findViewById(R.id.ll_main_window), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); View view = mPopUpWindow.getContentView(); tv_customization_tag = (TextView) view .findViewById(R.id.tv_customization_tag); ll_above_detail = (LinearLayout) view .findViewById(R.id.ll_above_detail); tv_change_items = (TextView) view.findViewById(R.id.tv_change_items); grid_selected = (MyGridView) view.findViewById(R.id.grid_selected); btn_submit = (Button) view.findViewById(R.id.btn_submit); vp_details = (CustomViewPager) view.findViewById(R.id.vp_details); mMyadapter = new MyPagerAdapter(listViews); vp_details.setAdapter(mMyadapter); vp_details.setCurrentItem(0); data_one = new ArrayList<String>(); data_two = new ArrayList<String>(); data_three = new ArrayList<String>(); adapter_one = new ChildrenIconAdapter(MainWindowActivity.this, data_one); adapter_two = new ChildrenIconAdapter(MainWindowActivity.this, data_two); adapter_three = new ChildrenIconAdapter(MainWindowActivity.this, data_three); for (int i = 0; i < 3; i++) { mGridView[i] = (MyGridView) listViews.get(i).findViewById( R.id.gridview); } tv_change_items.setOnClickListener(listener); ll_above_detail.setOnClickListener(listener); btn_submit.setOnClickListener(listener); // mAdapterInit(); if (type.equals("One")) { if (getDataOne().size() <= 12) { tv_change_items.setVisibility(View.GONE); for (int i = 0; i < getDataOne().size(); i++) { data_one.add(getDataOne().get(i).toString().trim()); } } else if (getDataOne().size() > 12 && getDataOne().size() <= 24) { for (int i = 0; i < 12; i++) { data_one.add(getDataOne().get(i).toString().trim()); } for (int i = 12; i < getDataOne().size(); i++) { data_two.add(getDataOne().get(i).toString().trim()); } } else if (getDataOne().size() > 24) { for (int i = 0; i < 12; i++) { data_one.add(getDataOne().get(i).toString().trim()); } for (int i = 12; i < 24; i++) { data_two.add(getDataOne().get(i).toString().trim()); } for (int i = 24; i < 36 && i < getDataOne().size(); i++) { data_three.add(getDataOne().get(i).toString().trim()); } } for (int i = 0; i < length; i++) { if (i == 0) { mGridView[i].setAdapter(adapter_one); } if (i == 1) { mGridView[i].setAdapter(adapter_two); } if (i == 2) { mGridView[i].setAdapter(adapter_three); } } grid_selected.setAdapter(parentIconAdapter); } if (type.equals("Two")) { tv_change_items.setVisibility(View.GONE); if (getDataTwo().size() <= 12) { for (int i = 0; i < getDataTwo().size(); i++) { data_one.add(getDataTwo().get(i).toString().trim()); } } else if (getDataTwo().size() > 12 && getDataTwo().size() <= 24) { for (int i = 0; i < 12; i++) { data_one.add(getDataTwo().get(i).toString().trim()); } for (int i = 12; i < getDataTwo().size(); i++) { data_two.add(getDataTwo().get(i).toString().trim()); } } else if (getDataTwo().size() > 24) { for (int i = 0; i < 12; i++) { data_one.add(getDataTwo().get(i).toString().trim()); } for (int i = 12; i < 24; i++) { data_two.add(getDataTwo().get(i).toString().trim()); } for (int i = 24; i < 36 && i < getDataTwo().size(); i++) { data_three.add(getDataTwo().get(i).toString().trim()); } } for (int i = 0; i < length; i++) { if (i == 0) { mGridView[i].setAdapter(adapter_one); } if (i == 1) { mGridView[i].setAdapter(adapter_two); } if (i == 2) { mGridView[i].setAdapter(adapter_three); } } grid_selected.setAdapter(parentIconAdapter); } } private ArrayList<String> getDataOne() { ArrayList<String> result = new ArrayList<String>(); for (int i = 0; i < 50; i++) { result.add("One item " + i); } return result; } private ArrayList<String> getDataTwo() { ArrayList<String> result = new ArrayList<String>(); for (int i = 0; i < 10; i++) { result.add("Two item " + i); } return result; } public class MyPagerAdapter extends PagerAdapter { public List<View> mListViews; public MyPagerAdapter(List<View> mListViews) { this.mListViews = mListViews; } public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public int getCount() { return mListViews.size(); } @Override public Object instantiateItem(ViewGroup container, int position) { View v = mListViews.get(position); ViewGroup parent = (ViewGroup) v.getParent(); ; // ((ViewPager) collection).addView(v, 0); if (parent != null) { parent.removeAllViews(); } container.addView(v); return v; } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } } /** * childgridview图片适配 */ private class ChildrenIconAdapter extends BaseListAdapter<String> { private List<String> mData; public ChildrenIconAdapter(Context context, List<String> mData) { super(context, mData); // TODO Auto-generated constructor stub this.mData = mData; } @Override public String getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getCount() { return mData.size(); } private class ViewHolder { ImageView iv_delete; TextView tv_iconname; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate( R.layout.home_custom_grid_item, null); holder.tv_iconname = (TextView) convertView .findViewById(R.id.tv_intent_iconname); holder.iv_delete = (ImageView) convertView .findViewById(R.id.iv_delete_item); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.iv_delete.setVisibility(View.GONE); if (parentList.contains(mData.get(position))) { holder.tv_iconname.setEnabled(false); } else { holder.tv_iconname.setEnabled(true); } holder.tv_iconname.setText(mData.get(position)); holder.tv_iconname.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (parentList.size() >= 3) { Toast toast = Toast.makeText(getApplicationContext(), "最多可选择3个特色标签", Toast.LENGTH_LONG); toast.show(); return; } v.setEnabled(false); parentList.add(mData.get(position)); mHandler.sendEmptyMessage(2); } }); return convertView; } @Override protected View getItemView(View convertView, int position) { // TODO Auto-generated method stub return null; } public void update(List<String> values) { mData = values; notifyDataSetInvalidated(); notifyDataSetChanged(); } } /** * parentgridview图片适配 */ private class ParentIconAdapter extends BaseAdapter { @Override public String getItem(int position) { return parentList.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getCount() { return parentList.size(); } private class ViewHolder { ImageView iv_delete; TextView tv_iconname; RelativeLayout rl_item; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(getApplicationContext()) .inflate(R.layout.home_custom_grid_item, null); holder.tv_iconname = (TextView) convertView .findViewById(R.id.tv_intent_iconname); holder.iv_delete = (ImageView) convertView .findViewById(R.id.iv_delete_item); holder.rl_item = (RelativeLayout) convertView .findViewById(R.id.rl_item); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tv_iconname.setBackgroundResource(R.drawable.zhun_n); holder.iv_delete.setVisibility(View.VISIBLE); holder.tv_iconname.setTextColor(getResources().getColor( R.color.black)); holder.tv_iconname.setText(parentList.get(position)); holder.rl_item.setClickable(true); holder.rl_item.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { parentList.remove(position); mHandler.sendEmptyMessage(1); } }); return convertView; } }}
分析一下关键的代码块
- MyPagerAdapter
@Override public Object instantiateItem(ViewGroup container, int position) { View v = mListViews.get(position); ViewGroup parent = (ViewGroup) v.getParent(); if (parent != null) { parent.removeAllViews(); } container.addView(v); return v; }
此段代码的作用就是解决 同一个popupwindow中使用viewpager 弹出俩次 或者 在切换页面时 (动态添加页面或者删除页面时)产生的bug: (java.lang.illegalStateException: The specified child already has a parent. You must call removeView() on the child’s paent first)。这是由于 第一次 打开PopUPWiondow时,一切正常运行,此时v已经存在视图了;但是当你第二次打开PopUPWiondow时,v又一次被添加到容器中,此时就会出现错误。所以关闭PopUPWindows时需要做一下判断,如果 container中含有v的视图,就需要移除掉,重新添加v。 此方法适用于含有viewpager的popupwindow中,以后大家遇到可以试一试这个方法解决这个问题。
- ChildrenIconAdapter
if (parentList.contains(mData.get(position))) { holder.tv_iconname.setEnabled(false); } else { holder.tv_iconname.setEnabled(true); } holder.tv_iconname.setText(mData.get(position)); holder.tv_iconname.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (parentList.size() >= 3) { Toast toast = Toast.makeText(getApplicationContext(), "最多可选择3个特色标签", Toast.LENGTH_LONG); toast.show(); return; } v.setEnabled(false); parentList.add(mData.get(position)); mHandler.sendEmptyMessage(2); } });
如果parentlist中含有标签页中Item的数据时,此项Item颜色置灰且不可点击。mHandler.sendEmptyMessage(2); 新建线程 更新parentAdapter中数据;
- ParentAdapter
holder.tv_iconname.setText(parentList.get(position)); holder.rl_item.setClickable(true); holder.rl_item.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { parentList.remove(position); mHandler.sendEmptyMessage(1); } });
此段代码中,用于删除已经选择的item,同时启动线程mHandler.sendEmptyMessage(1); 更新adapter_one;adapter_two;adapter_three;parentIconAdapter的数据;
DEMO稍後上傳!!~~
DEMO下载地址
- 安卓自定义PoPUpWidow(弹窗中含有viewpager+gridView)
- 安卓自定义ViewPager防止滑动冲突
- 安卓GridView(自定义适配器)
- 安卓基础:自定义控件实现ViewPager指示器
- 安卓自定义控件之item高度不同的viewpager
- 安卓:自定义适配器实现GridView图文混排
- 安卓ViewPager--OnPageChangeListener
- 安卓使用GridView点击背景为黄色,自定义Gridview背景色
- 安卓中的gridview
- 【安卓自定义控件】自定义ViewGroup实现透明背景的ViewPager效果
- viewpager+gridview
- ViewPager+GridView
- 《安卓ViewPager系列自定义效果,助你打造炫酷轮播图——ViewPager+Glide+PhotView 图片相册加载效果》
- 安卓ViewPager无限循环
- 安卓项目第一步:viewpager
- 安卓 ViewPager 添加小点
- 安卓ViewPager无限滑动
- 安卓ViewPager系列自定义效果,助你打造炫酷轮播图——索引。
- 机房重构--正则表达式
- 如何判断一个男人是否靠谱?
- 产品经理的主要工作职责
- C# Stream 和 byte[] 之间的转换
- Eclipse全面优化
- 安卓自定义PoPUpWidow(弹窗中含有viewpager+gridView)
- ContentProvider的使用小结
- Android开发(41) android的BroadcastReceiver运用详解
- 我最常用的Eclipse快捷键
- Count Primes
- linux安装常见软件(二)——LAMP搭建
- 杂感
- 非捕获组详解
- 设计模式(创建型)之原型模式(Prototype Pattern)