【问题标题】:When scroll down the listView, the counter for checked box decrease but the position of checked box remain same向下滚动listView时,复选框的计数器减少但复选框的位置保持不变
【发布时间】:2016-11-21 06:57:41
【问题描述】:

我有一个DeleteAdapter,listView 的每一行都由textView 和checkBox 组成。 我还有一个 DeleteTask,它由一个按钮组成,用于计算 DeleteAdapter 中的复选框总数。

删除任务

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.delete_task);
        delete = (Button)findViewById(R.id.delete);
        adapter = new DeleteAdapter(getApplication(), search, listview,delete);
       }

删除适配器

public class DeleteAdapter extends BaseAdapter {

    private static ArrayList<SearchList> search;
    private LayoutInflater mInflater;
    ListView listview;
    Button delete;
    private static int checkBoxCounter = 0;

    public DeleteAdapter(Context context, ArrayList<SearchList> searchList, ListView listview,Button delete) {
        search=searchList;
        delete=delete;
        this.listview=listview;
        mInflater = LayoutInflater.from(context);

    }
    public int getCount() {
        return search.size();
    }

    public SearchList getItem(int position) {
        return search.get(position);
    }

    public long getItemId(int position) {
        return 0;
    }

    public void removeItem(int position) {
        search.remove(position);
        this.notifyDataSetChanged();
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        //delete =(Button)convertView.findViewById(R.id.delete);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.delete_task_with_edittext, null);
            holder = new ViewHolder();
            holder.text = (TextView) convertView.findViewById(R.id.task_title);
            holder.time = (TextView) convertView.findViewById(R.id.time);
            holder.date = (TextView) convertView.findViewById(R.id.date);
            holder.ckbox = (CheckBox) convertView.findViewById(R.id.checkBox);
            holder.ckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(buttonView.isChecked()) {
                        int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                        search.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
                        checkBoxCounter ++;
                    }
                    else
                    {
                        checkBoxCounter--;
                    }
                    delete.setText(checkBoxCounter+"");
                }

            });
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.ckbox.setTag(position);
        holder.text.setText(search.get(position).getTitle());
        holder.time.setText(search.get(position).getTime());
        holder.date.setText(search.get(position).getDate());
        holder.ckbox.setChecked(search.get(position).isSelected());
        return convertView;

    }

    static class ViewHolder {
        TextView text,time,date;
        CheckBox ckbox;

    }
}

当我点击复选框时,我会在delete.setText(checkBoxCounter+""); 行得到 nullPointerException 错误,但我已经在 DeleteTask 中声明了它。有人知道我该如何解决吗?

全栈跟踪

11-21 01:12:24.005    5695-5695/com.example.seng.healthyapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at com.example.seng.healthyapp.adapter.DeleteAdapter$1.onCheckedChanged(DeleteAdapter.java:90)
            at android.widget.CompoundButton.setChecked(CompoundButton.java:126)
            at android.widget.CompoundButton.toggle(CompoundButton.java:87)
            at android.widget.CompoundButton.performClick(CompoundButton.java:99)
            at android.view.View$PerformClick.run(View.java:17660)
            at android.os.Handler.handleCallback(Handler.java:800)
            at android.os.Handler.dispatchMessage(Handler.java:100)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5433)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:924)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691)
            at dalvik.system.NativeStart.main(Native Method)

我遇到了另一个问题。当我单击前三个复选框时,按钮 setText 显示 3。但是当我向下滚动时,计数器会减少。

【问题讨论】:

  • 在构造函数中你应该使用 this.delete = delete
  • @VictorV。谢谢,你知道为什么当我向下滚动listView时,计数器的数量会减少吗?
  • 你必须了解recyclerview如何工作。它不会一次创建所有列表项,它只创建并保留可见项。
  • @VictorV。你有什么解决办法吗?
  • 我认为这可以帮助stackoverflow.com/questions/17372750/…监听器调用onCheckChange方法时注意。

标签: android listview checkbox nullpointerexception


【解决方案1】:

在适配器中更新您的代码

 public DeleteAdapter(Context context, ArrayList<SearchList> searchList, ListView listview,Button delete) {
    search=searchList;
    this.delete=delete;
    this.listview=listview;
    mInflater = LayoutInflater.from(context);

}

【讨论】:

    【解决方案2】:

    在你适配器的构造函数中:

    public DeleteAdapter(Context context, ArrayList<SearchList> searchList, ListView listview,Button delete) {
        search=searchList;
        delete=delete;
        this.listview=listview;
        mInflater = LayoutInflater.from(context);
    
    }
    

    您将删除分配给删除,这不会初始化您的实例变量删除。这给它一个默认值 null ,当由于调用 setText() 方法而单击复选框时会导致 NullPointerException。

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2018-09-11
      • 2011-08-24
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      相关资源
      最近更新 更多