2015-01-30 3 views
0

내 목록에 SwipeListView 라이브러리를 사용하고 있습니다. List Adapter가 ViewHolder Pattern을 사용하고 있습니다. 모든 것이 잘 작동합니다. 왼쪽으로 스 와이프를 설정하고 내 목록 항목보기 아래에 다시보기가 있습니다. 이 뒷면에는 텍스트보기 "삭제"가 있습니다. 클릭 후 삭제 작업이 수행됩니다. 어댑터의 데이터가 새로 고쳐집니다. 행이 삭제됩니다. 그러나 삭제 된 행에 가까운 위치에있는 행에 "스 와이프 상태"가 설정됩니다. 나는 "훔친 국가"가 convertview에 의해 기억되기 때문에 일어난다 고 믿습니다. convertview가 null인지 점검 할 때 주석 처리를하면 문제점은 사라지지만 목록 스크롤 성능은 용납되지 않습니다. 삭제 작업 후에 convertview를 삭제할 수있는 방법이 있습니까? 아니면 다른 작업이 있습니까?행을 삭제 한 후 SwipeListView는 "스 와이프 상태"로 유지됩니다.

내 ViewHolder :

public static <T extends View> T get(View view, int id) { 
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); 
    if (viewHolder == null) { 
    viewHolder = new SparseArray<View>(); 
    view.setTag(viewHolder); 
    } 
View childView = viewHolder.get(id); 
if (childView == null) { 
    childView = view.findViewById(id); 
    viewHolder.put(id, childView); 
    } 
return (T) childView; 
} 

내 어댑터의 getView() :

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

    if (convertView == null) { 
     convertView = LayoutInflater.from(context) 
       .inflate(R.layout.level_item, parent, false); 
    } 

    ... 
    ... 
    del = ViewHolderNew.get(convertView, R.id.del); 

    del.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      Level level = list.get(position); 
      long id = level.getId(); 
      Level leveltoDelete = Level.load(Level.class, id); 

      new Delete().from(Recipient.class).where("level = ?", id).execute(); 
      leveltoDelete.delete(); 

      remove(level); 
      notifyDataSetInvalidated(); 

     } 
    }); 

그리고 내 xml 파일 :

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:padding="0dp" 
android:background="@color/white_background" 
> 
//item back layout 
<LinearLayout 
    android:id="@+id/item_back" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<TextView 
    android:id="@+id/del" 
    android:layout_width="match_parent" 
    android:layout_height="180dp" 
    android:gravity="center_vertical|right" 
    android:layout_marginTop="10dp" 
    android:layout_marginBottom="10dp" 
    android:background="@color/delete_background" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" 
    android:paddingRight="30dp" 
    android:textColor="@color/white_background" 
    android:text="Delete" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

</LinearLayout> 

//item front layout 
<RelativeLayout 
android:id="@+id/item_front" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
... 
+0

코드를 게시하십시오. – iRuth

답변

1

내가 그 라이브러리를 모르겠지만, 나는 가정 행 항목의 하위 항목에 대한 가시성을 변경합니다.

삭제 및 새로 고침 후 ListView는 새 행을 요청하여 이전보기를 convertViews로 전달하고 그 중 하나는 "스 와이프"보기입니다. 목록을 스크롤 한 후에도 똑같은 동작을 보일 것입니다. 더 이상 볼 수없는보기가 다시 사용되기 때문입니다.

보기가 스 와이프 이후라고 말할 수 있다면 재사용하기 전에 역 변환을 적용 할 수 있습니다 (또는 새 페이지를 부 풀리면 페이지 당 하나의 행이 성능에 좋지 않아야 함).

그러나 아래로 스크롤하여 뒤로 이동하면이 소리가 스 와이프 상태를 유지하지 않습니다. 스 와이프 위치를 추적해야하는 경우 추가보기 유형을 추가하는 것을 고려해야합니다 (getViewType(position)getViewTypeCount() 참조).

+0

SwipeListView 내부에 setSwipeCloseAllItemsWhenMoveList() 메서드가 있으므로 스크롤하는 것이 문제가되지 않습니다. 하지만 올바른 방향으로 나를 안내해주었습니다. 역 변형을 찾기 시작했고 메소드 closeAnimate()가 발견되었고 삭제 메소드 바로 전에 호출 할 때 그 일을합니다. 감사. – elhm