Android ListView 슬라이딩 삭제 작업(SwipeListView)

새 버 전의 위 챗 과 QQ 에 도 입 된 슬라이딩 삭제 기능 은 현재 비교적 유행 하 는 기능 이다.사실 이 슬라이딩 삭제 컨트롤 은 github 에 이미 있 습 니 다.인기 있 는 오픈 소스 프레임 워 크 SwipeListView 입 니 다.그러나 이 SwipeListView 는 framelayot,즉 2 층 의 레이아웃 입 니 다.위의 레이아웃 front 는 아래 의 레이아웃 back 을 덮 고 미 끄 러 질 때 front 를 미 끄 러 뜨 려 아래 의 back 이 표 시 됩 니 다.하지만 위 챗 의 슬라이딩 삭 제 를 보 니 그렇지 않 은 것 같 습 니 다.화면 을 뛰 어 넘 는 단층 레이아웃 같 습 니 다.미 끄 러 질 때 오른쪽 화면 을 뛰 어 넘 는 button 이 화면 에 들 어 갑 니 다.SwipeListView 컨트롤 을 사용 하 는 것 이 아 닐 것 같 습 니 다.QQ 의 미끄럼 삭 제 는 ListView 의 item 오른쪽 에 button 을 숨 깁 니 다.그러나 미끄럼 사건 이 감지 되 었 을 때 button 에 나타 난 애니메이션 을 보 여 주 는 것 이 가장 좋 은 방안 일 것 입 니 다.
이 편 은 주로 SwipeListView 라 는 오픈 소스 프레임 워 크 를 배 웁 니 다.
이 프레임 워 크 를 사용 하 는 방법 은 두 가지 가 있 습 니 다.하 나 는 SwipeListView Library 라 이브 러 리 를 가 져 와 안 드 로 이 드 프로젝트 의 의존 라 이브 러 리 로 사용 하 는 것 입 니 다.SwipeListView Library 라 이브 러 리 프로젝트 자체 도 다른 인기 있 는 오픈 소스 프레임 워 크 인 Nine Old Androids 에 의존 하기 때문에 이것 도 인터넷 이나 github 에서 쉽게 찾 을 수 있 습 니 다.
이 두 개의 라 이브 러 리 프로젝트 를 가 져 옵 니 다.Nine Old Androids 에 대해 다음 과 같은 설정 을 합 니 다.사실은 주로 Is Library 라 는 옵션 을 선택 하면 Nine Old Androids 프로젝트 를 다른 프로젝트 의 의존 라 이브 러 리 로 사용 할 수 있 습 니 다. 

SwipeListView Library 에 대해 서 는 Is Library 옵션 을 선택 하 는 것 외 에 옆 에 있 는 Add 에 Nine Old Androids 를 본 라 이브 러 리 의 의존 라 이브 러 리 로 추가 하 는 것 을 기억 하 십시오.

다음은 이 라 이브 러 리 를 사용 하 는 것 입 니 다.먼저 위의 두 라 이브 러 리 공 사 를 클 린 하 세 요.공사 의 오류 가 많 을 때 클 린 하면 됩 니 다.그리고 자신의 프로젝트 를 새로 만 들 고 Add 옵션 에 SwipeListView Library 프로젝트 를 추가 하면 됩 니 다.이렇게 하면 SwipeListView 라 는 컨트롤 을 직접 사용 할 수 있 습 니 다.간단 합 니 다.코드 는 다음 과 같 습 니 다. 

 <com.fortysevendeg.swipelistview.SwipeListView
  android:id="@+id/swipe_lv"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:swipeMode="left"
  app:swipeAnimationTime="300"
  app:swipeOffsetLeft="200dp"
  app:swipeFrontView="@+id/front"
  app:swipeBackView="@+id/back"
  app:swipeActionLeft="reveal"/>
그 중에서 app:swipeFrontView 속성 은 앞에서 말 한 framelayot 의 위 에 있 는 view 의 id 를 지정 하 는 것 입 니 다.app:swipeBackView 는 아래 층 의 view 를 지정 하 는 id 입 니 다.아래 에 BaseAdatpter 가 사용 할 item 의 레이아웃 을 사용자 정의 하면 볼 수 있 습 니 다.

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
  <RelativeLayout
    android:id="@+id/back"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
      android:id="@+id/close_btn"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerVertical="true"
      android:layout_toLeftOf="@+id/delete_btn"
      android:text="Close"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:focusable="false"
      android:focusableInTouchMode="false"/>
    <Button
      android:id="@+id/delete_btn"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerVertical="true"
      android:layout_alignParentRight="true"
      android:text="Delete"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:focusable="false"
      android:focusableInTouchMode="false"/>
  </RelativeLayout>
  <RelativeLayout
    android:id="@+id/front"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white">
    <TextView
      android:id="@+id/content_tv"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:gravity="center"
      android:text="hello world"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:textColor="@android:color/black"/>
  </RelativeLayout>
