P.h. Dvrgne
P.h. Dvrgne

Reputation: 131

Remove item from GridView

I am very new to android development and I feel like this is very simple, yet, I haven't managed to find anyone on google with the same problem. I have a Gridview that is filled with a TextView (which has an image on top) and an ImageButton (to delete the current item). What I want to do is to remove the item of which I click the ImageButton.

Here is my Main :

public class ActivityMain extends Activity
{
GridView gridview;
public GridAdapter mainActivityAdapter;
public ArrayList<String> listService = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listService.add("Market");
    listService.add("Recherche");
    listService.add("Quiz");

    gridview = (GridView) findViewById(R.id.mainActivity_grid);
    mainActivityAdapter = new GridAdapter(this.getApplicationContext(), listService);

    gridview.setAdapter(mainActivityAdapter);

}

}

And here is my Adapter :

    public class GridAdapter extends BaseAdapter
    {
    Context context;
    ArrayList<String> list = new ArrayList<String>();
    GridAdapter adapter = this;

    public GridAdapter(Context context, ArrayList<String> list)
    {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount()
    {
        return list.size();
    }

    @Override
    public Object getItem(int arg0)
    {
        return null;
    }

    @Override
    public long getItemId(int arg0)
    {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder;
    if(convertView==null)
    {
        convertView = LayoutInflater.from(context).inflate(R.layout.item_gridmain, null);

        holder = new ViewHolder();
        holder.textView = (TextView) convertView.findViewById(R.id.gridMain_text);
        holder.close = (ImageButton) convertView.findViewById(R.id.mainActivity_delete);

        convertView.setTag(holder);
    }

    else{
        holder = (ViewHolder) convertView.getTag();
    }

// Doing stuff on views

        holder.close.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View arg1)
            {
                // list.remove(position);
                list.remove(position);              
                adapter.notifyDataSetChanged();
            }
        });
        return convertView;

    }

public static class ViewHolder
{
    TextView textView;
    ImageButton close;
}

}

The thing is, when I click on one ImageButton, it's always the last item that has been added that is being removed and I can't figure out why or how to fix this.

Thank you.

================== EDIT :

Here is my activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#DDDDDD"
android:orientation="vertical" >

<GridView
    android:id="@+id/mainActivity_grid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginLeft="5sp"
    android:layout_marginRight="5sp"
    android:layout_marginTop="5sp"
    android:clickable="false"
    android:gravity="center"
    android:horizontalSpacing="15dp"
    android:numColumns="2"
    android:stretchMode="columnWidth"
    android:verticalSpacing="10dp" />

</LinearLayout>

And my item_gridmain.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView 
    android:id="@+id/gridMain_text"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_gravity="center"
    android:textAlignment="center"
    android:textColor="@android:color/holo_blue_dark"
    />

 <ImageButton
    android:id="@+id/mainActivity_delete"
    style="?android:attr/borderlessButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:contentDescription="@string/deleteFav"
    android:src="@drawable/boutoncroixfermer" />

</RelativeLayout>

Upvotes: 5

Views: 17476

Answers (5)

P.h. Dvrgne
P.h. Dvrgne

Reputation: 131

Ok actually it was my own mistake and I feel incredibly dumb now.

I was actually removing the right item but in each view I was replacing each item at position with what was there in the first place. So each item was the correct one but the picture/text were the old one because I was modifying them inside getView().

Sorry for that lose of time, my bad, I want to punch myself now.

Upvotes: 2

user890973
user890973

Reputation: 957

add Log.debug() in listener to ensure the remove position is right.

How do you know after click,the last item is removed?I mean,if there has text label in item view?Maybe you remove the right item,but after gridview refresh,it looks like the last item is removed.

You can add position label with setText in getView.That may helps you.

Ok,I know.Where did you do render item view?You must do it in getView.The AdapterView cached it's item view.As you removed the right position.May be the position is not the right view.You can run hierarchyviewer to detect what happen.

Upvotes: 0

Yahya Arshad
Yahya Arshad

Reputation: 1626

Please use

  holder.close.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View arg1)
        {
            // list.remove(position);
            list.remove(position);              
            adapter.notifyDataSetChanged();
        }
    });

instead of close.setOnClickListener, i ran your this code an now it work fine

Upvotes: 1

tasomaniac
tasomaniac

Reputation: 10342

You have ImageButton's in every item right? You can set

holder.close.setTag(Integer.valueOf(position));

And then, you have all positions hidden in the right buttons.Change the OnClickListener like below:

close.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            list.remove((Integer) v.getTag()); 
            adapter.notifyDataSetChanged();
        }
    });

Upvotes: 2

Yahya Arshad
Yahya Arshad

Reputation: 1626

Please use ViewHolder pattern, and also add your gridMain_text.xml else you will keep receiving wrong index of click http://www.binpress.com/tutorial/smooth-out-your-listviews-with-a-viewholder/9 This is example of ListView but equally applicable for GridView

Upvotes: 1

Related Questions