2015-10-14 12 views
5

Próbuję uzyskać dostęp do widoku tekstowego GroupView, który pokazuje liczbę zaznaczonych pól w widoku ChildView. enter image description hereUzyskiwanie dostępu do widoku TextView z widoku grupowego getChildView() z ExpandableListView

Dla np. - Północ to GroupView, a lista poniżej z polem wyboru to ChildView. Chcę zaktualizować licznik (18) za pomocą każdego kliknięcia pola wyboru. Zastosowałem pole wyboru OnClickListner na polu wyboru. Mam niestandardowy ExpanadableListViewAdapter rozszerza BaseExpandableListAdapter.

Tu jest mój urywek kodu -

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.filter_expandable_list_group, 
       parent, false); 

     groupViewHolder = new GroupViewHolder(); 

     groupViewHolder.GroupName = (TextView) convertView.findViewById(R.id.group_name); 
     groupViewHolder.GroupCount = (TextView) convertView.findViewById(R.id.group_count); 
     groupViewHolder.rightArrow = (ImageView) convertView.findViewById(R.id.right_arrow); 

     convertView.setTag(groupViewHolder); 
    }else{ 
     groupViewHolder = (GroupViewHolder) convertView.getTag(); 
    } 
    groupViewHolder.GroupName.setText(((OutletListData) getGroup(groupPosition)).getName()); 
    groupViewHolder.GroupCount.setText(""+((OutletListData) getGroup(groupPosition)).getOutletDatas().size()); 

    return convertView; 
} 

@Override 
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, final ViewGroup parent) { 
    if (convertView == null) { 
     convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.filter_expandable_list_child, 
       parent, false); 

     childViewHolder = new ChildViewHolder(); 

     childViewHolder.childTextView = (TextView) convertView.findViewById(R.id.text1); 
     childViewHolder.childCheckBox = (CheckBox) convertView.findViewById(R.id.checkbox); 

     convertView.setTag(childViewHolder); 
    }else{ 
     childViewHolder = (ChildViewHolder) convertView.getTag(); 
    } 

    childViewHolder.childTextView.setText(((OutletData) getChild(groupPosition, childPosition)).getDealerName()); 
    childViewHolder.childCheckBox.setChecked(((OutletData) getChild(groupPosition, childPosition)).getSelected() == "1"); 
    childViewHolder.childCheckBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      boolean isChecked = ((CheckBox) v).isChecked(); 
      ApplicationController.getEventBus().post(((OutletData) getChild(groupPosition, childPosition)).getOutletID()); 
      if (isChecked) { 
       ((OutletData) getChild(groupPosition, childPosition)).setSelected("1"); 
      } else { 
       ((OutletData) getChild(groupPosition, childPosition)).setSelected("0"); 
      } 
     } 
    }); 
    return convertView; 
} 

Odpowiedz

3

pierwsze, wziąć przykład prostego widoku listy, nie rozszerzalna widoku listy. ListView jest kontenerem, który zawiera kilka przedmiotów.
Każdy z tych elementów ma widoki podrzędne, które składają się z poszczególnych elementów składających się na wiersz w widoku listy. tj. różne widoki tekstowe itp.
Adapter getView() adaptera działa na zestawie danych, a następnie tworzy elementy na liście. Jeśli więc zmienisz zestaw danych używany do utworzenia adaptera i wywołasz metodę notifyDatasetChanged(), to zaktualizuje ona widok listy.

Teraz w twoim przypadku, Możesz używać ArrayList do reprezentowania obiektów takich jak "NORTH". Jeśli więc przechowujesz wartość zliczania w tym obiekcie, to aktualizacja wartości będzie łatwa. Wystarczy uzyskać dostęp do danych na liście, używając funkcji groupPosition i zaktualizować ją. I zadzwoń do notifyDatasetChanged.

powiedzmy użyłeś mList który jest ArrayList typu Object, aby stworzyć adapter

// ArrayList<Object> mList; 
// You created mAdapter from this mList 
// now mList is data set for this adapter 

Więc w getChildView() piszesz:

@Override 
    public void onClick(View v) { 
     boolean isChecked = ((CheckBox) v).isChecked(); 
     ApplicationController.getEventBus().post(((OutletData) getChild(groupPosition, childPosition)).getOutletID()); 
     if (isChecked) { 
      // your code 
      int count = ((OutletListData) getGroup(groupPosition)).getCount(); 
      count++; 
      ((OutletListData) getGroup(groupPosition)).setCount(count); 
      notifyDataSetChanged(); 
     } else { 
      // your code; 
      int count = ((OutletListData) getGroup(groupPosition)).getCount(); 
      count--; 
      ((OutletListData) getGroup(groupPosition)).setCount(count); 
      notifyDataSetChanged(); 

     } 
    } 

Teraz jedynym ograniczeniem tej metody jest ten licznik powinien być częścią Obiektu. Jeśli więc zainicjujesz liczenie po raz pierwszy z jakiegoś innego miejsca, ale nie z samego obiektu, zalecam zapisanie liczby w samym obiekcie i zainicjowanie wartości textView z tego miejsca.
Więc w getGroupView()

groupViewHolder.GroupCount.setText(""+((OutletListData) getGroup(groupPosition)).getCount()); 
+2

jasne i zwięzłe odpowiedzi! –

Powiązane problemy