安卓自定义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下载地址

0 0
原创粉丝点击