Android:点击按钮,从自定义Listview中删除行

时间:2014-12-19 05:07:02

标签: android listview

我的应用程序中有自定义列表视图。它的所有项目都存储在数据库中。每行都有一个删除按钮。单击删除按钮,我想从数据库和Listview.I中删除相应的行执行代码从数据库中删除,但更改没有反映在我的listview中。我不明白我的datalist(datalist的名字)是什么。

add2cart.java

public class add2cart extends Activity{
ListView adlstvw;
Button btn,remove_btn;
SQLiteDatabase mydb;
public String sme;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add2crt);
    adlstvw=(ListView)findViewById(R.id.lstvw_add2crt);
    btn=(Button)findViewById(R.id.place_order);

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
     sme= extras.getString("dtls");       
     }


    mydb=add2cart.this.openOrCreateDatabase("addcart", MODE_PRIVATE, null);
    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=new CartAdapter(this,pname,price);
    adlstvw.setAdapter(cart);

    btn.setOnClickListener(new OnClickListener() {

         @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent in=new Intent(add2cart.this,buy_ltr.class); 
            Bundle bndl = new Bundle();
            bndl.putString("som",sme); 
            in.putExtras(bndl);
            startActivity(in);

        }
    });

}

}

CartAdapter.java

public class CartAdapter extends BaseAdapter{

public static ListView adlstvw;
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+"'");


     ////////////ADDED CODE/////////////////////

    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 个答案:

答案 0 :(得分:1)

直接致电notifyDataSetChanged(),不使用ClassName.this.notifyDataSetChanged(),因为您已经在适配器中。

         crtlist.remove(position); //removing from your List
         notifyDataSetChanged(); //notify your adapter about the change.

Reference here

答案 1 :(得分:1)

您正在使用Array,并且您正在填充类似于下面的代码。

mydb=add2cart.this.openOrCreateDatabase("addcart", MODE_PRIVATE, null);
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"));
    this.pname[i] = name;
    this.price[i] = prprice;
    i++;
}

从数据库中删除项目后执行的操作相同。之后再次创建适配器并将其设置为listview(您可以通过在活动中将其设置为公共静态来从适配器访问列表视图)。或者在填充数组后尝试notifyDataSetChanged()。

答案 2 :(得分:0)

尝试从适配器中删除视图项,而不是从列表中删除。

listAdapter.remove(viewToRemove); listAdapter.notifyDataSetChanged();