【发布时间】: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