Android三级联动筛选菜单

                  最近有个项目的需求是做个三级筛选菜单,前一级的选择会影响到下一级的结果,花了好一些时间终于做出来,不过感觉还是不是特别好。

                 先看一下测试的效果图:

                                                          Android三级联动筛选菜单_第1张图片


         好了,说一下我是怎么实现这个效果的。

                 第一.布局:

                           

                    这是一个线性布局,水平方向,里面包含了3个相对布局,每个相对布局里面包含有一个TextView与一个ImageView,相对布局的权重设置为一,这样大小就会均匀分               布。

                        

         这是一个popwindow,一共使用了3个popwindow。每个popwindow根据数据动态添加button 与背景为白色的view,点击弹出相应的popwindow就是了。


          第二.事件监听:1.3个相对布局实现点击事件的监听,弹出对应的popwindow。

                                2.每个button实现数据回调监听,返回你点击按钮后需要的数据到主函数。

         第三.实现多级联动:这里我采取的多个对象联系起来的方法。筛选对象包含第一级对象的集合,第一级对象包含第二级对象的集合,第二级对象包含第三级对象的集合,

正如下显现那样,这样的下一级的数据就可以由上一级选择的对象决定,实现数据联动起来:


说完的实现的思路,看一下具体的代码实现:



public class SelectMenu extends LinearLayout {
	
	private TextView testtypetext, papertypetext, timetypetext;
	private PopupWindow testtypepop,papertypepop,timetypepop;
	private RelativeLayout layout1 ,layout2,layout3;
	private WindowManager mManager;
	private Selectresult mSelectresult;
	private Selectbean mSelectbean;
	private int mType=0;
	private PaperSelectLintener mSelectListener;
	private int paperid=0,testid=0,timeid=0;

	public PsSelectMenu(Context context) {
		super(context);
		inite();
		// TODO Auto-generated constructor stub
	}

	public PsSelectMenu(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		inite();
	}

	public PsSelectMenu(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		inite();
	}

	private void inite() {
		// TODO Auto-generated method stub
		LayoutParams layoutP = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT,1);
		layout1 = (RelativeLayout) RelativeLayout.inflate(getContext(), R.layout.selectmenu_item, null);
		layout2 = (RelativeLayout) RelativeLayout.inflate(getContext(), R.layout.selectmenu_item, null);
		layout3 = (RelativeLayout) RelativeLayout.inflate(getContext(), R.layout.selectmenu_item, null);
		papertypetext = (TextView) layout1.findViewById(R.id.select_menu_text);
		testtypetext = (TextView) layout2.findViewById(R.id.select_menu_text);
		timetypetext = (TextView) layout3.findViewById(R.id.select_menu_text);


		layout1.setLayoutParams(layoutP);
		layout2.setLayoutParams(layoutP);
		layout3.setLayoutParams(layoutP);

		int a=1;
		layout1.setId(a++);
		layout2.setId(a++);
		layout3.setId(a++);
		layout1.setPadding(10, 0, 10, 0);
		layout2.setPadding(10, 0, 10, 0);
		layout3.setPadding(10, 0, 10, 0);
		layout1.setOnClickListener(new menucliskListener());
		layout2.setOnClickListener(new menucliskListener());
		layout3.setOnClickListener(new menucliskListener());
		
		LayoutParams thisP = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
		setOrientation(LinearLayout.HORIZONTAL);
		setLayoutParams(thisP);
		setGravity(Gravity.CENTER_VERTICAL);
		setPadding(20, 0, 20, 0);

		View  v1=new View(this.getContext());
		LayoutParams p=new LayoutParams(1, 25);
		v1.setLayoutParams(p);
		v1.setBackgroundColor(Color.parseColor("#eec1c1c1"));
		View  v2=new View(this.getContext());
		v2.setLayoutParams(p);
		v2.setBackgroundColor(Color.parseColor("#eec1c1c1"));
					
