เพิ่มรายการใหม่ในการรีไซเคิลดูแบบเป็นโปรแกรมหรือไม่


115

ฉันยังคงพยายามมองไปที่มุมมองรีไซเคิล ฉันมีรายการอาร์เรย์ที่ฉันใช้เพื่อเริ่มต้นมุมมองรีไซเคิลด้วย

ฉันจะเพิ่มรายการใหม่ไปยังโพสต์มุมมองรีไซเคิลที่ตั้งค่าอะแดปเตอร์และเค้าโครงได้อย่างไร

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

โดยพื้นฐานแล้วหลังจากที่ฉันinitdata()และฉัน initRecyclerView()จะเพิ่มรายการใหม่ใน RecyclerView ได้อย่างไร?


สามารถดูตัวอย่างนี้ได้ใน Github Happy code !!!
Cabezas

คำตอบ:


272

ก่อนอื่นให้เพิ่มรายการของคุณmItemsแล้วใช้:

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

วิธีนี้ดีกว่าการใช้:

mAdapter.notifyDataSetChanged();

ในประสิทธิภาพ


11
คำตอบที่ดี. นอกจากนี้ยังหมายความว่ามันจะไม่ทำลายภาพเคลื่อนไหวด้วย
Ben Pearson

7
สิ่งนี้ควรได้รับการยอมรับว่าเป็นคำตอบที่ถูกต้องอีกอันแบ่งภาพเคลื่อนไหวและมีประสิทธิภาพน้อยกว่าอันนี้
Massimo

27
ฉันเป็นคนหนึ่งที่ตอบคำตอบที่ได้รับการยอมรับและฉันคิดว่านี่น่าจะเป็นคำตอบที่ยอมรับ: D
Abdelrahman Elkady

2
@AJW ใช่ ดัชนีขององค์ประกอบสุดท้ายของ mItems คือ mItems.size () - 1
Mostafa

2
ขอบคุณ! ฉันมีภาพที่ควรโหลดจากอินเทอร์เน็ตใน onBindViewHolder ทุกครั้งที่ได้รับข้อมูลฉันต้องต่อท้ายรายการและเรียกว่า alertDataSetChanged () แต่สิ่งนี้ทำให้ภาพสั่นไหว ด้านบนคือทางออกที่เหมาะสมที่ฉันกำลังค้นหา คุณยังสามารถใช้ 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 ประเภทรายการจะถูกระบุโดย Adapter ของคุณดังนั้นจึงอาจเป็นวัตถุใด ๆ ก็ได้ แต่จำไว้ว่ารายการที่คุณเพิ่มควรจะเป็นข้อมูลเท่านั้น RecyclerView มีฟังก์ชันในตัวสำหรับการขยายและผูกมุมมองซึ่งเป็นสิ่งที่จะเกิดขึ้นเมื่อคุณแจ้ง DataSetChanged () คุณสามารถดีบัก onBindViewHolder เพื่อดูมุมมองที่กำลังแก้ไข
คริส

1
@IgorGanapolsky ของคุณArrayList<T>จะต้องใช้ชนิดของวัตถุที่คุณต้องการเพิ่มเช่นแทนArrayList<ViewGroup> ArrayList<String>แล้วคุณก็สามารถเปลี่ยนประเภทการโต้แย้งจากไปString ViewGroup(ขออภัยสำหรับ necro).
Eric Reed

14

หากคุณกำลังเพิ่มหลายรายการในรายการให้ใช้สิ่งนี้:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

สิ่งนี้จะแจ้งให้ผู้สังเกตการณ์ที่ลงทะเบียนทราบว่ารายการ itemCount ที่สะท้อนอยู่ในปัจจุบันเริ่มต้นที่ positionStart ถูกแทรกใหม่ รายการที่ก่อนหน้านี้อยู่ที่ positionStart และอื่น ๆ สามารถพบได้โดยเริ่มต้นที่ตำแหน่ง positinStart + itemCount

รายการที่มีอยู่ในชุดข้อมูลยังถือว่าเป็นข้อมูลล่าสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.