2013-08-02 3 views
1

У меня есть ExpandableListView и внутри каждой родительской строки.Внутри ListView многократный toggleButton работает, нажав один toggleButton

У меня есть ToggleButton, когда я включаю одну тумблерную кнопку, при прокрутке ниже я получаю несколько кнопок toggleButton. Почему это происходит, я получаю groupPosition все правильно в моем журнале?

вот мой код:

public class WifiAPListAdapter extends BaseExpandableListAdapter { 

    private WifiAPListActivity context; 
    public ArrayList<ExpandListGroup> groups; 
    private WifiManager wifiManager; 
    WifiStatus checkWifiStatus; 
    public ToggleButton togglebtn; 
    int pos; 
    Holder holder; 
    int previousPosition = -1; 
    private static final int CHILD_COUNT = 1; 

    public WifiAPListAdapter(WifiAPListActivity context, 
      ArrayList<ExpandListGroup> result) { 
     this.context = context; 
     this.groups = result; 
     wifiManager = (WifiManager) context 
       .getSystemService(Context.WIFI_SERVICE); 
     checkWifiStatus = new WifiStatus(context); 

    } 

    public Object getChild(int groupPosition, int childPosition) { 

     return groups.get(groupPosition); 

    } 

    public long getChildId(int groupPosition, int childPosition) { 
     return groupPosition; 
    } 

    public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View view, ViewGroup parent) { 
     previousPosition = groupPosition; 
     ExpandListGroup child = (ExpandListGroup) getChild(groupPosition, 
       groupPosition); 
     // Log.i("", "getChildView: "+childPosition); 
     if (view == null) { 
      holder = new Holder(); 
      LayoutInflater infalInflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = infalInflater.inflate(R.layout.list_child_item, null); 
      holder.label_ssid = (TextView) view.findViewById(R.id.label_ssid); 
      holder.tv_ssid = (TextView) view.findViewById(R.id.tvssid); 
      holder.label_bssid = (TextView) view.findViewById(R.id.label_bssid); 
      holder.tv_bssid = (TextView) view.findViewById(R.id.tvbssid); 
      holder.label_capabilities = (TextView) view 
        .findViewById(R.id.label_capabilities); 
      holder.tv_capabilities = (TextView) view 
        .findViewById(R.id.tvcapabilities); 
      holder.label_signalStrength = (TextView) view 
        .findViewById(R.id.label_signalstrength); 
      holder.tv_signalStrength = (TextView) view 
        .findViewById(R.id.tvsignalstrength); 
      holder.wifi_signalimg = (ImageView) view.findViewById(R.id.signal); 

      view.setTag(holder); 
     } else { 
      holder = (Holder) view.getTag(); 

     } 

     // *********************setting data to the child list************** 

     holder.tv_ssid.setText(child.getSSID()); 
     holder.tv_bssid.setText(child.getBSSID()); 
     holder.tv_capabilities.setText(child.getCapabilities()); 
     holder.tv_signalStrength.setText(child.getData()); 

     Bitmap bitmap = setSignalImage(Integer.parseInt(child.getData())); 
     holder.wifi_signalimg.setImageBitmap(bitmap); 

     return view; 
    } 

    public int getChildrenCount(int groupPosition) { 
     Log.i("", "getChildrenCount: " + groupPosition); 

     return CHILD_COUNT; 

    } 

    public Object getGroup(int groupPosition) { 
     return groups.get(groupPosition); 
    } 

    public int getGroupCount() { 
     Log.i("", "getGroupCount: " + groups.size()); 
     return groups.size(); 
    } 

    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    public View getGroupView(int groupPosition, boolean isLastChild, View view, 
      ViewGroup parent) { 

     Log.i("", "getGroupView: " + groupPosition); 
     if (view == null) { 
      holder = new Holder(); 
      LayoutInflater inf = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inf.inflate(R.layout.list_parent_items, null); 

      holder.tv_ssid = (TextView) view.findViewById(R.id.ssid); 
      holder.tv_bssid = (TextView) view.findViewById(R.id.bssid); 
      holder.btn_toggle = (ToggleButton) view.findViewById(R.id.togBtn); 

      // holder.btn_toggle.setTag(groups.get(groupPosition).getBSSID()); 

      view.setTag(holder); 
     } else { 
      holder = (Holder) view.getTag(); 
     } 
     // holder.btn_toggle.setTag(groups.get(groupPosition).getBSSID()); 
     holder.tv_ssid.setText(groups.get(groupPosition).getSSID()); 
     holder.tv_bssid.setText(groups.get(groupPosition).getBSSID()); 

     return view; 
    } 

    public void toggle(View v) { 
     if (holder.btn_toggle.isChecked()) { 
     } 
     Log.i("", "toggle"); 
    } 

    public boolean hasStableIds() { 
     return true; 
    } 

    public boolean isChildSelectable(int arg0, int arg1) { 
     return true; 
    } 

любой орган может сказать, хороший способ, чтобы избежать этой проблемы, не снимая держатель, потому что если я бы п число элементов, то его не очень хорошая идея, чтобы нарисовать вид каждый раз, когда мы должны использовать держатель.

