0

I'm new to android. Started learning recently.

I have created a LinearLayout dynamically. I have the following fields in LinearLayout: 1. Customer name 2. Edit Button 3. Delete Button.

Orientation is horizontal.

Now I want to delete a single record when I click on delete button. How can I get row id in this case and later I can pass to database to delete the record. Here is the code.

user_list_view_item_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="@drawable/bg_main"
   >


    <TextView android:id="@+id/txtTitle"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center_vertical"
        android:textStyle="bold"
        android:textSize="50dp"
        android:textColor="#FFFFFF"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp" />


        <Button
            android:id="@+id/userListEditButton"
            style="@style/SpecialText"
            android:layout_width="50dp"
            android:layout_height="50dp"  
            android:typeface="monospace"          
            android:text="@string/save" 
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp" />

        <Button
            android:id="@+id/userListDeleteButton"
            style="@style/SpecialText"
            android:layout_width="50dp"
            android:layout_height="50dp"  
            android:typeface="monospace"          
            android:text="@string/reset" 
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp" />
    </LinearLayout>


UserAdapter.java

package com.rad.mobileshop.activities;

import java.sql.SQLException;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;

import com.rad.mobileshop.common.entities.User;
import com.rad.mobileshop.db.DBAdapter;

public class UserAdapter extends ArrayAdapter<User> {

    Context context;
    int layoutResourceId;
    User data[] = null;
    private DBAdapter mdb;

    public UserAdapter(Context context, int layoutResourceId, User[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
        mdb = new DBAdapter(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        UserHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new UserHolder();
            holder.txtTitle = (TextView) row.findViewById(R.id.txtTitle);
            holder.editButton = (Button) row
                    .findViewById(R.id.userListEditButton);
            holder.deleteButton = (Button) row
                    .findViewById(R.id.userListDeleteButton);

            row.setTag(holder);
        } else {
            holder = (UserHolder) row.getTag();
        }

        User user = data[position];     
        holder.txtTitle.setText(user.getName());
        holder.editButton.setText("Edit");
        holder.deleteButton.setText("Delete");

        holder.editButton.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                System.out.println("hello Edit");
            }
        });

        holder.deleteButton.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                System.out.println("hello delete ");
            }
        });     

        return row;
    }

    private void deleteUserDetails(int userId) {
        try {

            mdb.open();
            mdb.deleteUserDetails(userId);

        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }

    static class UserHolder {
        TextView txtTitle;
        Button editButton;
        Button deleteButton;
    }
}

User.java

package com.rad.mobileshop.common.entities;

public class User {
    private int id;
    private String name;
    private String type;

    public User() {
        super();
    }

    public User(int id, String name, String type) {
        super();
        this.id = id;
        this.name = name;
        this.type = type;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return this.name ;
    }
}
Anand Garlapati
  • 107
  • 1
  • 1
  • 5

1 Answers1

1

First you need to change your User[] array into an ArrayList, because you cannot dynamically remove an element for a primitive array. (At least not as easily and ArrayAdapter is already designed to work with ArrayLists in this circumstance.)

Next let's save position in deleteButton in getView() for easy access:

holder.deleteButton.setTag(position);

Last add this to your delete OnClickListener:

public void onClick(View view) {
    User user = getItem((Integer) view.getTag()));
    remove(user);
    deleteUserDetails(user.getId());
}

There are an couple minor adjustments that I didn't cover, like changing UserAdapter's constructor and data[position] in getView(), but they are easy fixes.


Optional advice:

  • You should create only one LayoutInflater in your constructor and simply re-use it in getView()
  • You don't need to store a copy of data in UserAdapter, it is already stored in ArrayAdapter, simply access it with getItem(position).
  • You can streamline getView() by moving every command that doesn't change into the if(row == null) block.

All that said, I'm not sure why you extended ArrayAdapter if you are working with a database. I suggest switching to a custom CursorAdapter, but this isn't required.

Sam
  • 86,580
  • 20
  • 181
  • 179
  • He could directly save the User as the button's Tag (to avoid a look-up in the adapter) – Vincent Mimoun-Prat Oct 20 '12 at 22:36
  • @Sam: Not all of your code review comments were addressed by me. I will have a look into it once I have a working example. – Anand Garlapati Oct 23 '12 at 18:18
  • How can I start an activity from Edit button's onClick event in the UserAdapter class? – Anand Garlapati Oct 23 '12 at 18:24
  • You don't have to do any of my optional advice, I won't be offended. To start a new Activity please read [this article](http://developer.android.com/training/basics/firstapp/starting-activity.html) in the Developer's Guide or [this question](http://stackoverflow.com/q/736571/1267661) here on Stack Overflow. – Sam Oct 23 '12 at 18:35