		addView(layout1);
		addView(v1);
		addView(layout2);
		addView(v2);
		addView(layout3);

		
        
	}
	public void setData(Selectbean selectbean)
	{
		this.mSelectbean=selectbean;
		initedatda();
	}
	
	public void setSelectListener(PaperSelectLintener listener)
	{
		this.mSelectListener=listener;
	}
	
    @SuppressWarnings("static-access")
	private void initedatda() {
    	
		// TODO Auto-generated method stub

    	testtypepop=new PopupWindow(getContext());
		papertypepop=new PopupWindow(getContext());
		timetypepop=new PopupWindow(getContext());
        mManager=(WindowManager) getContext().getSystemService(getContext().WINDOW_SERVICE);
        mSelectresult=new Selectresult();
        mSelectresult.setDt("0");
        mSelectresult.setPapertype(mSelectbean.getPapertype().get(0).getSelectmsg());
        mSelectresult.setTesttypr(mSelectbean.getPapertype().get(0).getTesttype().get(0).getSelectmsg());;
        mSelectresult.setTime(mSelectbean.getPapertype().get(0).getTesttype().get(0).getTime().get(0).getSelectmsg());
      
        List ps=mSelectbean.getPapertype();
        List s=new ArrayList<>();
        for(Papertype p:ps)
        {
        	s.add(p.getPapertypename());
        }
        initePop(s, papertypepop);
       
        s.clear();
        List ts=mSelectbean.getPapertype().get(0).getTesttype();
        for(Testtype p:ts)
        {
        	s.add(p.getTesttypename());
        }
        initePop(s, testtypepop);
     
        s.clear();
        List times=mSelectbean.getPapertype().get(0).getTesttype().get(0).getTime();
        for(SelectTime p:times)
        {
        	s.add(p.getSelscttime());
        }
        initePop(s, timetypepop);
        
        
	}



	private void initePop(List texts,PopupWindow pop)
	{

		LinearLayout layout=new LinearLayout(getContext());
		LayoutParams p=new LayoutParams(mManager.getDefaultDisplay().getWidth(), LayoutParams.WRAP_CONTENT);
		ScrollView scrollView=new ScrollView(getContext());
		scrollView.setLayoutParams(p);
		layout.setLayoutParams(p);
		layout.setOrientation(LinearLayout.VERTICAL);
		
	
		LayoutParams viep=new LayoutParams(mManager.getDefaultDisplay().getWidth()-20, 2);
		int height=0;
		for(int i=0;i s=new ArrayList<>(); 
			    List ts=mSelectbean.getPapertype().get(paperid).getTesttype();
			    for(Testtype p:ts)
			        {
			        	s.add(p.getTesttypename());
			        }
			    initePop(s, testtypepop);			        
			    s.clear();
			    List times=mSelectbean.getPapertype().get(paperid).getTesttype().get(0).getTime();
			    for(SelectTime p:times)
			        {
			        	s.add(p.getSelscttime());
			        }
			     initePop(s, timetypepop);		
			     

			        if(paperid==0||paperid==1)
			        {
			        	mSelectresult.setTime(mSelectbean.getPapertype().get(paperid).getTesttype().get(0).getTime().get(0)						
								.getSelectmsg());
			        	mSelectresult.setDt("");
			        }else if (paperid == 2) {
			        	mSelectresult.setTime("");
			        	mSelectresult.setDt(mSelectbean.getPapertype().get(paperid).getTesttype().get(0).getTime().get(0)
								.getSelectmsg());
					}		   
			        mSelectresult.setPapertype(mSelectbean.getPapertype()
							.get(paperid).getSelectmsg());
			        
			        mSelectresult.setTesttypr(mSelectbean.getPapertype().get(paperid)
							.getTesttype().get(0).getSelectmsg());
			        mSelectListener.onSelected(mSelectresult);
				break;
           case 2:
        	   testid=arg0.getId();
        	   if(testtypepop.isShowing()) 
				{testtypepop.dismiss();}

			testtypetext.setText(mSelectbean.getPapertype().get(paperid).getTesttype().get(testid).getTesttypename());
			timetypetext.setText(mSelectbean.getPapertype().get(paperid).getTesttype().get(testid).getTime().get(0).getSelscttime());;
				

				List s1=new ArrayList<>(); 			   
			    List times1=mSelectbean.getPapertype().get(paperid).getTesttype().get(testid).getTime();
			    for(SelectTime p:times1)
			        {
			        	s1.add(p.getSelscttime());
			        }
			         initePop(s1, timetypepop);	
			         

			        if(paperid==0||paperid==1)
			        {
			        	mSelectresult.setTime(mSelectbean.getPapertype().get(paperid).getTesttype().get(testid).getTime().get(0)						
								.getSelectmsg());
			        	mSelectresult.setDt("");
			        }else if (paperid == 2) {
			        	mSelectresult.setDt("");

			        	mSelectresult.setTime(mSelectbean.getPapertype().get(paperid).getTesttype().get(testid).getTime().get(0)
								.getSelectmsg());
					}					        			       
			        mSelectresult.setTesttypr(mSelectbean.getPapertype().get(paperid)
							.getTesttype().get(testid).getSelectmsg());
			        mSelectListener.onSelected(mSelectresult);
			      
        	   
				break;

            case 3:
	
            	
            	timeid=arg0.getId();
         	   if(timetypepop.isShowing()) 
 				{timetypepop.dismiss();}

 			
 			timetypetext.setText(mSelectbean.getPapertype().get(paperid).getTesttype().get(testid).getTime().get(timeid).getSelscttime());;
 				

 			        if(paperid==0||paperid==1)
 			        {
 			        	mSelectresult.setTime(mSelectbean.getPapertype().get(paperid).getTesttype().get(testid).getTime().get(timeid)						
 								.getSelectmsg());
 			        	mSelectresult.setDt("");
 			        }else if (paperid == 2) {
 			        	mSelectresult.setDt("");

 			        	mSelectresult.setTime(mSelectbean.getPapertype().get(paperid).getTesttype().get(testid).getTime().get(timeid)
 								.getSelectmsg());
 					}					        			       
 			       
 			        mSelectListener.onSelected(mSelectresult);
            	
	            break;

			default:
				break;
			}
		}
		
	}
	

	public interface PaperSelectLintener {
		public void onSelected(Selectresult rSelectresult);

	}
}

然后在xml布局里使用就可以了,代码没什么意义,这样可以实现功能,可是拓展性很不好,主要是实现的思路,如果有更好的实现方法,欢迎探讨。


你可能感兴趣的:(android开发)