安卓getView : Why getView not called?

标签 android android-adapter

我添加了两个按钮(添加和删除)来控制 ListView ,当我删除一个项目时,该项目不会立即在 ListView 中消失,只有当我在 ListView 上滑动时,新项目才会消失。除非我触摸屏幕或在 ListView 上滑动,否则我的适配器中的 getView() 不会在我删除项目后被调用。谁能告诉我为什么?

我的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>

我的按钮点击事件处理程序

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();
        }
});

我的适配器

  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;
    }

}

设置 ListView 适配器

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));

最佳答案

locationsAdapter 似乎没有设置为 lv_menu.setAdapter() 使用的同一适配器,因此 locationsAdapter.notifyDataSetChanged() 不会使 lv_menu 无效。直接在 onClick() 函数中尝试 lv_menu.invalidate()

每当删除项目时,我个人都会从头开始重新加载我的列表适配器,尤其是当涉及 CheckBox 项目时,以防止事情不同步。

关于安卓getView : Why getView not called?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15745014/

相关文章:

java - 在使用 Java 的 3 层架构中推荐使用什么应用程序层?

android - 如何从 View 中获取窗口实例?

android - 使用 Tomcat 服务器托管 android 和 web 应用程序打开太多连接

java - 如何从我的 fragment 之一添加数据,并将其传递到我的适配器,并将其设置到我的数组列表?

android - notificationDataSetChanged() 在适配器中不起作用

java - 如何从另一个类及其上下文调用函数(android,java)

android - SharedPreferences 未在发布版本中实例化

Android Parse.com如何从Listview的点击事件中获取名称

android - 在 Android MVP 中通过构造函数将 Fragment 的(View)Presenter 传递给 Adapter

java - 创建继承的Activity时出现StackOverFlowError