在Android ListView中查看不重绘

时间:2015-09-18 09:31:23

标签: android listview

我有一个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()似乎是真的,但是当我将背景设置为RED时,UI不会更新。有谁知道这里出了什么问题?我此刻一无所知。

6 个答案:

答案 0 :(得分:2)

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

因此,您应首先根据与该职位相关的数据部分以及进一步使用后更新复选框

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您调试代码,我认为if(holder.checkbox.isChecked()) {此行将始终返回false。这是因为您已经覆盖CheckBox的默认点击事件,应该在点击时切换检查状态,但是在您重写后,您忽略了切换检查状态,这就是为什么即使您发出notifyDatasetChanged后,背景也无法更改为红色。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

首先,您需要记住列表中的哪些项目已被检查,哪些项目未被检查。为此,您可以使用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事件是否为您提供选中状态 - 您可以需要适当地添加否定。

答案 5 :(得分:0)

简单!.. 您在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;
    }



}

我认为这对你有帮助!