마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

태그 기능을 구현하려는데 조언좀 부탁드립니다..

0 추천

(발그림 죄송합니다..)

태그 관련된 기능을 구현하려고합니다.

위 사진에서 등, 하체 ,어깨 라는 텍스트뷰가 있는데 이 텍스트뷰를 클릭하면

해당 태그에 맞는 운동 종목들을 아래 item이라는 칸에 주르륵 보여주는 그런 기능을 구현하려고합니다.

그런데 어떻게 구현해야할지 좀 애매?한것같습니다.. 뷰에 setTag라고해서 태그를 지정하는 기능이있긴한데

여기까지는 좋은데 아이템항목을 해야할지 모르겠습니다.

항목별 태그지정부터.. 보여주기까지.. 보여주는건 리사이클러뷰를 쓰면 될것같은데

항목마다 태그를 어떻게 지정하고 태그 클릭시 알맞은 항목들을 보여줄 수 있을까요?

 

무식하게 xml에 텍스트뷰 여러개할수도 없는 노릇이구요.. 등 운동 하체운동 어깨운동마다 운동종목 갯수도 

다르고 비효율적이라고 생각돼서요.

구글에 검색하니 tag하면 다 log 관련 밖에 안나오네요..

git에도 태그 기능이 있을까 검색해봤는데 있긴한데 태그를 설정?하는 그런 기능들만 있지

제가 구현하는 것처럼 태그를 누르면 그 태그가 설정되어있는 항목들으 보여주는 그런 기능은 없는것

같더라구요..

 

어떻게 태그에 대한 항목을 처리하면 좋을까요?

codeslave (3,940 포인트) 님이 2021년 1월 3일 질문

1개의 답변

0 추천

 태그가 결국 쿼리 파라미터와 같은 역할인데, 리사이클러뷰에 그냥 데이터를 뿌리는 것과 별 차이는 없어 보이네요. 핵심포인트는 등, 하체, 어깨에 해당하는 데이터를 어떻게 가져가느냐이고 리사이클러뷰는 각각에 맞는 뷰홀더를 사용해서 다른 데이터를 보여주면 되는 것 같은데, 이게 원하시는 것인지 헷갈리네요. 제가 질문을 잘못이해한건지... 리사이클러뷰를 사용하는 방법을 아시면 바로 해결이 되는 것 같아서요.

아마도 리사이클러뷰 어댑터의 코드는 아래처럼 될 것 같네요.어댑터 코드보다도 데이터구조를 어떻게 가져가느냐가 먼저입니다.
 

public abstract class Excercise {
    protected int viewType;

    public int getViewType() {
        return viewType;
    }

    public void setViewType(int viewType) {
        this.viewType = viewType;
    }
}


public class BackExercise extends Excercise {
    @Override
    public int getViewType() {
        return R.layout.item_back_excercise;
    }
}

public class LegsExercise extends Excercise {
    @Override
    public int getViewType() {
        return R.layout.item_legs_excercise;
    }
}

public class ShoulderExercise extends Excercise {
    @Override
    public int getViewType() {
        return R.layout.item_shoulder_excercise;
    }
}


public class ExceriseAdapter extends RecyclerView.Adapter<ExcerciseViewHolder<Excercise>>()  {

     private List<Excercise> items;
     public ExceriseAdapter(List<Excercise> items) {
         this.items = items;
    }

    public void setItems(List<Excercise> items) {
      this.items = items;
    }

    @Override
    public int getViewType(int position) {
            return items.get(position).getViewType;
    }

    @Override
    public ExcerciseViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext).inflate(viewType, parent, false);
            switch (viewType) {
                 case R.layout.item_back_excercise: return new BackExceriseViewHolder(itemView);
                 case R.layout.item_back_excercise: return new BackExceriseViewHolder(itemView);
                 case R.layout.item_back_excercise: return new BackExceriseViewHolder(itemView);
                 default: throw new IlleaglArgumentException("Cannot find view type: " + viewType);
            }
    }

   @Override
    public void onBindViewHolder(ExcerciseViewHolder viewHolder, final int position) {
          viewHolder.bind(items.get(position))
    }

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

}

public abstract class ExcerciseViewHolder<T> extends RecyclerView.ViewHolder {
        private final TextView textView;

