使用ToggleButtons更新DataBase的ListView

时间:2015-05-16 10:24:56

标签: android listview togglebutton

我需要你的帮助,我为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

谢谢!

2 个答案:

答案 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()方法。

只需通过构造函数传递一个项目列表并保留它。