Search code examples
androidlistviewandroid-listviewlistviewitem

ListView items are overlapped


Items listView are overlapped after delete items. Why? For example before and after delete first item:

enter image description here

I am deleting elements using method:

public void updateData(List<ParseObject> data) {
    mGroupList.clear();
    mGroupList.addAll(data);
    notifyDataSetChanged();
}

listView:

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@null"/>

getView in adapter:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if (convertView == null) {
        viewHolder = new ViewHolder();
        convertView = mLayoutInflater.inflate(R.layout.card_item, parent, false);
        viewHolder.mCardViewNative = (CardViewNative) convertView.findViewById(R.id.card_view);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    } 

    //code

    viewHolder.mCardViewNative.setCard(card);

    return convertView;
}

card_item.xml:

<it.gmariotti.cardslib.library.view.CardViewNative
android:background="@drawable/header_dark"
android:id="@+id/card_view"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

UPDATE

If don't use ViewHolder and inflate view everytime, there is no overlap. But inflate view everytime is not good.

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    convertView = mLayoutInflater.inflate(R.layout.card_item, parent, false);
    CardViewNative cardViewNative = (CardViewNative) convertView.findViewById(R.id.card_view);

    //code

    cardViewNative.setCard(card);

    return convertView;
}

Solution

  • Try

    convertView = mLayoutInflater.inflate(R.layout.card_item, null);
    

    Instead of

    convertView = mLayoutInflater.inflate(R.layout.card_item, parent, false);
    

    It works for me, using ViewHolder as static class