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

recyclerView 마지막에 버튼을 추가하고 싶습니다.

0 추천

마지막에 버튼을 하나만 추가하고 싶은데 itemList에서 버튼 만들면 된다고 생각했는데 그게 아닌가 보네요.

리스트뷰 마지막에 버튼을 추가하려면 어떤식으로 해야하나요?

<ItemList.java>

public class ItemList {
    private String listText;
    private Button button;

    public ItemList(String text) { this.listText = text; }

    public ItemList(Button button) { this.button = button; }

    public String getListText() { return listText;}

    public String getBtnText() { return button.getText().toString();}
}

 

[RecyclerViewAdapter.java]

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private ArrayList<ItemList> itemList = new ArrayList<ItemList>();

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        Button button;

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

            textView = itemView.findViewById(R.id.itemTitle);
        }

        public TextView getTextView() {
            return textView;
        }

        public Button getBtnView() {
            return button;
        }
    }

    public RecyclerViewAdapter(ArrayList<ItemList> list) {
        itemList = list;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.item_list, parent, false);
        RecyclerViewAdapter.ViewHolder vh = new RecyclerViewAdapter.ViewHolder(v);

        return vh;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        ItemList item = itemList.get(position);
        if(item.getListText() != null) {
            String text = item.getListText();
            holder.getTextView().setText(text);
        } else {
            String text = item.getBtnText();
            holder.getBtnView().setText(text);
        }
    }

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

    public void addItem(ItemList data) {
        itemList.add(data);
    }

}

 

매력적인수박 (670 포인트) 님이 2021년 7월 16일 질문

1개의 답변

0 추천

멑티 뷰타입을 적용하세요.

참고로 ItemList는  ListItem으로 이름을 주시는게 더 정확할 것 같습니다.

public absract ListItem {
    @LayoutRes int getViewType();
}

public class ItemList  extends ListItem {
    @Override
    public int getViewType() {
        return R.layout.item_list, parent;
    }
}

public class ButtonItem  extends ListItem {
    @Override
    public int getViewType() {
        return R.layout.item_button;    
    }
}

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder<ListItem>> {
    private final List<ListItem> itemList = new ArrayList<>();
 
    public ListItem getItem(int position) {
         return itemList.get(position);
    }

    @Overide
    public int getViewType(int position) {
        return getItem(position).getViewType();
   }
 
    @NonNull
    @Override
    public RecyclerViewAdapter.ViewHolder<ListItem> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        View v = LayoutInflater.from(parent.getContext()).inflate(viewType, false);

        switch (viewType) {
              case R.layout.item_list: 
                      retrun new ItemListViewHolder(v);
              case R.layout.item_button:
                      return ButtonViewHolder(v);
              default:
                     throw new IllegalArgumentException("Cannot create ViewHolder for viewType : " + viewType);    
        }
    }
 
    @Override
    public void onBindViewHolder(@NonNull RecyclerViewAdapter.ViewHolder<ListItem> holder, int position) {
        ItemList item = getItem(position);
        holder.bind(item); 
    }
 
    @Override
    public int getItemCount() {
        return itemList.size();
    }
 
    public void addItem(ItemList data) {
        itemList.add(data);
    }
 
}


public abstract class ListItemViewHolder<T extends ListItem> extends RecyclerView.ViewHolder {
  
     public abstract void bind(T item);
}
 
    public class ItremListViewHolder extends ListItemViewHolder<ItemList> {
        TextView textView;
        Button button;
 
        @Override
        public bind(ItemList item) {
           //.필요한 처리
        }
    }

    public class ButtonViewHolder extends ListItemViewHolder<ButtomItem> {
        @Override
        public bind(ButtomItem item) {
           //.필요한 처리
        }
    }

 

테스트를 안 한 코드라  Generic부분에서 에러가 날 수도 있습니다. 그 부분은 금방 고치실 수 있을 겁니다. Generic 를 안쓰셔도 되구요.

spark (227,470 포인트) 님이 2021년 7월 16일 답변
spark님이 2021년 7월 18일 수정
...