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

Fragment 에 RecyclerView 관련

0 추천
Fragment입니다

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.user_page.R;
import com.example.user_page.RecyclerViewAdapter;
import java.util.ArrayList;


public class user_1 extends Fragment {

    private final ArrayList<RecyclerViewAdapter.Favorite> favorites = new ArrayList<>();
    private RecyclerView recyclerView;
    private RecyclerViewAdapter mAdapter;

    ViewGroup viewGroup;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        viewGroup = (ViewGroup) inflater.inflate(R.layout.user_1, container, false);

        recyclerView = viewGroup.findViewById(R.id.recyclerview);
        recyclerView.setHasFixedSize(true);
        mAdapter = new RecyclerViewAdapter(favorites);

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);

        return viewGroup;

    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        item();
    }


    private void item(){
        favorites.add(new RecyclerViewAdapter.Favorite("가"));
        favorites.add(new RecyclerViewAdapter.Favorite("가"));
        favorites.add(new RecyclerViewAdapter.Favorite("가"));
        favorites.add(new RecyclerViewAdapter.Favorite("가"));

    }
 }

 
RecyclerViewAdapter 입니다


import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;




public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    private final ArrayList<Favorite> mDataset;

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView name;

        public MyViewHolder(View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.name);
        }
    }


    public RecyclerViewAdapter(ArrayList<Favorite> myData){
        this.mDataset = myData;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recyclerview_item, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewAdapter.MyViewHolder holder, int position) {
    holder.name.setText(mDataset.get(position).getName());

    }

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

    public static class Favorite{
        private String name;

        public Favorite(String name){
            this.name = name;
        }

        public String getName(){
            return name;
        }

        public void setName(String name){
            this.name = name;
        }
    }
}

 

ViewHolder 와 같이 되어있습니다

 

 

처음질문

Fragment 에 RecyclerView 를 넣고 Item 들을 넣어놓은상태입니다
각각 Item 별로 클릭 했을 때  Activity 로 Intent 되었으면 합니다
검색 경로나 힌트좀 부탁드릴게요ㅠㅠ

뽕짝 (390 포인트) 님이 2021년 9월 26일 질문
뽕짝님이 2021년 9월 26일 수정

3개의 답변

0 추천

Adpater안에  아이템을 클릭했을 때 반응할 수 있는 Listener 를 위치시키세요.

plubic interface AdapterItemListener<T> {
       void onItemClicked(T item);
 }

public class MyAdapter extednds RecyclerView.Adapter<RecyvlerView.ViewHolder> {
          
         @Nullable
         private AdapterItemListener<ItemType> listener;

         public void setListener(AdapterItemListener<ItemType> listener) {
               this.listener = listener
         }  
}

 

RecyclerView.Adapter 의 onCreateViewHolder나 onBindViewHolder에 listener 을 연결하세요.

@Override
public abstract MyViewHolder onCreateViewHolder (ViewGroup parent, int viewType) {
          View itemView = LayoutInflator.from(parent.context).inflater(layoutId, parent, false);
          return new MyViewHolder(itemView, this.listener);
}

@Override
public abstract void onBindViewHolder (MyViewHolder holder, int position) {
    holder.bindItem(getitem(position));
}

 

ViewHolder에서 listener를 설정해 주세요.

public class MyViewHolder extends RecyclerView.ViewHolder {
 
      private final AdapterItemListener<T> listener;
     
      public MyViewHolder(View itemView,  AdapterItemListener<T> listener) {
          this.listener = listener;
      }

     public void bindItem(MyItem item) {
          this.itemView.setOnClickListener(v -> [
              listener.onItemClicked(item);
          });
     }
}

뷰쪽에서 Adapter에 있는 listener에 필요한 액션을 집어넣어 주시면 됩니다.

public class MyActivity extends AppCompatActivty {

      private MyAdapter adapter;
   
      @Override
      public void onCreate (Bundle savedInstanceState) {
               super.onCreate(savedInstanceState)

               // RecylcerView 설정 코드 생략
              adapter = new MyAdpater();
              adapter.setListener(item -> {
                  // 아이템 클릭시 동작
                  // 아이템을 체크하여 원하는 액티비티로 이동.
              }); 
       }
  
}

 

각자의 스타일에 따라 adapter의 bindViewHolder안에서 직접 클릭이벤트를 처리할 수도 있고, ViewHolder 안에서 getBindingAdapterPosition 을 호출해서 눌린 아이템인 어떤 것인지 처리할 수도 있긴 합니다만, 전체적인 골격은 같습니다.

사용하시는 코드에 대해서는 전혀 언급이 없기 때문에 아이템 클릭시의 구체적인 처리는 제가 말씀드릴 수가 없고, 님이 사용하시는 코드를 기반으로 작성하시면 될 듯합니다.

spark (226,420 포인트) 님이 2021년 9월 26일 답변
답변 주신 코드로 만들어 볼려고 했는데요 감이 안와서 코드 올립니다ㅠㅠ

한번만 확인 부탁드리겠습니다

혹시 비슷한 내용으로 해서 설명된 블로그나 사이트가 있을까요?
검색해도 원하는 형태로는 안나와서요..
0 추천

리사이클러뷰 사용법이 익숙하지 않으신 것 같은데, 별도로 개발자 문서를 읽어보시는 게 좋은 것 같습니다. 찾으시는 기능은 아주 흔하게 찾으실 수 있는 패턴입니다. 님이 올리신 코드에 적용된 코드를 올려 드릴게요. 중복되는 부분들을 생략했습니다.

plubic interface AdapterItemListener<T> {
    void onItemClicked(T item);
}

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
    private AdapterItemListener<Favorite> mListener;

    public void setListener(AdapterItemListener<Favorite> listener) {
         mListener = lsitenrer;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recyclerview_item, parent, false);
        return new MyViewHolder(view, mListener);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewAdapter.MyViewHolder holder, int position) {
         holder.bindItem(mDataset.get(position));
    }
}

public class MyViewHolder extends RecyclerView.ViewHolder {
     private final TextView name;

     private final AdapterItemListener<Favorite> mListener;
     public MyViewHolder(View itemView, AdapterItemListener<Favorite> listener) {
          super(itemView);
          name = findViewById(R.id.name);
          mListener = listener;  
     }

     public void biindItem(Favorite item) {
          name.text = item.getName();
          itemView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClicke(View view) {
                    mListener.onItemClicked(item);
              }
          });
     }
}

 

위처럼 하시고, Fragment에서 Adapter의 listener만 연결해 주면 됩니다.

public class user_1 extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        viewGroup = (ViewGroup) inflater.inflate(R.layout.user_1, container, false);
 
         ...
        mAdapter = new RecyclerViewAdapter(favorites);
        mAdapter.setListener(new AdapterItemListener<Favorite>() {
            @Override
            public void onItemClicked(Favourite item) {
                 if (item.name.equals("문자열1")) {
                     //원하는 액티비티 이동
                     return;
                 }

                 if (item.name.equals("문자열2")) {
                    //원하는 액티비티 이동
                     return;
                 }
            }
        });
 
       ...
 
        return viewGroup;
    }
}

위의 코드는 아주 기본적인 안드로이드 코드입니다. 코드를 보고 이해가 되지 않으시면 기본적인 자바와 안드로이드 공부를 하시는 걸 추천드립니다.

spark (226,420 포인트) 님이 2021년 9월 26일 답변
spark님이 2021년 9월 26일 수정
0 추천
holder를 이용해서 intent를 하면 되지 않을까요?
MOM (180 포인트) 님이 2021년 9월 29일 답변
...