프로그래밍 방식으로 recyclerview에 새 항목을 추가 하시겠습니까?


115

나는 여전히 recyclerview에 대해 머리를 돌리려고 노력하고 있습니다. 리사이클 러 뷰를 초기화하는 데 사용하는 arraylist가 있습니다.

어댑터 및 레이아웃 관리자를 설정하는 리사이클 러 뷰 포스트에 새 항목을 추가하려면 어떻게해야합니까?

private void initData() {
        mItems = new ArrayList<String>();
        for (int i = 0; i < ITEMS_COUNT; i++) {
            mItems.add("Item " + (i + 1));
        }
    }

    private void initRecyclerView() {
        mRecentRecyclerView = (RecyclerView) findViewById(R.id.recentrecyclerView);
        mRecentRecyclerView.setHasFixedSize(true);
        mRecentLayoutManager = new LinearLayoutManager(this);
        mRecentRecyclerView.setLayoutManager(mRecentLayoutManager);



        mAdapter = new RecyclerView.Adapter<CustomViewHolder>() {
            @Override
            public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.notice_snippet
                        , viewGroup, false);
                return new CustomViewHolder(view);
            }

            @Override
            public void onBindViewHolder(CustomViewHolder viewHolder, int i) {
                viewHolder.noticeSubject.setText(mItems.get(i));
            }

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

        };
        mRecentRecyclerView.setAdapter(mAdapter);

    private class CustomViewHolder extends RecyclerView.ViewHolder {

        private TextView noticeSubject;

        public CustomViewHolder(View itemView) {
            super(itemView);

            noticeSubject = (TextView) itemView.findViewById(R.id.notice_subject);
        }
    }

그래서 기본적으로 I initdata()initRecyclerView(), RecyclerView에 새 항목을 어떻게 추가합니까 ??


이 예제는 Github Happy 코드 에서 볼 수 있습니다 !!!
Cabezas

답변:


272

먼저 항목을 추가 mItems한 다음 다음을 사용하십시오.

mAdapter.notifyItemInserted(mItems.size() - 1);

이 방법은 다음을 사용하는 것보다 낫습니다.

mAdapter.notifyDataSetChanged();

성능.


11
좋은 대답입니다. 그것은 또한 애니메이션을 중단하지 않음을 의미
벤 피어슨

7
이것은 정답으로 받아 들여 져야하고, 다른 하나는 애니메이션을 깨뜨리고 이것보다 덜 효율적입니다.
Massimo

27
내가 허용 대답을 응답 한 사람이고 나는 이것이 허용 하나 있어야한다고 생각합니다 : D
압델 라흐만 Elkady

2
@AJW 네. mItems의 마지막 요소 인덱스는 mItems.size ()-1입니다.
모스 타파

2
감사! onBindViewHolder의 인터넷에서로드해야하는 이미지가 있습니다. 데이터를받을 때마다 목록에 추가하고 notifyDataSetChanged ()를 호출해야합니다. 그러나 이것은 이미지 깜박임 효과를 만들었습니다. 위는 내가 찾고 있던 올바른 솔루션이었습니다. mAdapter.notifyItemRangeInserted (mItems.size ()-1, new_array_of_items_to_be_added.size ());를 사용할 수도 있습니다.
Vignesh Bala

38

데이터 구조 (mItems)에 추가 한 다음 어댑터에 데이터 세트 변경에 대해 알립니다.

private void addItem(String item) {
  mItems.add(item);
  mAdapter.notifyDataSetChanged();
}

addItem("New Item");

2
추가 할 문자열이 아니라 ViewGroup이면 어떻게됩니까?
IgorGanapolsky

1
@IgorGanapolsky 나도 같은 의심이 있습니다. 이에 대한 해결책을 찾았습니까?
Sash_KP

여기에서도 같은 의심! 어떤 도움?
Srujan Barai

5
@IgorGanapolsky 항목 유형은 어댑터에 의해 지정되므로 실제로 모든 개체가 될 수 있습니다. 그러나 추가하는 항목은 데이터 일 뿐이라는 점을 명심하십시오. RecyclerView에는 뷰를 확장하고 바인딩하는 함수가 내장되어 있습니다. 이는 notifyDataSetChanged ()를 사용할 때 발생합니다. onBindViewHolder를 디버그하여 편집중인보기를 볼 수 있습니다.
크리스

1
@IgorGanapolsky 대신 ArrayList<T>추가하려는 객체 유형을 사용해야합니다 . 그런 다음 인수 유형을에서 로 변경할 수 있습니다 . (네크로 죄송합니다). ArrayList<ViewGroup>ArrayList<String>StringViewGroup
Eric Reed

14

목록에 여러 항목을 추가하는 경우 다음을 사용하십시오.

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

이것은 positionStart에서 시작하는 현재 반영된 itemCount 항목이 새로 삽입되었음을 등록 된 관찰자에게 알립니다. 이전에 positionStart 및 그 이후에 있던 항목은 이제 위치 positinStart + itemCount에서 시작하여 찾을 수 있습니다.

데이터 세트의 기존 항목은 여전히 ​​최신으로 간주됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.