2013-04-01 5 views
3

두 개의 버튼 (추가 및 삭제)을 추가하여 목록보기를 제어합니다. 항목을 삭제할 때 항목이 목록보기에서 즉시 사라지지 않고 목록보기에서 슬라이드 할 때만 새 항목이 사라집니다. 목록보기에서 화면이나 슬라이드를 터치하지 않으면 항목을 삭제 한 후 어댑터의 getView()가 호출되지 않습니다. 누군가 왜 저에게 말할 수 있습니까?Android getView : 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)); 
+0

@NullPointer는하지만()의 getView를 오버라이드 (override) 내 LIST_ITEM의 텍스트 뷰와 체크 박스를 설정해야합니다. getView 함수에 중단 점을 설정하면 listView를 silde 할 때까지 호출되지 않습니다. listview에서 슬라이드하면 getView가 즉시 호출되고 항목이 삭제됩니다. –

+0

같은 문제가 있습니다. 솔루션을 찾을 수 없습니다. 아무도 도와 줄 수 없니? – Smeet

답변

1

locationsAdapter은 그래서 locationsAdapter.notifyDataSetChanged()lv_menu을 무효화되지 lv_menu.setAdapter()에서 사용하는 것과 같은 어댑터 설정 가져 오지 못하는 것 같습니다. onClick() 함수에서 직접 lv_menu.invalidate()을 시도해보십시오.

항목을 삭제할 때마다 항상 개인적으로 처음부터 목록 어댑터를 다시로드합니다. 특히 CheckBox 항목이 포함될 경우 동기화되지 않도록 유지해야합니다.

0

합니다 (의 getView 방법에서)에 인플레이터로 옮겼다 파라미터 어댑터가 개시된 때 사용 된 동일한 변수를 참조하는 것이 확인하세요. 그것들이 동일하지 않은 경우, getView는 추가 통지없이 호출되지 않습니다. 소할

관련 문제