- Forum-Beiträge: 90
18.01.2012, 13:07:02 via Website
18.01.2012 13:07:02 via Website
ich versuch nun schon seit zwei Tagen mir einen ExpandableListView zusammen zu basteln in welchem ich auf Konopdruck einen Eintrag rausnehmen kann. Es handelt sich hierbei um eine CheckBox mit der Beschriftung "Liefer- und Rechnungsadresse identisch". Wenn diese CheckBox aktiviert ist, soll die Vie für die Rechnungsadresse nicht angezeigt werden. Das ganze funktioniert nun auch wunderbar bis auf ein paar kleinere Fehler, nämlich das die oberste View in welcher die CheckBox ist (die für die Lieferadresse) manchmal einige Klicks nicht entgegen nimmt. Allerdings nur bei CheckBoxen und RadioButtons, bei Textfeldern funktioniert alles immer tadellos.
Ich poste euch mal ein bisschen Quellcode dazu und hoffe das mir hierbei jemand helfen kann, ich weiß nämlich nicht mehr woran dasl iegen könnte. =/
Das hier ist die CheckBox welche dafür zuständig sein wird das die Rechnungsadressen-View ausgeblendet wird
2 if(sameAdressCheckBox == null) {
3 checkBoxLayout = new LinearLayout(parent.getContext(), null);
4 checkBoxLayout.setFocusable(false);
5 checkBoxLayout.setFocusableInTouchMode(false);
6 checkBoxLayout.setLayoutParams(new LayoutParams(android.view.ViewGroup.LayoutParams.FILL_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
7 checkBoxLayout.setWeightSum(1.0f);
8 checkBoxLayout.setPadding(0, (int)(2 * parent.getResources().getDisplayMetrics().density + 0.5f), 0, (int)(2 * parent.getResources().getDisplayMetrics().density + 0.5f));
9 sameAdressCheckBox = new CheckBox(parent.getContext());
10 sameAdressCheckBox.setText("Liefer- und Rechnungsadresse sind identisch");
11 sameAdressCheckBox.setBackgroundColor(0xFFFFFFFF);
12 sameAdressCheckBox.setTextColor(0xFF000000);
13 sameAdressCheckBox.setTextSize(TypedValue.COMPLEX_UNIT_PT, 5);
14 sameAdressCheckBox.setButtonDrawable(R.drawable.check_box_selector_1);
15 LinearLayout.LayoutParams lp = new LayoutParams(0, LinearLayout.LayoutParams.FILL_PARENT);
16 lp.setMargins((int)(10 * parent.getResources().getDisplayMetrics().density + 0.5f), 0,0,0);
17 lp.weight = 1;
18 sameAdressCheckBox.setLayoutParams(lp);
19 sameAdressCheckBox.setPadding((int)(20 * parent.getResources().getDisplayMetrics().density + 0.5f), (int)(10 * parent.getResources().getDisplayMetrics().density + 0.5f), (int)(5 * parent.getResources().getDisplayMetrics().density + 0.5f), (int)(10 * parent.getResources().getDisplayMetrics().density + 0.5f));
20 sameAdressCheckBox.setClickable(true);
21 sameAdressCheckBox.setFocusable(false);
22 sameAdressCheckBox.setFocusableInTouchMode(false);
23
24 sameAdressCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
25
26 @Override
27 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
28 sameAdressCheckBox.setChecked(isChecked);
29 if(listener != null)
30 listener.onSameAdressClicked(isChecked);
31
32 }
33 });
34 isAdressSame = sameAdressCheckBox.isChecked();
35
36 checkBoxLayout.addView(sameAdressCheckBox);
37 }
38
39
40 return checkBoxLayout;
41 }
Hier überschreibe ich die Methode getGroupCount(), da wenn ich eine Gruppe ausblende (die für die Rechnungsadresse), gibt es ja logischerweise eine Gruppe weniger
2 public int getGroupCount() {
3 if(isAdressSame())
4 return super.getGroupCount() - 1;
5 else
6 return super.getGroupCount();
7 }
Hier überschreibe ich nun die Methode getGroupView() damit ich auch für die einzelnen Gruppen trotzdem noch die richtige Überschrift erhalte, auch wenn mitten drin eine View nun fehlt
2 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
3 View v;
4 switch (groupPosition) {
5 case 0:
6 isFirstExpanded = isExpanded;
7 break;
8 case 1:
9 if(isAdressSame()) {
10 isThirdExpanded = isExpanded;
11 v = super.getGroupView(groupPosition+1, isThirdExpanded, convertView, parent);
12 } else {
13 isSecondExpanded = isExpanded;
14 v = super.getGroupView(groupPosition, isSecondExpanded, convertView, parent);
15 }
16 v.setFocusable(false);
17 v.setFocusableInTouchMode(false);
18 return v;
19 case 2:
20 isThirdExpanded = isExpanded;
21 break;
22 }
23
24 v = super.getGroupView(groupPosition, isExpanded, convertView, parent);
25 v.setFocusable(false);
26 v.setFocusableInTouchMode(false);
27 return v;
28 }
Und hier überschreibe ich letzendlich die Methode getChildView(), da ja auch je nach dem ob beide Adressen gleich sind oder nicht auch eine Childiew weniger angezeigt wird
2 public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, final ViewGroup parent) {
3 switch(groupPosition) {
4 case 0:
5 convertView = getLieferAdressEingabe(parent);
6 break;
7 case 1:
8 if(!isAdressSame()) {
9 convertView = getRechnungsAdressEingabe(parent);
10 break;
11 }
12 case 2:
13 convertView = getProfilVorteileView(parent);
14 break;
15 default:
16 convertView = new LinearLayout(parent.getContext());
17 }
18
19 convertView.setFocusable(false);
20 convertView.setFocusableInTouchMode(false);
21 return convertView;
22 }
Und hier zeichne ich die View neu wenn die CheckBox verändert worden ist
2 isAdressSame = isSame;
3 notifyDataSetChanged();
4 }
Wie gesagt, es gibt nur Probleme in der View für die Lieferadresse, mit der Rechnungsadresse klappt alles einwandfrei (soweit sie natürlich auch eingeblendet ist). Lieferadresse und Rechnungsadresse sind bis auf die CheckBox komplett gleich (beide greifen auf das selbe XML-Layout zurück) und damit haben auch beide RadioButtons zum wählen der Anrede (Herr, Frau, Firma). Diese können überall wunderbar angewählt werden, nur bei der View mit der Lieferadresse wo die CheckBox integriert ist funktioniert es irgendwann nicht mehr. Nachdem man dann ein wenig in den anderen Views des ExpandableListViews umher geklickt hat, funktioniert es dann eigentlich auch immer =/
Komplexes Problem und ich find den Fehler einfach nicht, hoffe ihr wisst da mehr als ich :'(
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.