Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android getView : Why getView not called?

I add two buttons (add and delete) to control the list view, when I delete an item, the item won't immediately disappear in the listview, only when I slide on the listview, the new item disappears. The getView() in my adapter won't be called after I delete an item unless I touch the screen or slide on the listview. can someone tell me why?

My xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/locationlist_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >"

    <RelativeLayout
        android:id="@+id/locationlisttitle_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical" 
        android:background="#ADD8E6">

        <ImageView
            android:id="@+id/iv_menu2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:src="@drawable/img_menu" />

        <TextView
            android:id="@+id/txtv_locationmanagetitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="Manage Location List"
            android:textSize="20sp" />

        <ImageView
            android:id="@+id/iv_addlocation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/txtv_locationmanagetitle"
            android:src="@drawable/addlocation" />

        <ImageView
            android:id="@+id/iv_deletelocation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/iv_addlocation"
            android:src="@drawable/deletelocation" />

    </RelativeLayout>

    <ListView
        android:id="@+id/lv_locations"
        android:layout_height="500dp"
        android:layout_width="fill_parent" />
</LinearLayout>

My button click event handler

ivbtn_deleteLocation.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            //remove selected items from the locationList
            Collections.sort(listStr);
            for (int i = listStr.size()-1; i >= 0; i--) {
                Log.i("zhijianw", "remove"+listStr.get(i));
                Log.i("zhijianw", "remove"+locationList.get(Integer.parseInt(listStr.get(i))).get("txtv_locationitem"));
                String remLocation = locationList.get(Integer.parseInt(listStr.get(i))).get("txtv_locationitem").toString();
                locationList.remove(Integer.parseInt(listStr.get(i)));
                removeLocation(remLocation);
            } 
            listStr = new ArrayList<String>();
            locationsAdapter.notifyDataSetChanged();
        }
});

My Adapter

  public MyAdapter(Context context, List<HashMap<String, Object>> list, int resource, String[] from, int[] to) {
            this.context = context;
            this.list = list;
            keyString = new String[from.length];
            idValue = new int[to.length];
            System.arraycopy(from, 0, keyString, 0, from.length);
            System.arraycopy(to, 0, idValue, 0, to.length);
            inflater = LayoutInflater.from(context);
            init();
            Log.i("zhijianw", "my adapter called"); 
    }

    public void init() {
            isSelected = new HashMap<Integer, Boolean>();
            for (int i = 0; i < list.size(); i++) {
                    isSelected.put(i, false);
            }
    }

    @Override
    public int getCount() {
        Log.i("zhijianw", "get count called");  
            return list.size(); 
    }

    @Override
    public Object getItem(int arg0) {
        Log.i("zhijianw", "get item called");
            return list.get(arg0);
    }

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

    @Override
    public View getView(int position, View view, ViewGroup arg2) {
        init();
        Log.i("zhijianw", "get view called");           
        ViewHolder holder = null;
        if (view == null) {
                holder = new ViewHolder();
                view = inflater.inflate(R.layout.location_item, null);
                holder.tv = (TextView) view.findViewById(R.id.txtv_locationitem);
                holder.cb = (CheckBox) view.findViewById(R.id.cb_locationitem);
                view.setTag(holder);
        } else {
                holder = (ViewHolder) view.getTag();
        }
        HashMap<String, Object> map = list.get(position);
        if (map != null) {
                itemString = (String) map.get(keyString[0]);
                holder.tv.setText(itemString);
        }
        holder.cb.setChecked(isSelected.get(position));
        return view;
    }

}

Set listview adapter

lv_menu = (ListView) menu_view.findViewById(R.id.lv_menu);
lv_menu.setAdapter(new ArrayAdapter<String>(this, R.layout.menu_item,   R.id.txtv_menuItem, menuChoices));
like image 470
Troy Wang Avatar asked Aug 20 '26 17:08

Troy Wang


1 Answers

The locationsAdapter does not appear to be getting set to the same adapter used by lv_menu.setAdapter() so that locationsAdapter.notifyDataSetChanged() is not invalidating lv_menu. Try lv_menu.invalidate() directly in your onClick() function.

I personally reload my list adapters from scratch whenever deleting items, especially when CheckBox items are involved, in order to keep things from getting out of sync.

like image 181
David Manpearl Avatar answered Aug 23 '26 05:08

David Manpearl



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!