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

LinearLayout Button 동적 할당에 Adapter 사용 가능할까요?

0 추천

안녕하세요. 현재 제가 DB에서 날짜를 조회해서 매일매일 다른 시간에 Button이 여러개 생겨야 해서 LinearLayout에 Button을 동적할당 시키고자 합니다.

 

제가 RecyclerView에 Adapter를 이용하여 xml파일을 inflate 시켜서 나타나게 하는건 했는데,

혹시 LinearLayout에 Adapter를 사용하여 Button을 동적할당 하는게 가능할까요?

인터넷에 관련된 내용들을 여러번 검색해봤는데 이렇다 할 내용을 못찾아서요.ㅠㅠ

 

RecyclerView에 Adapter를 사용해서 작성한 코드는 아래와 같습니다.

LinearLayout에 Adapter를 사용하는게 가능하다면 이와 비슷하게 코드를 작성하면 될까요? 

 

MainActivity.java

linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
rv_calendar_list.setLayoutManager(linearLayoutManager);

SqlHelper.calendarAdapter = new CalendarRecyclerAdapter();
SqlHelper.calendarAdapter.setOnClickListener(this);
rv_calendar_list.setAdapter(SqlHelper.calendarAdapter);

 

CalendarRecyclerAdapter.java

public class CalendarRecyclerAdapter extends RecyclerView.Adapter<CalendarRecyclerAdapter.ItemViewHolder> {

    private ArrayList<DateData> listData = new ArrayList<>();
    private MyRecyclerViewClickListener mListener;
    private Context context;

    public interface MyRecyclerViewClickListener {
        void onItemClicked(int position);
    }

    public void setOnClickListener(MyRecyclerViewClickListener listener) {
        mListener = listener;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // LayoutInflater 를 이용하여 전 단계에서 만들었던 day_list.xml 을 inflate 시킴
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.day_list, parent, false);
        context = parent.getContext();

        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        holder.onBind(listData.get(position));

        if(mListener != null) {
            final int pos = position;
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mListener.onItemClicked(pos);
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return listData.size();
    }
    public void addItem(DateData data) {
        listData.add(data);
    }

    public void clear() {
        listData.clear();
    }

    // RecyclerView 의 핵심인 ViewHolder
    // 여기서 subView 를 setting 해줌
    class ItemViewHolder extends RecyclerView.ViewHolder {
        private final TextView tv_title;
        private final TextView tv_time;
        private final TextView tv_name;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);

            tv_title = itemView.findViewById(R.id.tv_title);
            tv_time = itemView.findViewById(R.id.tv_time);
            tv_name = itemView.findViewById(R.id.tv_name);
        }

        void onBind(final DateData data) {
            tv_title.setText(data.getMeetingTitle());
            tv_time.setText(data.getStartTime() + "~" + data.getEndTime());
            tv_name.setText(data.getMeetingName());
        }
    }
}

 

오이52 (290 포인트) 님이 2022년 3월 16일 질문

2개의 답변

0 추천
RecyclerView 는 ListView 확장본 (?) 입니다.
 LinearLayout 는 위치 지정하는 뷰이구요. 사용 용도부터가 다릅니다.
복잡하게 생각하신 듯 한데,  LinearLayout add View로 RecyclerView 를 추가하는게 가능하니,

LinearLayout에  RecyclerView를   추가하고,  RecyclerView adapter를 사용하세요.
익명사용자 님이 2022년 3월 16일 답변
감사합니다! 제가 너무 복잡하게 생각하고 있는 것 같습니다.
말씀해주신 점 참고하겠습니다. 감사합니다!
0 추천

어떤 결과물이 필요하냐에 따라 결정하시면 될 것 같습니다. 상황에 따라서는 RecyclerView가 맞을 수도 있고, CustomView가 적합할 수도 있고, 그냥  LinearLayout에 버튼을 동적으로 추가하는 것이 나을 때도 있습니다. 

질문에서 언급하신,

 DB에서 날짜를 조회해서 매일매일 다른 시간에 Button이 여러개 생겨야 해서 LinearLayout에 Button을 동적할당 시키고자 합니다.

위의 내용으로는 어떤 방식이 더 적합한지 말씀드리기가 어렵습니다.  

 

참고로, CalendarRecyclerAdapter는 Calendar를 표시하는 어댑터처럼 보이지만 실제로 하는 일이 다르네요.  적절한 클래스이름을 사용하시면 좋을 듯 합니다.

spark (227,830 포인트) 님이 2022년 3월 16일 답변
감사합니다. 어떤 결과물이 필요하냐에 따라 제가 다시  고민해보겠습니다!

말씀해주신 CalendarRecyclerAdapter 이름은 알려주신 덕분에 다른 이름으로 변경했습니다. 감사합니다!
...