我需要你的帮助,我为ListView创建了一个自定义适配器,以便为db中的每条记录显示TextView和ToggleButton。在覆盖的getView方法中,我添加了如下值:
public class ListaUbicaciones extends BaseAdapter implements ListAdapter {
private ManejadorBD bd;
private List<Ubicacion> list = new ArrayList<Ubicacion>();
private Context context;
public ListaUbicaciones(List<Ubicacion> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return list.get(position).getID();
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.activity_ubicacion, null);
}
final Ubicacion ub= list.get(position);
TextView listItemText = (TextView)view.findViewById(R.id.titUbicacion);
listItemText.setText(ub.getTitulo());
ToggleButton btnToggle = (ToggleButton)view.findViewById(R.id.btnToggle);
final int activo = ub.getActivo();
if (activo == 1){
btnToggle.setChecked(true);
}else{
btnToggle.setChecked(false);
}
btnToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
bd.actualizarEstado(ub,1);
}else{
bd.actualizarEstado(ub,0);
}
}
});
return view;
}
}
方法actualizarEstado是这样的:
public void actualizarEstado(Ubicacion ub, int estado){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ACTIVO, estado);
db.update(TABLE_LOCATIONS, values, KEY_ID + " = ?", new String[]{String.valueOf(ub.getID())});
}
所以问题是每当我点击切换按钮并从true更改为false或反之亦然我的应用程序崩溃,这是因为update.at(position)在updateStatus将其用作参数时为空,我真的不知道为什么,我在论坛上搜索了很多,但我找不到任何解决方案uu
谢谢!
答案 0 :(得分:1)
您的应用崩溃是因为您创建了空ArrayList
:
List<Point> list = new ArrayList<Point>();
并尝试从中获取该项目。
更新:
当您点击按钮时,ub
变量被gc回收)来存储它使用标记:
btnToggle.setTag(ub);
btnToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Ubicacion ubFromTag = buttonView.getTag();
if(ubFromTag == null) return;
if (isChecked){
bd.actualizarEstado(ubFromTag,1);
}else{
bd.actualizarEstado(ubFromTag,0);
}
}
});
答案 1 :(得分:0)
如@anil所述,您的列表为空。
但这只是其中一个问题。 将项目发送到适配器的正确方法是在调用新的适配器对象时。
您会看到,ListView项目随着滚动的进行按需绘制项目。只要ListView(或使用此适配器的其他类)需要列表中项目的新视图,就会调用getView()方法。
只需通过构造函数传递一个项目列表并保留它。