Удалить элементы в пользовательском ListView из списка, по нажатию кнопки

У меня есть собственный ListView с кнопкой удаления в каждой строке. Элементы в Listview отображаются из базы данных. При нажатии кнопки удаления элемент из базы данных удаляется. Но он не отображается в виде списка. Мне нужно удалить соответствующую строку этого вещь.

CartAdapter.java

public class CartAdapter extends BaseAdapter
{

private final String[] pname;
private final String[] price;
private Context cntxt;
 public CartAdapter(Context c,String [] pname,String [] price)
 {

     cntxt=c;
     this.pname=pname;
     this.price=price;
 }
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return pname.length;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View List;
    LayoutInflater mLayoutInflater=(LayoutInflater)cntxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView==null) {
List=new View(cntxt);
List=mLayoutInflater.inflate(R.layout.add2crt_sub,parent, false);

 }
else {
List=(View)convertView;
}

 Button button=(Button)List.findViewById(R.id.remove);
 button.setTag(position);
 button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub


        int position = (Integer)v.getTag();
        SQLiteDatabase mydb=cntxt.openOrCreateDatabase("addcart",Context.MODE_PRIVATE, null);
        String pnam = pname[position];

        mydb.execSQL("DELETE FROM add2cart WHERE pnme ='"+pnam+"'");

        Cursor cr = mydb.rawQuery("SELECT * FROM add2cart", null);
        String [] pname = new String[cr.getCount()];
        String [] price = new String[cr.getCount()];

        int i = 0;
        while(cr.moveToNext())
        {
            String name = cr.getString(cr.getColumnIndex("pnme"));
            String prprice = cr.getString(cr.getColumnIndex("prate"));
            pname[i] = name;
            price[i] = prprice;
            i++;
        }

        CartAdapter cart=CartAdapter.this;
        add2cart.adlstvw.setAdapter(cart);
        notifyDataSetChanged();
    }
    });
 TextView nametxt=(TextView)List.findViewById(R.id.prdt_nme);
 final TextView pricetxt=(TextView)List.findViewById(R.id.prdt_rate);
 final TextView totltxt=(TextView)List.findViewById(R.id.prdt_totl);
 final EditText edittext=(EditText)List.findViewById(R.id.prdt_qnty);
 edittext.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // TODO Auto-generated method stub

        String s1=pricetxt.getText().toString();
        String s2=edittext.getText().toString();
        int i1=Integer.parseInt(s1);
        int i2=Integer.parseInt(s2);
        int res=i1*i2;
        totltxt.setText(Integer.toString(res));
        if (s2.matches("")) {

            edittext.setText("");

        }


    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        // TODO Auto-generated method stub




    }



    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub

    }
});

 nametxt.setText(pname[position].toString());
 pricetxt.setText(price[position]);

    return List;
}


}

3 ответа

Решение

Прежде всего вам нужна ссылка на класс Context, чтобы открыть базу данных.

 SQLiteDatabase mydb=CartAdapter.this.openOrCreateDatabase("addcart", MODE_PRIVATE, null);

вышеуказанный код неверен

Вы должны передать контекст в класс базы данных, который я не могу увидеть в приведенной выше строке... так что поправьте меня, если я ошибаюсь

android.database.sqlite.SQLiteException: near "(": syntax error: DELETE FROM add2cart WHERE pname=button.setTag(position

спокойно из приведенной выше строки есть синтаксическая ошибка в приведенном ниже коде

mMydb.execSQL("DELETE FROM add2cart WHERE pname=button.setTag(position)");

я думаю, правильный код может быть

public void onClick(View v) {
    // TODO Auto-generated method stub

    int position = (Integer)v.getTag();
 //this will give you the position of the data been clicked
 // how extract the data item from the list at the position
 // for eg that data is in pname vriable
    SQLiteDatabase mydb=cntxt.openOrCreateDatabase("addcart",Context.MODE_PRIVATE, null);
    String pnam = pname[position];
    mydb.execSQL("DELETE FROM add2cart WHERE pnme = '"+pnam+"'");
    notifyDataSetChanged();


}
});

также вы должны удалить элемент из вашего списка String []pname, чтобы отразить изменения в просмотре списка, вам лучше использовать List pname, так как удаление лучше в структуре данных List

Попробуйте заменить CartAdapter.this контекстом активности, который вы передали в конструктор класса вашего адаптера.

замещать

SQLiteDatabase mydb=CartAdapter.this.openOrCreateDatabase("addcart", MODE_PRIVATE, null);

с

SQLiteDatabase mydb=cntxt.openOrCreateDatabase("addcart", MODE_PRIVATE, null);

Весь дизайн OnClickListener неверен. Нет смысла открывать вашу базу данных каждый раз, когда пользователь нажимает кнопку.

Вы должны скопировать и вставить следующую строку в конструктор адаптера:

 mydb=cntxt.openOrCreateDatabase("addcart",Context.MODE_PRIVATE, null);

оставьте mydb локальной переменной, вы можете назвать ее mMydb для правильного соглашения о коде.

Затем в onClick() просто оставьте следующую строку:

mMydb.execSQL("DELETE FROM add2cart WHERE pname=button.setTag(position)");
        notifyDataSetChanged();

Кроме того, как предложил @dragon born - вы должны использовать инкапсулированный контекст активности, поэтому просто добавьте его в контекст адаптера и используйте его.

Другие вопросы по тегам