2014-12-19 1 views
1

У меня есть собственный список в моем приложении. Все его элементы хранятся в базе данных. В каждой строке есть кнопка удаления. Выбрав кнопку удаления, я хотел бы удалить соответствующие строка, как из базы данных, так и из списка. Я успешно выполнил код для удаления из базы данных, но это изменение не отражается в моем списке. Я не понимаю, что такое мой datalist (имя datalist).Android: удаление строки из пользовательского Listview при нажатии кнопки

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; 
} 


} 
} 
+0

Вместо использования pname.length используйте crtlist, и теперь, когда вы удаляете элемент из этого списка, он будет отображаться обратно, когда вы вызываете notifydatasetchanged. @Override public int getCount() { // TODO Автоматически генерируемый метод заглушки return crtlist.size; } – androidStud

ответ

1

Вы используете массив, и вы заселять те как сильфона кода.

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 (вы можете получить доступ к списку из адаптера, сделав его public static в активности). Или попробуйте notifyDataSetChanged() после заполнения массива.

+0

сделать объект ListView общедоступным в активности, получить доступ к этому объекту из адаптера и сделать listview.setAdapter() внутри кнопки click listener. –

+0

проверить выше отредактированный ответ –

+0

вы пробовали и notifyDataSetChanged и снова установили адаптер –

0

Попробуйте удалить элемент представления от адаптера, а не удаление из списка.

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

+0

CartAdapter.remove (getItem (позиция)); CartAdapter.notifyDataSetChanged(); вы сделали как это .. – arjun

+0

да..Но это не сработало. – droid

1

звоните notifyDataSetChanged() напрямую, не используйте ClassName.this.notifyDataSetChanged(), так как вы уже находитесь в адаптере.

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

Reference here

+0

Где находится слово "datalist" в вашем коде? – Darpan

+0

Список здесь будет списком, который вы использовали для отображения ваших данных в адаптере, а затем удалил одну строку. – Darpan

+1

Возможно, вы захотите изменить свои массивы 'pname' и' price' на 'ArrayList', так как лучше обрабатывать данные. Затем вызовите pname.remove (pname.indexOf (pnam)); price.remove (pname.indexOf (pnam)); notifyDataSetChanged(); – Darpan

Смежные вопросы