안드로이드

안드로이드 리스트뷰ListView 아이템 클릭 시 swipeListView처럼 애니메이션 동작하도록

알통몬_ 2017. 5. 18. 10:29
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

2017/05/16 - [안드로이드] - 안드로이드 애니메이션 Animation x,y 좌표 이동 애니메이션과 애니메이션 후 위치(좌표) 고정


지난 포스팅에서 x,y좌표이동 애니메이션에 대해 공부했는데요.

지난 포스팅에서 말씀드린대로 애니메이션을 이용해 ListView의 아이템을 클릭했을 때 스와이프 애니메이션처럼 구현하는 방법에 대해 포스팅하겠습니다.


먼저 동작 영상입니다.


필요한 클래스 및 xml

1. Item.java

리스트 뷰의 아이템이 될 클래스입니다.

 package example.semiswipe;

public class Item {

    private String front;

    private String back;


    public Item(String front, String back) {

        this.front = front;

        this.back = back;

    }


    public String getFront() {

        return front;

    }


    public String getBack() {

        return back;

    }

}



2. item.xml

리스트 뷰의 아이템이 될 뷰입니다.

FrameLayout 안에 먼저 보여질 아이템과 숨겨진 아이템을 놓았습니다.

 <?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="60dp">

    <LinearLayout

        android:background="#c9c9c9"

        android:visibility="gone"

        android:id="@+id/backLayout"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="horizontal">

        <TextView

            android:id="@+id/backTv"

            android:textColor="#000000"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:gravity="center"

            android:text="뒤에 숨어있는 아이템"/>

    </LinearLayout>

    <LinearLayout

        android:background="#FFFFFF"

        android:id="@+id/frontLayout"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="horizontal">

        <TextView

            android:id="@+id/frontTv"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:gravity="center"

            android:text="첨에 보여지는 아이템"/>

    </LinearLayout>


</FrameLayout>


3. ItemAdapter.java

package example.semiswipe;


import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

import android.widget.TextView;


import java.util.ArrayList;


/**

 * Created by 15U560 on 2017-05-18.

 */


public class ItemAdapter extends BaseAdapter {


    ArrayList<Item> items;

    LayoutInflater inflater;


    public ItemAdapter(ArrayList<Item> items, LayoutInflater inflater) {

        this.items = items;

        this.inflater = inflater;

    }


    @Override

    public int getCount() {

        return items.size();

    }


    @Override

    public Object getItem(int position) {

        return items.get(position);

    }


    @Override

    public long getItemId(int position) {

        return 0;

    }


    @Override

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

        final ViewHolder viewHolder;

        if (convertView == null) {

            convertView = inflater.inflate(R.layout.item, parent, false);

            viewHolder = new ViewHolder();

            viewHolder.frontTv = (TextView) convertView.findViewById(R.id.frontTv);

            viewHolder.backTv = (TextView) convertView.findViewById(R.id.backTv);

            viewHolder.backLayout = (LinearLayout) convertView.findViewById(R.id.backLayout);

            viewHolder.frontLayout = (LinearLayout) convertView.findViewById(R.id.frontLayout);

            convertView.setTag(viewHolder);

        } else {

            viewHolder = (ViewHolder)convertView.getTag();

        }

        viewHolder.frontTv.setText(items.get(position).getFront());

        viewHolder.backTv.setText(items.get(position).getBack());

        viewHolder.backLayout.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                MainActivity.translateAnim(-1f,0,0,0,500,viewHolder.frontLayout);

                viewHolder.backLayout.setVisibility(View.GONE);

                  x,y 좌표 이동 애니메이션

            }

        });

        return convertView;

    }


    private class ViewHolder { // 뷰홀더 패턴 사용

        TextView frontTv;

        TextView backTv;

        LinearLayout backLayout;

        LinearLayout frontLayout;

    }

}



4. MainActivity.java

 package example.semiswipe;


import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.view.animation.Animation;

import android.view.animation.TranslateAnimation;

import android.widget.AdapterView;

import android.widget.LinearLayout;

import android.widget.ListView;


import java.util.ArrayList;


public class MainActivity extends AppCompatActivity {


    private ListView semiSwipeLv;

    private ArrayList<Item> items;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        semiSwipeLv = (ListView) findViewById(R.id.semiSwipeLv);

        items = new ArrayList<>();

        for(int i = 0; i<10; i++) {

            items.add(new Item("첨에 보여지는 아이템("+i+")","숨어있는 아이템("+i+")"));

        }


        ItemAdapter adapter = new ItemAdapter(items, getLayoutInflater());

        semiSwipeLv.setAdapter(adapter);

        semiSwipeLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override

            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                LinearLayout frontLayout = (LinearLayout) view.findViewById(R.id.frontLayout);

                LinearLayout backLayout = (LinearLayout) view.findViewById(R.id.backLayout);

                translateAnim(0,-1f,0,0,500,frontLayout);

                backLayout.setVisibility(View.VISIBLE);


            }

        });

    }

    public static void translateAnim(float xStart, float xEnd, float yStart, float yEnd, int duration, LinearLayout layout) {

        TranslateAnimation translateAnimation = new TranslateAnimation(

                Animation.RELATIVE_TO_SELF,xStart,

                Animation.RELATIVE_TO_SELF, xEnd,

                Animation.RELATIVE_TO_SELF,yStart,

                Animation.RELATIVE_TO_SELF,yEnd);

        translateAnimation.setDuration(duration);

        translateAnimation.setFillAfter(true);

        layout.startAnimation(translateAnimation);

    }

}



5. activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="example.semiswipe.MainActivity">

<ListView

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:id="@+id/semiSwipeLv"/>

</LinearLayout>



위에 언급한 파일들입니다.

필요하신 분들은 가져다가 사용하시면 됩니다~

Item.java

ItemAdapter.java

MainActivity.java

activity_main.xml

item.xml


더 좋고 유익한 포스팅으로 돌아오겠습니다 ㅎㅎ


이상입니다.

반응형