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

recyclerview footer 문제입니다.

0 추천

현재 리사이클 item 갯수보다 1개 더 크게 만들어서, 

마지막 번호일때 기존 item뷰 말고, footer뷰로 주면 되는걸로 알고 있습니다.

그렇게 footer를 구현했는데 문제는 item을 하나더 추가 하면 footer 하나가 더 생겨 2개가 됩니다.

예를들어 현재 item 갯수가 4개라고 할때, item0, time1, item2, item3이 있고, 마지막에 footer를 추가한

상태에서 item4를 추가하고 리사이클 refresh하면 

item0, time1, item2, item3, item4, footer이 돼야 하는데, item0, time1, item2, item3, footer, footer이

됩니다. 제 생각에는 refresh쪽 문제인 것 같은데, 이문제 때문에 하루종일 애먹네요.

public static void refresh(){               
    try {
        mInfoArr.clear();
        doWhileCursorToArray();
        recyclerAdapter_alarm.setArrayList(schedule_Main.mInfoArr);
        recyclerAdapter_alarm.notifyDataSetChanged();
        Log.i("refresh","했다");
    }catch (Exception e){
        Log.i("refresh","못했다");
    }
}
public void setArrayList(ArrayList<schedule_Class> itemList) {
        this.mItemList = itemList;
        footer = itemList.size();
    }
public class schedule_RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    static int footer;
    private ArrayList<schedule_Class> mItemList;

    public schedule_RecyclerAdapter(ArrayList<schedule_Class> itemList) {
        mItemList = itemList;
        footer = mItemList.size();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if(viewType==footer){   //footer일 경우 다른 view 세팅 
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.footer, parent, false);
            return new schedule_RecyclerItemViewHolder(view, viewType);
        }

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.schedule_item, parent, false);
        return new schedule_RecyclerItemViewHolder(view, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        if (position == footer){ //footer일때 pass

        }else{
            schedule_RecyclerItemViewHolder holder = (schedule_RecyclerItemViewHolder) viewHolder;
            schedule_Class info = mItemList.get(position);

        }
    }

    public void setArrayList(ArrayList<schedule_Class> itemList) {
        this.mItemList = itemList;
        footer = itemList.size();
    }

    public ArrayList<schedule_Class> getArrayList(){
        return mItemList;
    }

    @Override
    public int getItemCount() {
        footer = mItemList.size();
        return mItemList.size()+1;      //배열 길이 만큼 + footer
    }

    @Override
    public int getItemViewType (int position) {
        if(position == mItemList.size()+1){
            return footer;
        }else {
            return position;
        }
    }

 

혹시 싶어서 log를 찍어봤는데, catch로 가는 문제는 아니구요. 리프레쉬 해주면

item 리스트를 다시 불러와서, item0, time1, item2, item3, item4가 되고, 그 뒤에 footer을 붙여주는

생각인데, 생각대로 잘 안됩니다. 혹시 저같은 문제에서 해결하신 분이 계실까요?

구글링으로 나오는 소스와 제 소스가 별반 다를 것 없는데.. 

구글링 예제들은 리사이클 item을 추가하는 것이 아니더라구요. 정말 도와주세요! 감사합니다

패기백배개발자 (700 포인트) 님이 2016년 7월 18일 질문
패기백배개발자님이 2016년 7월 19일 수정
저도 추가 삭제할 때 footer 때문에 애먹고 있는데 아직 고치진 못했지만 제가 이해한 바로는 추가나 삭제할 때 int 값인 footer도 조절해주어야 하더라구요. 조절 안하니까 IndexoutofboundsException 나옵니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...