3

リスト ビューを制御する 2 つのボタン (追加と削除) を追加します。アイテムを削除しても、リスト ビューでアイテムがすぐに消えることはありません。リスト ビューをスライドすると、新しいアイテムが消えます。画面に触れるか、リストビューをスライドしない限り、アイテムを削除した後、アダプターの 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;
    }

}

リストビュー アダプタの設定

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

2 に答える 2

1

が使用するのlocationsAdapterと同じアダプタに設定されてlv_menu.setAdapter()いるようにlocationsAdapter.notifyDataSetChanged()は見えないため、無効化されていませんlv_menulv_menu.invalidate()関数で直接試してくださいonClick()

私は個人的に、アイテムを削除するたびに、特にCheckBoxアイテムが関係している場合は、リスト アダプターを最初から再読み込みして、同期がずれないようにしています。

于 2013-04-01T16:27:20.357 に答える
0

(getView メソッドで) インフレータに転送されたパラメータが、アダプタの起動時に使用されたものと同じパラメータを参照していることを確認してください。それらが同じでない場合、getView はそれ以上の通知なしに呼び出されません。ゾハル

于 2013-11-10T09:03:49.957 に答える