【问题标题】:View in Android ListView not redrawing在 Android ListView 中查看不重绘
【发布时间】:2015-09-18 09:31:23
【问题描述】:

我有一个 Android ListView,其中包含一个需要在单击时检查的按钮。点击事件似乎正在工作:

public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;

    LayoutInflater inflater = this._context.getLayoutInflater();

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.checkbox_cell, null);
        holder = new ViewHolder();
        holder.checkbox = (CheckBox) convertView.findViewById(R.id.button);
        holder.textView = (TextView) convertView.findViewById(R.id.textView);
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }


    if(holder.checkbox.isChecked()) {
        convertView.setBackgroundColor(Color.RED);
        holder.textView.setBackgroundColor(Color.RED);
        convertView.invalidate();
    } else {
        convertView.setBackgroundColor(Color.GREEN);
    }

    holder.checkbox.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            Arrays.sort(_context.checkBoxIds);
            int index = Arrays.binarySearch(_context.checkBoxIds, position);

            if (((CheckBox) v).isChecked()) {
                holder.textView.setPaintFlags(holder.textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

            } else {
                holder.textView.setPaintFlags(holder.textView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
            }
            holder.textView.setBackgroundColor(Color.RED);
            notifyDataSetChanged();

        }
    });

    return convertView;
}

您可能会看到我将背景更改为绿色初始,当我单击“复选框”时,背景需要为红色(这只是测试 UI 是否更新)。我试图更新onClick 中的视图,但这也不起作用。在onClick 之后,我调用notifyDataSetChanged() 以查看刷新时UI 是否发生变化。 holder.checkbox.isChecked() 似乎是真的,但是当我将背景设置为红色时,用户界面不会更新。有谁知道这里出了什么问题?我现在一头雾水。

【问题讨论】:

  • 您的代码中是否有 @Override 注释,而您只是忘记为您的 onClickListener 发帖?
  • 啊,是的,忘记发了。有覆盖:)
  • @LeonBoon : notifyDataSetChanged() 将要求 Listview 重绘视图,因此当它重绘自身时,它将引用一个新的 holder.checkbox.isChecked(),默认情况下为 false(猜),因此不会出现红色背景色。
  • 请尝试使您想要更改背景的所有视图无效。例如,您说的是 convertView.setBackgroundColor(Color.GREEN);但是您并没有通过说 convertView.invalidate(); 来使其无效
  • 当你点击复选框时它会被切换吗?

标签: android listview


【解决方案1】:

您应该根据您的数据表示来更新视图。但是,您正在根据以前从未设置的复选框视图状态更新视图。

所以你应该首先根据与职位相关的部分数据更新复选框,然后进一步使用它

【讨论】:

    【解决方案2】:

    您可以在适配器内部定义接口以监听复选框单击并在 Checkbox 上使用 setTag() 并在 Fragment 或 Activity 上实现该接口并在 Activity 或 Fragment 中定义您的定义。

    【讨论】:

      【解决方案3】:

      如果你调试你的代码,我认为if(holder.checkbox.isChecked()) { 这一行总是会返回false。那是因为您已经覆盖了CheckBox 的默认点击事件,单击它时应该切换检查状态,但是在覆盖后,您忽略了切换检查状态,这就是为什么背景不能更改为即使在您发出notifyDatasetChanged 之后也是如此。

      所以请尝试将holder.checkbox.setChecked(!checkbox.isChecked()); 添加到OnClickListener 的第一行,看看是否有帮助。

      【讨论】:

        【解决方案4】:

        android:clickable="true" 请在 xml 中添加此游览复选框,然后尝试使用您的代码,当您对适配器执行某些操作时,您需要使用此更新。

        【讨论】:

          【解决方案5】:

          首先,您需要记住列表中的哪些项目已检查,哪些未检查。为此,您可以使用SparseBooleanArray。

          然后在getView 中,您需要根据是否选中适当地设置视图。

          最后,当有人点击复选框时,您需要更新数组。

          public class MyAdapter extends BaseAdapter {
          
           private SparseBooleanArray checkedItems = new SparseBooleanArray();
          
              public View getView(final int position, View convertView, ViewGroup parent) {
                  final ViewHolder holder;
          
                  LayoutInflater inflater = this._context.getLayoutInflater();
          
                  if (convertView == null) {
                      // ...
                  } else {
                      // ...
                  }
          
                  holder.checkbox.setOnClickListener(null); // You may be reusing views, so avoid firing previous listener set
          
                  holder.checkbox.setChecked(checkedItems.get(position, false));  // Set checked value for the checkbox based on your checked items array
          
                  if(holder.checkbox.isChecked()) {
                     // Do your stuff
                  } else {
                     // Do your stuff
                  }
          
                  holder.checkbox.setOnClickListener(new View.OnClickListener() {
                      public void onClick(View v) {
          
                          checkedItems.put(position, ((CheckBox) v).isChecked()); // (!)
                          // do stuff
                      }
                  });
          
                  return convertView;
              }
          }
          

          我用(!) 标记了一行,因为我不记得复选框上的onClick 事件是否为您提供旧 或新 选中状态-您可能需要添加否定适当的。

          【讨论】:

            【解决方案6】:

            很简单!.. 在notifyDataSetChanged(); 之后找不到相同的控件,因为此函数刷新视图调用。

             public View getView(final int position, View convertView, ViewGroup parent) {
            return convertView;
            }
            

            因此您无法获得刷新所有视图的复选框的相同状态。

            您需要使用任何活页夹类来查找检查状态作为数据部分。

            当您点击时,您会创建一个数据状态。

                List<CheckState> checkState=new ArrayList<CheckState>();// as an instance 
            
            
            holder.checkbox.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
            
                         if (((CheckBox) v).isChecked()) {
            
             checkState.add(new CheckState(true);
            
                   } else{
            
                        checkState.add(position,false); 
            
                    }
                });
            
            
            
            
            
             if(checkState.get(position).isChecked())
               {
                    convertView.setBackgroundColor(Color.RED);
                    holder.textView.setBackgroundColor(Color.RED);
                    convertView.invalidate();
                } else {
                    convertView.setBackgroundColor(Color.GREEN);
                }
            

            示例:- 创建一个内部类

                public class CheckState {
            
                boolean isChecked;
            
                public CheckState(boolean isChecked) {
            
                    this.isChecked = isChecked;
                }
            
                public boolean isChecked() {
                    return isChecked;
                }
            
            
            
            }
            

            我觉得对你有帮助!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-10-01
              • 1970-01-01
              • 1970-01-01
              • 2020-02-16
              • 2011-01-03
              • 1970-01-01
              • 1970-01-01
              • 2016-09-20
              相关资源
              最近更新 更多