개발일지/멀티메모

[멀티메모] 4일차

Emil :) 2019. 12. 14. 14:18
728x90
반응형

최종 목표


  1. 음성녹음 버그 수정
  2. TODO 기능 추가하기 (푸시 알림 기능도 구현해보도록 하자)
  3. 메모 리스트 좌우로 슬라이드 하면 삭제 되도록 하기

오늘의 목표


  1. 스와이프 메뉴 구현하기

참고


https://karrel.tistory.com/13?category=626726

 

[안드로이드] swipe to remove item on recyclerview

서론 리사이클러뷰에서 밀어서 아이템 삭제 기능을 구현하고 싶어서 샘플을 만들어 보았다. ListView에서 해당기능을 이용하기위한 여러가지 라이브러리들이 존재하는데 RecyclerView에서는 compile sdk 22버전부..

karrel.tistory.com

 

진행 과정


1. 리사이클러 뷰를 이용한 스와이프 메뉴 만들기


기존에 사용하던 스와이프 메뉴 리스트뷰는 편리하지만 너무 복잡했다.
구글링을 좀더 해본 결과, 리사이클러 뷰 라는것을 사용해보기로했다.

그런데 샘플 코드는 작동이 잘 되지만, 내 코드랑 병합시키려니까 또 오류가 생긴다..(눈물)

일단 샘플 코드는 다음과 같다.

package com.karrel.swipetodeletesample;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Toast;

import com.karrel.swipetodeletesample.databinding.ActivityMainBinding;
import com.karrel.swipetodeletesample.databinding.ItemRecyclerBinding;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private List<String> mList = new ArrayList<>();
    private ActivityMainBinding mBinding;
    private Toast mToast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        // make sample data
        for (int i = 0; i < 10; i++) {
            mList.add(String.format("sample item %s", i + 1));
        }

        // init recyclerView
        mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
        mBinding.recyclerView.setAdapter(new RecyclerView.Adapter() {
            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
                CustViewHolder holder1 = (CustViewHolder) holder;
                holder1.setData(mList.get(position));
            }

            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                ItemRecyclerBinding binding = DataBindingUtil.inflate(LayoutInflater.from(MainActivity.this), R.layout.item_recycler, parent, false);
                return new CustViewHolder(binding);
            }

            @Override
            public int getItemCount() {
                return mList.size();
            }
        });


        // setup swipe to remove item
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
        itemTouchHelper.attachToRecyclerView(mBinding.recyclerView);
    }

    /**
     * view holder class
     */
    class CustViewHolder extends RecyclerView.ViewHolder {

        private ItemRecyclerBinding mBinding;

        public CustViewHolder(ItemRecyclerBinding binding) {
            super(binding.getRoot());
            mBinding = binding;
        }

        public void setData(String data) {
            mBinding.text.setText(data);
        }
    }

    ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            showToast("on Move");
            return true;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            // 삭제되는 아이템의 포지션을 가져온다
            final int position = viewHolder.getAdapterPosition();
            // 데이터의 해당 포지션을 삭제한다
            showToast("on remove " + mList.remove(position));
            // 아답타에게 알린다
            mBinding.recyclerView.getAdapter().notifyItemRemoved(position);
        }
    };

    private void showToast(String msg) {
        if (mToast != null) mToast.cancel();

        mToast = Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT);
        mToast.show();
    }
}

 내가 원하고자 하는 그림은 이런것.

 

여기서 스와이프하면 대화상자를 띄워서 삭제 여부를 묻는것도 띄워보고 싶은데, 문제는 이게 원래 코드에서 작동이안된다... 

 

2. 왜 안될까?


일단 오류나는 부분은 다음과 같다.

Cannot resolve symbol 'ActivityMainBinding' , 'recylerView' 가 나온다.

이거는 흔히 변수선언이나.. 그런거 안했을때 나오던건데.. 문제는 Gradle에서도 다 implementaion 해줬고 ㅠㅠㅠ 샘플코드랑 다른게 없는데 왜 여기서 에러가 나는지 모르겠다.. 샘플코딩을 해서 감을 잡아야 내꺼를 대입을 하던 말던 하는데..

 

오늘의 결과


오류 해결하다가 오늘 하루도 다갔다... 빨리끝내야되는데 ㅠㅠ

728x90
반응형

'개발일지 > 멀티메모' 카테고리의 다른 글

[멀티메모] 5일차  (0) 2019.12.18
[멀티메모] 3일차  (0) 2019.12.02
[멀티메모] 2일차  (0) 2019.11.30
[멀티메모] 1일차  (0) 2019.11.26