Thêm một mặt hàng mới vào chế độ xem lại có lập trình?


113

Tôi vẫn đang cố gắng xoay xở với công việc tái chế. Tôi có một danh sách mảng mà tôi sử dụng để khởi tạo chế độ xem trình tái chế.

Làm cách nào để thêm các mục mới vào bài đăng của chế độ xem người tái chế, thiết lập bộ điều hợp và trình quản lý bố cục?

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);
        }
    }

Vì vậy, về cơ bản sau khi tôi initdata()initRecyclerView(), làm cách nào để thêm một mục mới vào RecyclerView ??


Bạn có thể xem ví dụ này trong Github Happy code !!!
Cabezas

Câu trả lời:


270

Đầu tiên hãy thêm mục của bạn vào mItemsvà sau đó sử dụng:

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

phương pháp này tốt hơn là sử dụng:

mAdapter.notifyDataSetChanged();

trong hiệu suất.


10
Câu trả lời tốt. Nó cũng có nghĩa rằng nó sẽ không phá vỡ hình ảnh động
Ben Pearson

7
Câu trả lời này phải được chấp nhận là câu trả lời đúng, câu trả lời kia phá vỡ hoạt ảnh và kém hiệu quả hơn câu này.
Massimo

26
Tôi là một trong những người đã trả lời câu trả lời được chấp nhận và tôi nghĩ rằng đây sẽ là một chấp nhận: D
Abdelrahman Elkady

2
@AJW vâng. chỉ mục của phần tử cuối cùng của mItems là mItems.size () - 1.
Mostafa

2
Cảm ơn! Tôi có hình ảnh cần được tải từ internet trong onBindViewHolder. Mỗi khi nhận được dữ liệu, tôi cần thêm vào danh sách và được gọi là InformDataSetChanged (). Nhưng điều này tạo ra hiệu ứng nhấp nháy hình ảnh. Trên đây là giải pháp phù hợp mà tôi đang tìm kiếm. Bạn cũng có thể sử dụng mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ());
Vignesh Bala

37

chỉ cần thêm vào cấu trúc dữ liệu của bạn (mItems), sau đó thông báo cho bộ điều hợp của bạn về sự thay đổi tập dữ liệu

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

addItem("New Item");

2
Điều gì sẽ xảy ra nếu đó không phải là một chuỗi tôi muốn thêm mà là một ViewGroup?
IgorGanapolsky

1
@IgorGanapolsky Tôi cũng có cùng một nghi ngờ. Bạn đã tìm thấy giải pháp nào cho điều đó chưa?
Sash_KP

cùng nghi ngờ ở đây quá! bất kỳ giúp đỡ?
Srujan Barai,

5
@IgorGanapolsky Loại mục sẽ do Bộ điều hợp của bạn chỉ định, vì vậy nó có thể thực sự là bất kỳ đối tượng nào. Nhưng hãy nhớ rằng mục bạn thêm chỉ được coi là dữ liệu. RecyclerView đã tích hợp sẵn các hàm để thổi phồng và ràng buộc một chế độ xem, đó là điều sẽ xảy ra khi bạn thông báoDataSetChanged (). Bạn có thể gỡ lỗi onBindViewHolder để xem chế độ xem đang được chỉnh sửa.
Chris

1
@IgorGanapolsky Bạn ArrayList<T>sẽ phải sử dụng loại đối tượng bạn muốn thêm, ví dụ: ArrayList<ViewGroup>thay vì ArrayList<String>. Sau đó, bạn chỉ có thể thay đổi loại đối số từ Stringthành ViewGroup. (Xin lỗi vì đã bị hoại tử).
Eric Reed

14

nếu bạn đang thêm nhiều mục vào danh sách, hãy sử dụng cái này:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Điều này thông báo cho bất kỳ người quan sát đã đăng ký nào rằng các mục itemCount hiện đang được phản ánh bắt đầu từ positionStart đã được chèn mới. Mục trước đây được đặt tại vị trí Bắt đầu và hơn thế nữa, bây giờ có thể được tìm thấy bắt đầu từ vị trí Vị trí Bắt đầu + itemCount

mục hiện có trong tập dữ liệu vẫn được coi là cập nhật.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.