Skip to content

Commit bc8d2b2

Browse files
committed
添加单独的车长车型选择器,支持单选和多选
1 parent 15c61a0 commit bc8d2b2

11 files changed

Lines changed: 431 additions & 60 deletions

app/src/main/java/com/tick/conditiondialogdemo/MainActivity.java

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
import com.tick.conditiondialog.vehicle.VehicleCondition;
1313
import com.tick.conditiondialog.vehicle.VehicleConditionSelectListener;
1414
import com.tick.conditiondialog.vehicle.VehicleMeter;
15+
import com.tick.conditiondialog.vehicle.VehicleMeterSelector;
16+
import com.tick.conditiondialog.vehicle.VehicleMetersSelectListener;
1517
import com.tick.conditiondialog.vehicle.VehicleType;
18+
import com.tick.conditiondialog.vehicle.VehicleTypeSelectListener;
19+
import com.tick.conditiondialog.vehicle.VehicleTypeSelector;
1620

1721
import java.util.ArrayList;
1822
import java.util.List;
@@ -22,8 +26,12 @@ public class MainActivity extends AppCompatActivity implements VehicleConditionS
2226

2327
private Button mVehicleButton;
2428
private Button mCarrierTypeButton;
29+
private Button mVehicleTypeButton;
30+
private Button mVehicleMeterButton;
2531
private TextView mTextView;
2632
private VehicleCdSelector mVehicleCdSelector;
33+
private VehicleMeterSelector mVehicleMeterSelector;
34+
private VehicleTypeSelector mVehicleTypeSelector;
2735
private CarrierTypeCdSelector mTypeCdSelector;
2836
private String mSelectedType;
2937

