Reputation: 994
i want to implement a ListView which have Delete Btn inside of each row.
My only problem is when i click Delete Btn of some Row, Row with Position 0 just Deleted!
i think somehow my Position parameter in getView cannot be updated and always have 0 value
what should i do?!
Thanks.
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
//import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class InvoiceListAdapter extends BaseAdapter {
ArrayList<Object> _itemList;
public Activity _context;
public LayoutInflater _inflater;
public InvoiceListAdapter(Activity context,ArrayList<Object> itemList)
{
super();
this._context=context;
this._itemList=itemList;
this._inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return _itemList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return _itemList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public static class ViewHolder
{
TextView ProductName;
TextView Qnt;
TextView Price;
Button Del;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null)
{
holder = new ViewHolder();
convertView = _inflater.inflate(R.layout.custom_row_view, null);
holder.ProductName = (TextView) convertView.findViewById(R.id.txt_CRow_ProdName);
holder.Price = (TextView) convertView.findViewById(R.id.txt_CRow_Price);
holder.Qnt = (TextView) convertView.findViewById(R.id.txt_CRow_Qnt);
holder.Del = (Button) convertView.findViewById(R.id.btn_CRow_Delete);
/*-----------------------------Deleting Item with Button--------------------*/
holder.Del.setTag(holder);
holder.Del.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(_context,"Item Deleted!", Toast.LENGTH_SHORT).show();
_itemList.remove(position);
notifyDataSetChanged();
// TODO Auto-generated method stub
}
});
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
AnItem Item = (AnItem) _itemList.get(position);
holder.ProductName.setText(Item.getProductName());
holder.Price.setText(Item.getPrice());
holder.Qnt.setText(Item.getQnt());
return convertView;
}
Upvotes: 3
Views: 9816
Reputation: 20596
You are probably having that ListView in ScrollView. I've just wasted 2 hours until I stumbled on this answer:
Why is my BaseAdapter class not incrementing the position in getView?
Upvotes: 11
Reputation: 1047
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null)
{
holder = new ViewHolder();
convertView = _inflater.inflate(R.layout.custom_row_view, null);
holder.ProductName = (TextView) convertView.findViewById(R.id.txt_CRow_ProdName);
holder.Price = (TextView) convertView.findViewById(R.id.txt_CRow_Price);
holder.Qnt = (TextView) convertView.findViewById(R.id.txt_CRow_Qnt);
holder.Del = (Button) convertView.findViewById(R.id.btn_CRow_Delete);
/*-----------------------------Deleting Item with Button--------------------*/
holder.Del.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(_context,"Item Deleted!", Toast.LENGTH_SHORT).show();
Integer position = (Integer) v.getTag();
_itemList.remove(position.intValue());
notifyDataSetChanged();
// TODO Auto-generated method stub
}
});
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
AnItem Item = (AnItem) _itemList.get(position);
holder.ProductName.setText(Item.getProductName());
holder.Price.setText(Item.getPrice());
holder.Qnt.setText(Item.getQnt());
holder.Del.setTag(Integer.valueOf(position));
return convertView;
}
Upvotes: 1
Reputation: 229
if(convertView==null)
{
holder = new ViewHolder();
convertView = _inflater.inflate(R.layout.custom_row_view, null);
holder.ProductName = (TextView) convertView.findViewById(R.id.txt_CRow_ProdName);
holder.Price = (TextView) convertView.findViewById(R.id.txt_CRow_Price);
holder.Qnt = (TextView) convertView.findViewById(R.id.txt_CRow_Qnt);
holder.Del = (Button) convertView.findViewById(R.id.btn_CRow_Delete);
/*-----------------------------Deleting Item with Button--------------------*/
holder.Del.setTag(holder);
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
AnItem Item = (AnItem) _itemList.get(position);
holder.ProductName.setText(Item.getProductName());
holder.Price.setText(Item.getPrice());
holder.Qnt.setText(Item.getQnt());
holder.Del.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(_context,"Item Deleted!", Toast.LENGTH_SHORT).show();
_itemList.remove(position);
notifyDataSetChanged();
// TODO Auto-generated method stub
}
});
return convertView;
I think onClickListener is not be inside the if block.
Upvotes: 3