</FrameLayout>
Activity 에서 초기 화 된 코드:

arrays = new ArrayList<String>(Arrays.asList(Util.arrays));

    mSwipeLv = (SwipeListView)findViewById(R.id.swipe_lv);
    mAdapter = new MyAdapter(this, arrays);
    mSwipeLv.setAdapter(mAdapter);
    mSwipeLv.setSwipeListViewListener(new BaseSwipeListViewListener() {

      @Override
      public void onClosed(int position, boolean fromRight) {
      }
    });
BaseAdapter 의 getView()사용자 정의: 

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

      if(convertView == null) {
        holder = new ViewHolder();
        convertView = LayoutInflater.from(mContext).inflate(
            R.layout.layout_swipe_list_item, null);
        holder.mContentTv = (TextView)convertView.findViewById(R.id.content_tv);
        holder.mCloseBtn = (Button)convertView.findViewById(R.id.close_btn);
        holder.mDeleteBtn = (Button)convertView.findViewById(R.id.delete_btn);

        convertView.setTag(holder);
      } else {
        holder = (ViewHolder)convertView.getTag();
      }

      holder.mContentTv.setText(arrays.get(position));
      holder.mCloseBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
          ((SwipeListView)parent).closeAnimate(position);
        }
      });
      holder.mDeleteBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
          ((SwipeListView)parent).closeOpenedItems();
          mHandler.postDelayed(new Runnable() {

            @Override
            public void run() {
              mArrays.remove(position);
              mAdapter.notifyDataSetChanged();
            }
          }, 350);
        }
      });

      return convertView;
    }

그리고 ok 입 니 다.프로젝트 를 실행 하 는 효 과 는 다음 과 같 습 니 다. 

다른 하 나 는 SwipeListView 컨트롤 을 사용 하 는 방법 은 공식 적 으로 제 시 된 두 개의 jar 가방 을 직접 가 져 오 는 것 입 니 다.위 에 있 는 시작 주소 에서 볼 수 있 지만 이 두 개의 jar 가방 을 직접 가 져 오 는 것 은 바로 사용 할 수 있 는 것 이 아 닙 니 다!우선 이 가방 을 새 프로젝트 의 build path 에 추가 합 니 다.프로젝트 에 안 드 로 이 드 지원 패키지 가 추가 되 지 않 았 다 면 안 드 로 이 드-슈퍼 포트-v4.jar 기억 도 아래 와 같 습 니 다.그리고 앞에서 가 져 온 SwipeListView Library 라 이브 러 리 프로젝트 의 res\values\swipelistviewattrs.xml 파일 을 새 프로젝트 의 res/values/디 렉 터 리 에 복사 합 니 다.이 파일 은 주로 SwipeListView 컨트롤 의 각 속성 을 설명 합 니 다.직접 가 져 온 jar 패 키 지 는 이러한 속성 을 설명 하 는 파일 이 포함 되 어 있 지 않 습 니 다.그 다음 에 위 와 같이 코드 에서 인용 되 었 습 니 다.그러나 두 가 지 를 주의해 야 합 니 다.하 나 는 jar 가방 안에 있 는 SwipeListView 의 가방 이름과 라 이브 러 리 프로젝트 에 있 는 가방 이름 이 다 릅 니 다.인용 할 때 다음 과 같이 주의해 야 합 니 다.둘째,준비 가 다 되 었 습 니 다.앞의 절차 가 틀 리 지 않 았 음 을 확인 한 후에 가끔 은 컴 파일 할 때 잘못 되 었 습 니 다.swipeFrontView 와 swipeBackView 두 가지 속성 을 밝 히 지 않 았 다 고 합 니 다.이 문 제 는 SwipeListView 프레임 워 크 의 bug 인 것 같 습 니 다.stackoverflow 에서 지적 한 바 와 같이 레이아웃 파일 에 swipeFrontView 와 swipeBackView 라 는 두 가지 속성 을 밝 힐 만 한 가치 가 있 을 때 입 니 다.id 의 이름 을 사용자 정의 하지 않 고 swipelistview 를 사용 하 는 것 이 좋 습 니 다.backview 와 swipelistviewfrontview。
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기