【问题标题】:Toggle button in a list view loose their state when scrolled of screen in Android在 Android 中滚动屏幕时,列表视图中的切换按钮会失去其状态
【发布时间】:2011-01-17 11:04:21
【问题描述】:

我有一个列表视图,其中每个数据都是从列表适配器获取的。 列表视图中的每个项目都包含一个文本视图和切换按钮。 但是当我滚动列表时出现问题。切换按钮的选中状态发生了变化,即如果我在索引 4 处选择了一个切换按钮,那么在滚动后我发现除了第四个之外的任何随机按钮都被选中。

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    如果你仍然没有得到任何解决方案,请试试这个 getview 方法.. // switchState[] 是一个布尔数组。

    public View getView(int position, View convertView, ViewGroup parent) {
               ViewHolder holder = new ViewHolder();
             // mSwitchButton = (ToggleButton) findViewById(R.id.switchButton);
            if(convertView == null) {
                convertView = mInflator.inflate(R.layout.settings_item_cell, parent, false);
                holder.categoryName =
                        (TextView) convertView.findViewById(R.id.categoryType);
                convertView.setTag(holder);
                holder.switchButton  = (ToggleButton) convertView.findViewById(R.id.switchButton); 
            }
            else {
                holder = (ViewHolder) convertView.getTag();
    
    
            }
    
                holder.switchButton.setOnClickListener(new View.OnClickListener() {
    
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
    
                        int index =  (Integer) v.getTag();
                        Log.v("tag of switch============",""+index);
                        if(((ToggleButton) v).isChecked()) {
                            switchState[index] = true; 
                            ((ToggleButton) v).setButtonDrawable(R.drawable.item_selected);
    
                        }
                        else {
                            ((ToggleButton) v).setButtonDrawable(R.drawable.item_deselected);
                            switchState[index] =false; 
                        }
                        isToggleButtonClicked = true;
    
                    }
                });  
                if(switchState[position])   
                    holder.switchButton.setButtonDrawable(R.drawable.item_selected);
                else
                    holder.switchButton.setButtonDrawable(R.drawable.item_deselected);
    
            holder.categoryName.setText(categories[position]);
            holder.switchButton.setTag(new Integer(position));
    
            return convertView;
    
        }
    

    【讨论】:

      【解决方案2】:

      由于行被回收,您需要维护自己的状态,在修改时保存和恢复您的ToggleButton 状态。 Here is a sample project 演示在行中使用 RatingBarToggleButton 也应遵循相同的基本流程。

      【讨论】:

      • 当我尝试在 ToggleButton 上执行此操作时,其上的文本会向上移动到顶部项目,同时向下滚动
      【解决方案3】:

      我知道这是一个非常古老的线程,但我找到的问题答案并不是很好。我花了一些时间从两个答案中得到一个可行的解决方案。我只是想分享工作代码,如果有其他菜鸟试图弄清楚在滚动时如何保持切换按钮的状态。

      private class MyListAdapter extends ArrayAdapter<Product> {
           boolean [] switchState= new boolean[100] ;
          public MyListAdapter() {
              super(ProductSelectActivity.this, R.layout.item_view, myProducts);
          }
      
      public View getView( int position, View convertView, ViewGroup parent) {
              // Make sure we have a view to work with (may have been given null)
      
              ViewHolder holder;
      
              View itemView = convertView;
              if (itemView == null) {
                  itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
                  View row= itemView;
                  holder= new ViewHolder(row);
                  itemView.setTag(holder);
                  holder.switchButton  = (ToggleButton) itemView.findViewById(R.id.favorite_button); 
      
              }
              else
              {
                  holder = (ViewHolder) itemView.getTag();
      
              }
      
      
              holder.switchButton.setOnClickListener(new View.OnClickListener() {
      
                  public void onClick(View v) {
                      // TODO Auto-generated method stub
      
                      int index =  (Integer) v.getTag();
      
                      if(((ToggleButton) v).isChecked()) {
                          switchState[index] = true; 
                          ((ToggleButton) v).setBackgroundResource(android.R.drawable.btn_star_big_on);
      
                      }
                      else {
                          ((ToggleButton) v).setBackgroundResource(android.R.drawable.btn_star_big_off);
                          switchState[index] =false; 
                      }
      
                  }
              });
              if(switchState[position])   
                  holder.switchButton.setBackgroundResource(android.R.drawable.btn_star_big_on);
      
              else
                  holder.switchButton.setBackgroundResource(android.R.drawable.btn_star_big_off);
      
          //holder.categoryName.setText(categories[position]);
          holder.switchButton.setTag(Integer.valueOf(position));
      

      ViewHolder.class

      public class ViewHolder {
      ToggleButton switchButton=null;
      
        ViewHolder(View base) {
          this.switchButton=(ToggleButton)base.findViewById(R.id.favorite_button);
        }
      
      }
      

      此代码编译。

      【讨论】:

        猜你喜欢
        • 2013-12-04
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多