最近有个项目的需求是做个三级筛选菜单,前一级的选择会影响到下一级的结果,花了好一些时间终于做出来,不过感觉还是不是特别好。
先看一下测试的效果图:
好了,说一下我是怎么实现这个效果的。
第一.布局:
这是一个线性布局,水平方向,里面包含了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<Papertype> ps=mSelectbean.getPapertype();
List<String> s=new ArrayList<>();
for(Papertype p:ps)
{
s.add(p.getPapertypename());
}
initePop(s, papertypepop);
s.clear();
List<Testtype> ts=mSelectbean.getPapertype().get(0).getTesttype();
for(Testtype p:ts)
{
s.add(p.getTesttypename());
}
initePop(s, testtypepop);
s.clear();
List<SelectTime> times=mSelectbean.getPapertype().get(0).getTesttype().get(0).getTime();
for(SelectTime p:times)
{
s.add(p.getSelscttime());
}
initePop(s, timetypepop);
}
private void initePop(List<String> 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<texts.size();i++)
{
View v=new View(this.getContext());
v.setLayoutParams(viep);
v.setBackgroundColor(Color.parseColor("#eec1c1c1"));
v.setPadding(10, 0, 10, 0);
v.setTranslationX(5);
Button button=new Button(getContext());
button.setLayoutParams(p);
button.setTranslationX(-5);
button.setText(texts.get(i));
button.setId(i);
button.setOnClickListener(new popclicklistener());
layout.addView(button);
if(i!=texts.size()-1)
layout.addView(v);
height=height+button.getMinHeight()+v.getMinimumHeight();
}
scrollView.addView(layout);
pop.setWidth(mManager.getDefaultDisplay().getWidth());
pop.setHeight(height+13);
pop.setFocusable(true);
pop.setOutsideTouchable(true);
pop.setContentView(scrollView);
}
private class menucliskListener implements OnClickListener {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case 1:
if(!papertypepop.isShowing())
{
papertypepop.showAsDropDown(layout1, 0, 0);
}
else papertypepop.dismiss();
mType=1;
break;
case 2:
if(!testtypepop.isShowing())
{
testtypepop.showAsDropDown(layout2, 0, 0);
}
else testtypepop.dismiss();
mType=2;
break;
case 3:
if(!timetypepop.isShowing())
{
timetypepop.showAsDropDown(layout2, 0, 0);
}
else timetypepop.dismiss();
mType=3;
break;
default:
break;
}
}
}
private class popclicklistener implements OnClickListener
{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (mType) {
case 1:
paperid=arg0.getId();
if(papertypepop.isShowing())
{papertypepop.dismiss();}
papertypetext.setText(mSelectbean.getPapertype().get(paperid).getPapertypename());
testtypetext.setText(mSelectbean.getPapertype().get(paperid).getTesttype().get(0).getTesttypename());
timetypetext.setText(mSelectbean.getPapertype().get(paperid).getTesttype().get(0).getTime().get(0).getSelscttime());;
List<String> s=new ArrayList<>();
List<Testtype> ts=mSelectbean.getPapertype().get(paperid).getTesttype();
for(Testtype p:ts)
{
s.add(p.getTesttypename());
}
initePop(s, testtypepop);
s.clear();
List<SelectTime> 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<String> s1=new ArrayList<>();
List<SelectTime> 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布局里使用就可以了,代码没什么意义,这样可以实现功能,可是拓展性很不好,主要是实现的思路,如果有更好的实现方法,欢迎探讨。