@@ -35,12 +43,43 @@ protected void onCreate(Bundle savedInstanceState) {
3543
mVehicleCdSelector = new VehicleCdSelector(getApplicationContext(), mock(), this);
3644
mVehicleCdSelector.setAnimationStyle(R.style.popwin_anim_style);
3745

46+
mVehicleTypeSelector = new VehicleTypeSelector(getApplicationContext(), mockTypes(), vehicleTypes -> {
47+
StringBuilder result = new StringBuilder();
48+
for (int i = 0; i < vehicleTypes.size(); i++) {
49+
result.append(vehicleTypes.get(i).getValue());
50+
if (i != vehicleTypes.size() - 1) {
51+
result.append(",");
52+
}
53+
}
54+
mSelectedType = result.toString();
55+
mTextView.setText(mSelectedType);
56+
});
57+
mVehicleTypeSelector.setAnimationStyle(R.style.popwin_anim_style);
58+
59+
mVehicleMeterSelector = new VehicleMeterSelector(getApplicationContext(), mockMeters(), vehicleMeters -> {
60+
StringBuilder result = new StringBuilder();
61+
for (int i = 0; i < vehicleMeters.size(); i++) {
62+
result.append(vehicleMeters.get(i).getValue());
63+
if (i != vehicleMeters.size() - 1) {
64+
result.append(",");
65+
}
66+
}
67+
mSelectedType = result.toString();
68+
mTextView.setText(mSelectedType);
69+
});
70+
mVehicleMeterSelector.setAnimationStyle(R.style.popwin_anim_style);
71+
3872
mTypeCdSelector = new CarrierTypeCdSelector(getApplicationContext(), mockCarrierType(), this);
3973
mTypeCdSelector.setAnimationStyle(R.style.popwin_anim_style);
4074

4175
mTextView = findViewById(R.id.tv_content);
4276
mVehicleButton = findViewById(R.id.btVehicel);
4377
mVehicleButton.setOnClickListener(v -> mVehicleCdSelector.show(v));
78+
mVehicleTypeButton = findViewById(R.id.btVehicleType);
79+
mVehicleTypeButton.setOnClickListener(v -> mVehicleTypeSelector.show(v));
80+
mVehicleMeterButton = findViewById(R.id.btVehicleMeter);
81+
mVehicleMeterButton.setOnClickListener(v -> mVehicleMeterSelector.show(v));
82+
4483
mCarrierTypeButton = findViewById(R.id.btCarrierType);
4584
mCarrierTypeButton.setOnClickListener(v -> mTypeCdSelector.show(v, mSelectedType));
4685
}
@@ -66,23 +105,31 @@ public String getContent(VehicleCondition condition) {
66105

67106
public VehicleCondition mock() {
68107
VehicleCondition vehicleCondition = new VehicleCondition();
69-
ArrayList<VehicleMeter> meters = new ArrayList<>();
108+
vehicleCondition.setVehicleMeters(mockMeters());
109+
vehicleCondition.setVehicleTypes(mockTypes());
110+
return vehicleCondition;
111+
}
112+
113+
public ArrayList<VehicleType> mockTypes() {
70114
ArrayList<VehicleType> types = new ArrayList<>();
115+
for (int i = 0; i < 30; i++) {
116+
VehicleType type = new VehicleType();
117+
type.setVehicleType("平板车" + i);
118+
types.add(type);
119+
}
120+
return types;
121+
}
122+
123+
public ArrayList<VehicleMeter> mockMeters() {
124+
ArrayList<VehicleMeter> meters = new ArrayList<>();
71125
double d = 1.0;
72126
for (int i = 0; i < 25; i++) {
73127
d = d + i;
74128
VehicleMeter meter = new VehicleMeter();
75129
meter.setVehicleMeter(Double.toString(d));
76130
meters.add(meter);
77131
}
78-
for (int i = 0; i < 30; i++) {
79-
VehicleType type = new VehicleType();
80-
type.setVehicleType("平板车" + i);
81-
types.add(type);
82-
}
83-
vehicleCondition.setVehicleMeters(meters);
84-
vehicleCondition.setVehicleTypes(types);
85-
return vehicleCondition;
132+
return meters;
86133
}
87134

88135
public List<CarrierType> mockCarrierType() {
Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,42 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<android.support.constraint.ConstraintLayout
3-
xmlns:android="http://schemas.android.com/apk/res/android"
4-
xmlns:app="http://schemas.android.com/apk/res-auto"
5-
xmlns:tools="http://schemas.android.com/tools"
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
63
android:layout_width="match_parent"
74
android:layout_height="match_parent"
8-
tools:context="com.tick.conditiondialogdemo.MainActivity">
5+
android:orientation="vertical">
6+
7+
<TextView
8+
android:id="@+id/tv_content"
9+
android:layout_width="match_parent"
10+
android:layout_height="wrap_content"
11+
android:layout_margin="10dp"
12+
android:text="TextView" />
913

1014
<Button
1115
android:id="@+id/btVehicel"
12-
android:layout_width="0dp"
16+
android:layout_width="match_parent"
1317
android:layout_height="wrap_content"
14-
android:layout_marginBottom="328dp"
15-
android:layout_marginTop="8dp"
16-
android:text="车型选择器"
17-
app:layout_constraintBottom_toBottomOf="parent"
18-
app:layout_constraintHorizontal_bias="0.0"
19-
app:layout_constraintLeft_toLeftOf="parent"
20-
app:layout_constraintRight_toRightOf="parent"
21-
app:layout_constraintTop_toBottomOf="@+id/btCarrierType"
22-
app:layout_constraintVertical_bias="0.104" />
18+
android:layout_margin="10dp"
19+
android:text="车长车型选择器" />
2320

2421
<Button
25-
android:id="@+id/btCarrierType"
26-
android:layout_width="0dp"
22+
android:id="@+id/btVehicleType"
23+
android:layout_width="match_parent"
2724
android:layout_height="wrap_content"
28-
android:text="承运商类型选择器"
29-
app:layout_constraintBottom_toBottomOf="parent"
30-
app:layout_constraintHorizontal_bias="0.0"
31-
app:layout_constraintLeft_toLeftOf="parent"
32-
app:layout_constraintRight_toRightOf="parent"
33-
app:layout_constraintTop_toTopOf="parent"
34-
app:layout_constraintVertical_bias="0.196" />
25+
android:layout_margin="10dp"
26+
android:text="车型选择器" />
3527

36-
<TextView
37-
android:id="@+id/tv_content"
38-
android:layout_width="wrap_content"
28+
<Button
29+
android:id="@+id/btVehicleMeter"
30+
android:layout_width="match_parent"
31+
android:layout_height="wrap_content"
32+
android:layout_margin="10dp"
33+
android:text="车长选择器" />
34+
35+
<Button
36+
android:id="@+id/btCarrierType"
37+
android:layout_width="match_parent"
3938
android:layout_height="wrap_content"
40-
android:layout_marginBottom="8dp"
41-
android:layout_marginEnd="8dp"
42-
android:layout_marginStart="8dp"
43-
android:layout_marginTop="8dp"
44-
android:text="TextView"
45-
app:layout_constraintBottom_toTopOf="@+id/btCarrierType"
46-
app:layout_constraintEnd_toEndOf="parent"
47-
app:layout_constraintStart_toStartOf="parent"
48-
app:layout_constraintTop_toTopOf="parent"/>
39+
android:layout_margin="10dp"
40+
android:text="承运商类型选择器" />
4941

50-
</android.support.constraint.ConstraintLayout>
42+
</LinearLayout>

conditiondialog/src/main/java/com/tick/conditiondialog/carrier/CarrierTypeCdSelector.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@
1414
import com.tick.conditiondialog.ConditionDialogAdapter;
1515
import com.tick.conditiondialog.R;
1616
import com.tick.conditiondialog.ViewUtil;
17-
import com.tick.conditiondialog.vehicle.VehicleCondition;
18-
import com.tick.conditiondialog.vehicle.VehicleConditionSelectListener;
19-
import com.tick.conditiondialog.vehicle.VehicleMeter;
20-
import com.tick.conditiondialog.vehicle.VehicleType;
2117

2218
import java.util.ArrayList;
2319
import java.util.List;
@@ -48,7 +44,8 @@ public CarrierTypeCdSelector(Context context, List<CarrierType> carrierTypes, Ca
4844
TextView title = container.findViewById(R.id.tv_title);
4945
TextView tvCancel = container.findViewById(R.id.tv_cancel);
5046
TextView tvSure = container.findViewById(R.id.tv_sure);
51-
GridView meterGridView = container.findViewById(R.id.gv_carrier_type);
47+
GridView meterGridView = container.findViewById(R.id.gv_condition);
48+
title.setText("承运商类型");
5249
mTypeAdapter = new ConditionDialogAdapter<>(context, list, ConditionDialogAdapter.TYPE_MULTIPLY);
5350
meterGridView.setAdapter(mTypeAdapter);
5451
meterGridView.setOnItemClickListener((parent, view, position, id) -> mTypeAdapter.onCheckItemClick

conditiondialog/src/main/java/com/tick/conditiondialog/vehicle/VehicleCondition.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,30 @@ public VehicleCondition cloneCondition() {
5252
return condition;
5353
}
5454

55+
public ArrayList<VehicleType> cloneVehicleTypes() {
56+
ArrayList<VehicleType> vehicleTypes = new ArrayList<>();
57+
try {
58+
for (VehicleType vehicleType : getVehicleTypes()) {
59+
vehicleTypes.add((VehicleType) vehicleType.clone());
60+
}
61+
} catch (CloneNotSupportedException e) {
62+
e.printStackTrace();
63+
}
64+
return vehicleTypes;
65+
}
66+
67+
public ArrayList<VehicleMeter> cloneVehicleMeters() {
68+
ArrayList<VehicleMeter> vehicleMeters = new ArrayList<>();
69+
try {
70+
for (VehicleMeter vehicleMeter : getVehicleMeters()) {
71+
vehicleMeters.add((VehicleMeter) vehicleMeter.clone());
72+
}
73+
} catch (CloneNotSupportedException e) {
74+
e.printStackTrace();
75+
}
76+
return vehicleMeters;
77+
}
78+
5579
/**
5680
* 获取车型
5781
*
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.tick.conditiondialog.vehicle;
2+
3+
import android.content.Context;
4+
import android.support.v4.content.ContextCompat;
5+
import android.util.DisplayMetrics;
6+
import android.view.Gravity;
7+
import android.view.LayoutInflater;
8+
import android.view.View;
9+
import android.widget.GridView;
10+
import android.widget.PopupWindow;
11+
import android.widget.TextView;
12+
13+
import com.tick.conditiondialog.ConditionDialogAdapter;
14+
import com.tick.conditiondialog.R;
15+
import com.tick.conditiondialog.ViewUtil;
16+
17+
import java.util.ArrayList;
18+
19+
/**
20+
* 车长选择器
21+
* Created by wangcheng on 2017/11/13.
22+
*/
23+
24+
public class VehicleMeterSelector extends PopupWindow {
25+
private VehicleMetersSelectListener mListener;
26+
private ConditionDialogAdapter<VehicleMeter> mMeterAdapter;
27+
private View mTop;
28+
29+
public VehicleMeterSelector(Context context, ArrayList<VehicleMeter> vehicleMeters, VehicleMetersSelectListener
30+
listener, int type) {
31+
mListener = listener;
32+
View container = LayoutInflater.from(context).inflate(R.layout.vehicle_meter_condition_popwindow_layout,
33+
null, false);
34+
mTop = container.findViewById(R.id.v_top);
35+
TextView title = container.findViewById(R.id.tv_title);
36+
TextView tvCancel = container.findViewById(R.id.tv_cancel);
37+
TextView tvSure = container.findViewById(R.id.tv_sure);
38+
39+
title.setText("车长");
40+
GridView meterGridView = container.findViewById(R.id.gv_condition);
41+
mMeterAdapter = new ConditionDialogAdapter<>(context, vehicleMeters, type);
42+
meterGridView.setAdapter(mMeterAdapter);
43+
meterGridView.setOnItemClickListener((parent, view, position, id) -> mMeterAdapter.onCheckItemClick(position));
44+
45+
tvCancel.setOnClickListener(v -> hide());
46+
tvSure.setOnClickListener(v -> {
47+
if (mListener != null) {
48+
VehicleCondition selectedCondition = new VehicleCondition();
49+
selectedCondition.setVehicleMeters(mMeterAdapter.getSelectChilds());
50+
mListener.onSure(selectedCondition.cloneVehicleMeters());
51+
hide();
52+
}
53+
});
54+
//去除点击时的背景色。
55+
title.setHighlightColor(ContextCompat.getColor(context, android.R.color.transparent));
56+
DisplayMetrics metrics = ViewUtil.getDisplayMetrics(context);
57+
setWidth(metrics.widthPixels);
58+
setHeight(metrics.heightPixels - ViewUtil.getStateBarHeight(context));
59+
setContentView(container);
60+
setFocusable(true);
61+
}
62+
63+
public VehicleMeterSelector(Context context, ArrayList<VehicleMeter> vehicleMeters, VehicleMetersSelectListener
64+
listener) {
65+
this(context, vehicleMeters, listener, ConditionDialogAdapter.TYPE_MULTIPLY);
66+
}
67+
68+
public void show(View v) {
69+
showAtLocation(v, Gravity.TOP, 0, 0);
70+
mTop.animate().alpha(1f).setDuration(100).setStartDelay(600);
71+
}
72+
73+
public void hide() {
74+
mTop.setAlpha(0f);
75+
mTop.postDelayed(this::dismiss, 10);
76+
}
77+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.tick.conditiondialog.vehicle;
2+
3+
import java.util.List;
4+
5+
public interface VehicleMetersSelectListener {
6+
void onSure(List<VehicleMeter> vehicleMeters);
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.tick.conditiondialog.vehicle;
2+
3+
import java.util.List;
4+
5+
public interface VehicleTypeSelectListener {
6+
void onSure(List<VehicleType> vehicleTypes);
7+
}

0 commit comments

Comments
 (0)