Search code examples
androidlistviewarraylistsimpleadapter

Get index of Arraylist from listview


I am using Arraylist to store user cart.Arraylist holds details of items added to cart. In ViewCart there is delete ImageButton. I want as user clicks the delete button the item and all its details should be delete from ArrayList.

How can i get the index of Arraylist item that is being clicked so that i can remove it. Cart view is screenshot is here where i want that as user click delete icon entire row must be delete from Arraylist. In image the size of ArrayList is 2.

listview cartitems.xml

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/cyan"
            android:weightSum="100" >

            <TextView
                android:id="@+id/tvcartid"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:visibility="gone" />

            <TextView
                android:id="@+id/tvcartname"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_marginBottom="1dp"
                android:layout_marginLeft="1dp"
                android:layout_marginTop="1dp"
                android:layout_weight="30"
                android:background="@color/white"
                android:gravity="center"
                android:padding="0dp" />

            <TextView
                android:id="@+id/tvcartcategory"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_marginBottom="1dp"
                android:layout_marginLeft="1dp"
                android:layout_marginTop="1dp"
                android:layout_weight="20"
                android:background="@color/white"
                android:gravity="center"
                android:text="TextView"
                android:visibility="gone" />

            <TextView
                android:id="@+id/tvcartprice"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_marginBottom="1dp"
                android:layout_marginLeft="1dp"
                android:layout_marginTop="1dp"
                android:layout_weight="20"
                android:background="@color/white"
                android:gravity="center"
                android:text="TextView" />

            <ImageView
                android:id="@+id/tvcartimage"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_marginBottom="1dp"
                android:layout_marginLeft="1dp"
                android:layout_marginTop="1dp"
                android:layout_weight="30"
                android:background="@color/white"
                android:gravity="center" />

            <ImageButton
                android:id="@+id/bdelete"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_marginBottom="1dp"
                android:layout_marginLeft="1dp"
                android:layout_marginTop="1dp"
                android:layout_weight="20"
                android:background="@color/white"
                android:gravity="center"
                android:onClick="DeleteItem"
                android:paddingBottom="10dp"
                android:paddingLeft="5dp"
                android:paddingRight="5dp"
                android:paddingTop="10dp"
                android:scaleType="fitCenter"
                android:src="@drawable/delete" />
        </TableRow>
    </LinearLayout>
</ScrollView>

ViewCart.java

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewcart);
    ArrayList<HashMap<String, String>> items;
    AddtoCart obj = (AddtoCart) getApplicationContext();
    items = obj.getCart();
    Log.i("SIZE", String.valueOf(obj.getSize()));

    ListAdapter adapter = new SimpleAdapter(ViewCart.this, items, R.layout.cartitems, 
            new String[] {TAG_PID, TAG_NAME, TAG_CATEGORY, TAG_PRICE,TAG_IMAGE},
            new int[] { R.id.tvcartid, R.id.tvcartname, R.id.tvcartcategory
                    , R.id.tvcartprice, R.id.tvcartimage});
    setListAdapter(adapter);


}

public void DeleteItem(View v) {
   //What should i write here?
}
}

Solution

  • Instead of setting the onClickListener via xml, you can set it in a Custom Adapter like this:

    public class CustomSimpleAdapter extends SimpleAdapter {
    
    
        private List<? extends Map<String, ?>> mData;
    
        public CustomSimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
            super(context, data, resource, from, to);
            mData = data;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v =  super.getView(position, convertView, parent);
            final Object data = mData.get(position);
            v.findViewById(R.id.bdelete).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                        mData.remove(data);
                        notifyDataSetChanged();
                }
            });
            return v;
        }
    }
    

    This way, you can get data corresponding to the clicked view, modify the list to reflect delete action, and then call notifyDataSetChanged() to refresh the list.