        public ViewHolder(View view) {
            super(view);
         }

         public abstract void bind(item: T) 
    }

}

public class BackExerciseViewHolder extends ExcerciseViewHolder<BackExercise> {
 ...
}

public class LegsExerciseViewHolder extends ExcerciseViewHolder<LegsExercise> {
 ...
}

public class ShoulderExerciseViewHolder extends ExcerciseViewHolder<ShoulderExercise> {
 ...
}

 

클릭한 텍스트뷰에 따라서 거기에 맞는 List를 가져오신 다음, adapter.setItems()를 호출하시면 됩니다. 그리고 액티비티에서 아래처럼 post의 runnable에서 notifyDataSetChanged()를 호출해주시면 됩니다.

adapter.setItems(items);
recyclerView.post({
       adapter.notifyDataSetChanged();
});

 

spark (224,800 포인트) 님이 2021년 1월 3일 답변
감사합니다 선생님이 질문 이해하신것같아요. 그런데 제가 본문에 빠트린게
각 태그별로 아이템이 별 특별한 레이아웃이 아니라 그냥 텍스트만 보여줄거라
텍스트뷰로만 구성할것같은데요
선생님께서 답변주신거보면 지금 태그별(운동부위별)로 각기 다른 레이아웃을 리턴해서 뷰홀더에 설정해주셨는데요.
태그간 아이템 레이아웃은 같고 안의 데이터만 다르다면 레이아웃을 다르게 설정해줄 필요없을까요?
아니면 그래도 태그별로 다른 운동종목들을 보여줘야하니까 아이템의 레이아웃이 같아도 각각 뷰홀더를 다르게 설정해줘야하는건가요?
선생님 제가 다른 방법도 생각해봤는데 이게 옳은 방법인지..
ArrayList<Model> 해서 Model타입의 아이템을 어댑터에 추가할텐데..
이때 Model 클래스에 있는 멤버변수가 String[] 타입이라고하면요.
ArrayList 크기말고 ArrayList내에 있는 Model의 String[] 의 사이즈를 계산해서 리사이클러뷰 아이템을 뿌려주는 방식은 어떤가요..?
그러면 뷰홀더를 따로 상속의 다형성을 이용하지않고 ArrayList<Model>에
각기 다른 등, 어깨, 하체에 해당하는 String[] 데이터만 넣어주고 각각 계산해서 뿌리는 방식은 별로일까요?|
아직 실험적으로 3개다 넣어보진않고 하나만 넣어서 뿌리기는 성공했고,,
두개도 시도해봣는데 태그하나 누르고 다른태그를 누르면 전환되지는 않습니다,..
제가 예를 든 것은 님의 데이터 구조에 대한 언급이 전혀 없었기 때문에 제가 임의대로 추측한 것입니다. 해당 데이터 구조는 님이 제일 잘 아시기 때문에 언급하지 않으시면, 저는 어떤 구조인지 알 길이 없습니다. 운동부위별로 다르다는 힌트만 가지고는 그것 다 생각해내긴 좀 힘들 것 같구요. 댓글을 다신 걸 보면, 데이터 구조에 대해 아직 결정을 안하신듯 하네요.
님의 경우에 해당하는 답을 구하시려면, 님이 지금까지 해보셨던 것들과 관련 코드를 올리시고 안되는 부분이 무엇인지 좀더 디테일하게 말씀하셔야 할 것 같아요.
아..데이터 구조라는게 아이템 말씀하시는건지.. 맞다면
아이템은 레이아웃은 오직 데이커를 보여주는 텍스트뷰하나만 구성할것이고
따라서 아이템 모델은 String만 가질겁니다..

그래서 등 태그를 누르면 해당 종목들이 나오고 또 어깨 태그를 누르면
이제 등 데이터는 사라지고 어깨  종목들이 보이는방식으로 구성할예정입니다..
그럼, 님 말씀처럼 adapter, viewholder는 List<String>의 데이터를 보여줄 수 있으면 되기 때문에 하나씩만 있으면 되겠네요. 신체부위를 누르면 해당하는 List<String> 가져와서 어댑터에 넣어주고 recyclerView.post에서 notifyDataSetChanged를 호출하면 됩니다.
...