ответ

0

удалить держатель и закрыть, если цикл для раздувания, как я закрыл, также использовать логику для переключения внутри getGroupView. Потому что каждый раз, когда вы просматриваете список, getGroupView вызывается так каждый раз, когда этот метод должен проверять условие.

private WifiAPListActivity context; 
    public ArrayList<ExpandListGroup> groups; 
    private WifiManager wifiManager; 
    WifiStatus checkWifiStatus; 
    public ToggleButton togglebtn; 
    int pos; 
    Holder holder; 
    int previousPosition = -1; 
    private static final int CHILD_COUNT = 1; 

    public WifiAPListAdapter(WifiAPListActivity context, 
      ArrayList<ExpandListGroup> result) { 
     this.context = context; 
     this.groups = result; 
     wifiManager = (WifiManager) context 
       .getSystemService(Context.WIFI_SERVICE); 
     checkWifiStatus = new WifiStatus(context); 

    } 

    public Object getChild(int groupPosition, int childPosition) { 

     return groups.get(groupPosition); 

    } 

    public long getChildId(int groupPosition, int childPosition) { 
     return groupPosition; 
    } 

    public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View view, ViewGroup parent) { 
     previousPosition = groupPosition; 
     ExpandListGroup child = (ExpandListGroup) getChild(groupPosition, 
       groupPosition); 
     // Log.i("", "getChildView: "+childPosition); 
     if (view == null) { 
      holder = new Holder(); 
      LayoutInflater infalInflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = infalInflater.inflate(R.layout.list_child_item, null); 
      } 
      label_ssid = (TextView) view.findViewById(R.id.label_ssid); 
      tv_ssid = (TextView) view.findViewById(R.id.tvssid); 
      label_bssid = (TextView) view.findViewById(R.id.label_bssid); 
      tv_bssid = (TextView) view.findViewById(R.id.tvbssid); 
      label_capabilities = (TextView) view 
        .findViewById(R.id.label_capabilities); 
      tv_capabilities = (TextView) view 
        .findViewById(R.id.tvcapabilities); 
      label_signalStrength = (TextView) view 
        .findViewById(R.id.label_signalstrength); 
      tv_signalStrength = (TextView) view 
        .findViewById(R.id.tvsignalstrength); 
      wifi_signalimg = (ImageView) view.findViewById(R.id.signal); 



     // *********************setting data to the child list************** 

     tv_ssid.setText(child.getSSID()); 
     tv_bssid.setText(child.getBSSID()); 
     tv_capabilities.setText(child.getCapabilities()); 
     tv_signalStrength.setText(child.getData()); 

     Bitmap bitmap = setSignalImage(Integer.parseInt(child.getData())); 
     wifi_signalimg.setImageBitmap(bitmap); 

     return view; 
    } 

    public int getChildrenCount(int groupPosition) { 
     Log.i("", "getChildrenCount: " + groupPosition); 

     return CHILD_COUNT; 

    } 

    public Object getGroup(int groupPosition) { 
     return groups.get(groupPosition); 
    } 

    public int getGroupCount() { 
     Log.i("", "getGroupCount: " + groups.size()); 
     return groups.size(); 
    } 

    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    public View getGroupView(int groupPosition, boolean isLastChild, View view, 
      ViewGroup parent) { 

     Log.i("", "getGroupView: " + groupPosition); 
     if (view == null) { 
      holder = new Holder(); 
      LayoutInflater inf = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inf.inflate(R.layout.list_parent_items, null); 
     } 

      tv_ssid = (TextView) view.findViewById(R.id.ssid); 
      tv_bssid = (TextView) view.findViewById(R.id.bssid); 
      btn_toggle = (ToggleButton) view.findViewById(R.id.togBtn); 

      // holder.btn_toggle.setTag(groups.get(groupPosition).getBSSID()); 



     // holder.btn_toggle.setTag(groups.get(groupPosition).getBSSID()); 
     tv_ssid.setText(groups.get(groupPosition).getSSID()); 
     tv_bssid.setText(groups.get(groupPosition).getBSSID()); 

     return view; 
    } 

    public void toggle(View v) { 
     if (btn_toggle.isChecked()) { 
     } 
     Log.i("", "toggle"); 
    } 

    public boolean hasStableIds() { 
     return true; 
    } 

    public boolean isChildSelectable(int arg0, int arg1) { 
     return true; 
    } 
+0

он работает, но теперь при прокрутке состояния на нем не сохраняется, он снова отключился. –

+0

- это кнопка переключения динамика или static.ie будет ли этот список содержать изменения – Ruban

+0

это динамический, toggleButton - это элемент родительского, а не дочернего, поэтому зачем мне проверять внутри getChildView, я не получил вас, пожалуйста, объясните подробнее ? –

0

Это происходит из-за механизма рециркуляции видов. Я написал blog post за то же самое с учетом ListView.

Если вы не знаете об утилизации видов, возможно, вы должны прочитать this blog, чтобы получить точное представление о том, как работает рециркуляция обзора!

Смежные вопросы