recyclerview ไม่มีอะแดปเตอร์ต่อพ่วง ข้ามเค้าโครง


241

เพียงแค่นำมาใช้ในรหัสของฉันเปลี่ยนRecyclerViewListView

ทุกอย่างทำงานได้ดี ข้อมูลจะปรากฏขึ้น

แต่ข้อความข้อผิดพลาดกำลังถูกบันทึก:

15:25:53.476 E/RecyclerView: No adapter attached; skipping layout

15:25:53.655 E/RecyclerView: No adapter attached; skipping layout

สำหรับรหัสต่อไปนี้:

ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

RecyclerViewที่คุณสามารถดูผมได้แนบอะแดปเตอร์สำหรับ เหตุใดฉันจึงได้รับข้อผิดพลาดนี้อยู่เรื่อย ๆ

ฉันได้อ่านคำถามอื่น ๆ ที่เกี่ยวข้องกับปัญหาเดียวกัน แต่ไม่มีใครช่วย


ศิลปินว่างเปล่า เกิดอะไรขึ้นคุณสลับ setAdapter และ setLayoutManager
Blackbelt

คุณต้องใช้ RecyclerView.Adapter
Octopus38

12
คุณอาจเห็นมันหากคุณไม่ได้กำหนดค่าเริ่มต้น recyclerview ทันทีที่แนบมากับหน้าต่าง
yigit

1
@yigit ฉันกำลังรอการติดตั้งเพิ่มเติมเพื่อดาวน์โหลดข้อมูลและหลังจากเสร็จสิ้นการรันโค้ดที่กำหนด!
equitharn

3
ข้อผิดพลาดนี้ร้ายแรงเพียงใด สิ่งนี้สามารถถูกละเว้นได้หรือไม่? อย่างไรก็ตามฉันใช้ setAdapter (null) เพื่อหลีกเลี่ยงข้อผิดพลาด
priyankvex

คำตอบ:


243

คุณแน่ใจได้หรือไม่ว่าคุณกำลังเรียกคำสั่งเหล่านี้จากเธรด "main" (ตัวอย่างเช่นภายในonCreate()เมธอด) ทันทีที่ฉันเรียกคำสั่งเดียวกันจากวิธี "ล่าช้า" ในกรณีของฉันกResultCallbackฉันได้รับข้อความเดียวกัน

ในของฉันFragmentเรียกรหัสด้านล่างจากภายในResultCallbackวิธีการผลิตข้อความเดียวกัน หลังจากย้ายรหัสไปยังonConnected()วิธีการภายในแอพของฉันข้อความหายไป ...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );

9
แต่ฉันต้องดาวน์โหลดข้อมูลก่อนแล้วจึงแสดง!
equitharn

93
เพียงตั้งอะแดปเตอร์เปล่าก่อนอัปเดตทันทีที่คุณมีข้อมูล (นี่คือสิ่งที่ใช้ได้กับฉัน)
ปีเตอร์

3
นั่นคือสิ่งที่ yigit แนะนำ!
equitharn

13
@equitharn คุณควรตั้งค่าอะแดปเตอร์เปล่าก่อนแล้วจึงดาวน์โหลดข้อมูลโทร mAdapter.notifyDataSetChanged () ที่ใช้งานได้สำหรับฉัน
DomonLee

2
วิธีนี้ไม่ช่วยฉัน อันที่จริงไม่มีวิธีแก้ปัญหาในหัวข้อนี้ที่ช่วยฉัน ใครช่วยกรุณาดูกรณีของฉันที่นี่
Pulak

41

ฉันได้รับข้อความแสดงข้อผิดพลาดสองข้อความเดียวกันจนกระทั่งฉันแก้ไขสองสิ่งในรหัสของฉัน:

(1) โดยค่าเริ่มต้นเมื่อคุณใช้วิธีการในการRecyclerView.Adapterสร้าง:

@Override
public int getItemCount() {
    return 0;
}

ตรวจสอบให้แน่ใจว่าคุณอัปเดตรหัสของคุณแล้วจึงแจ้งว่า:

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

เห็นได้ชัดว่าถ้าคุณมีรายการศูนย์ในรายการของคุณแล้วคุณจะได้รับสิ่งที่ปรากฏบนหน้าจอ

(2) ฉันไม่ได้ทำเช่นนี้ตามที่แสดงในคำตอบด้านบน: CardView layout_width = "match_parent" ไม่ตรงกับความกว้างของ RecyclerView หลัก

//correct
LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);

//incorrect (what I had)
LayoutInflater.from(parent.getContext())
        .inflate(R.layout.card_listitem,null);

(3) แก้ไข: โบนัส: ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าRecyclerViewสิ่งนี้:

<android.support.v7.widget.RecyclerView
    android:id="@+id/RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

ไม่เหมือน:

<view
    android:id="@+id/RecyclerView"
    class="android.support.v7.widget.RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

ฉันได้เห็นบทเรียนบางอย่างโดยใช้วิธีการหลัง ในขณะที่ใช้งานได้ฉันคิดว่ามันสร้างข้อผิดพลาดนี้เช่นกัน


1
getItemCount ของฉัน () มีลักษณะเช่นนี้public int getItemCount() { return artists == null ? 0 : artists.size(); }และ LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
equitharn

สิ่งนี้ใช้ได้กับฉัน: @Override public int getItemCount () {return artist.size (); }
AstonCheah

4
โอ้พระเจ้า. ช่วงเวลานั้นเมื่อคุณกลับมาที่ SO และดูคำตอบที่คุณลุกขึ้นแล้วและตระหนักว่าคุณกำลังทำสิ่งที่โง่เหมือนเดิม ขอบคุณอีกครั้ง @Micro
androidevil

20

ฉันมีสถานการณ์เดียวกันกับคุณจอแสดงผลก็โอเค แต่มีข้อผิดพลาดปรากฏขึ้นใน locat นี่เป็นวิธีแก้ปัญหาของฉัน: (1) เริ่มต้นอะแดปเตอร์ RecyclerView & bind เมื่อสร้าง ()

RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid);
mRecycler.setAdapter(adapter);

(2) โทร informDataStateChanged เมื่อคุณได้รับข้อมูล

adapter.notifyDataStateChanged();

ในซอร์สโค้ดของ recyclerView มีเธรดอื่นเพื่อตรวจสอบสถานะของข้อมูล

public RecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.mObserver = new RecyclerView.RecyclerViewDataObserver(null);
    this.mRecycler = new RecyclerView.Recycler();
    this.mUpdateChildViewsRunnable = new Runnable() {
        public void run() {
            if(RecyclerView.this.mFirstLayoutComplete) {
                if(RecyclerView.this.mDataSetHasChangedAfterLayout) {
                    TraceCompat.beginSection("RV FullInvalidate");
                    RecyclerView.this.dispatchLayout();
                    TraceCompat.endSection();
                } else if(RecyclerView.this.mAdapterHelper.hasPendingUpdates()) {
                    TraceCompat.beginSection("RV PartialInvalidate");
                    RecyclerView.this.eatRequestLayout();
                    RecyclerView.this.mAdapterHelper.preProcess();
                    if(!RecyclerView.this.mLayoutRequestEaten) {
                        RecyclerView.this.rebindUpdatedViewHolders();
                    }

                    RecyclerView.this.resumeRequestLayout(true);
                    TraceCompat.endSection();
                }

            }
        }
    };

ใน dispatchLayout () เราสามารถหาข้อผิดพลาดได้:

void dispatchLayout() {
    if(this.mAdapter == null) {
        Log.e("RecyclerView", "No adapter attached; skipping layout");
    } else if(this.mLayout == null) {
        Log.e("RecyclerView", "No layout manager attached; skipping layout");
    } else {

11

ฉันมีปัญหานี้ปัญหาสองสามครั้งคือrecycleView ใส่ในวัตถุScrollView

หลังจากตรวจสอบการใช้งานแล้วมีเหตุผลดังต่อไปนี้ หาก RecyclerView ใส่ใน ScrollView ดังนั้นระหว่างขั้นตอนการวัดความสูงของมันจะไม่ได้ระบุ (เพราะ ScrollView อนุญาตให้มีความสูงใด ๆ ) และเป็นผลให้เท่ากับความสูงขั้นต่ำ (ตามการใช้งาน) ซึ่งเห็นได้ชัดว่าเป็นศูนย์

คุณมีสองทางเลือกในการแก้ไข:

  1. ตั้งค่าความสูงที่แน่นอนเป็น RecyclerView
  2. ตั้งค่า ScrollView.fillViewport เป็น true
  3. หรือเก็บ RecyclerView ไว้นอก ScrollView ในความคิดของฉันนี่เป็นตัวเลือกที่ดีที่สุด หากความสูงของ RecyclerView ไม่ จำกัด - ซึ่งเป็นกรณีเมื่อใส่ลงใน ScrollView - มุมมองทั้งหมดของอแด็ปเตอร์จะมีตำแหน่งเพียงพอในแนวตั้งและถูกสร้างขึ้นทั้งหมดในครั้งเดียว ไม่มีการรีไซเคิลมุมมองอีกต่อไปแล้วซึ่งแบ่งวัตถุประสงค์ของ RecyclerView

(สามารถติดตามได้android.support.v4.widget.NestedScrollViewเช่นกัน)


การตั้งค่า ScrollView.fillViewport ให้เป็นจริงในการแก้ไขปัญหาของฉันขอบคุณมัด
Eman

10

1) สร้างViewHolderที่ไม่ทำอะไรเลย :)

// SampleHolder.java
public class SampleHolder extends RecyclerView.ViewHolder {
    public SampleHolder(View itemView) {
        super(itemView);
    }
}

2) สร้างRecyclerViewอีกครั้งซึ่งไม่ทำอะไรเลย :)

// SampleRecycler.java
public class SampleRecycler extends RecyclerView.Adapter<SampleHolder> {
    @Override
    public SampleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(SampleHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }
}

3) ตอนนี้เมื่อผู้รีไซเคิลที่แท้จริงของคุณยังไม่พร้อมเพียงใช้ตัวอย่างหนึ่งที่ต้องการด้านล่าง

RecyclerView myRecycler = (RecyclerView) findViewById(R.id.recycler_id);
myRecycler.setLayoutManager(new LinearLayoutManager(this));
myRecycler.setAdapter(new SampleRecycler());

นี่ไม่ใช่ทางออกที่ดีที่สุด แต่ใช้งานได้! หวังว่านี่จะเป็นประโยชน์


สวัสดีโปรดฉันมีข้อผิดพลาดเดียวกันและฉันไม่ทราบว่าฉันควรตรวจสอบว่า recycler ไม่พร้อมที่จะผ่านอะแดปเตอร์เปล่า) และที่ฉันสามารถตรวจสอบว่า recycler พร้อม (ส่งข้อมูลด้วยอะแดปเตอร์)
เจมส์

นี่ยอดเยี่ยมนี่คือส่วนสำคัญของ drag'n drop style gist.github.com/anonymous/bcf027945f08f40601090c55d6048e21
nmu

9

มันเกิดขึ้นเมื่อคุณไม่ได้ตั้งค่าอะแดปเตอร์ในระหว่างขั้นตอนการสร้าง:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    ....
}

public void onResume() {
    super.onResume();
    mRecyclerView.setAdapter(mAdapter);
    ....
}

เพียงแค่ย้ายการตั้งค่าอะแดปเตอร์ไปที่ onCreate ด้วยข้อมูลว่างเปล่าและเมื่อคุณมีสายข้อมูล:

mAdapter.notifyDataSetChanged();

ให้แน่ใจว่าคุณตั้งค่าข้อมูลในตัวสร้าง customadapter ภายในวิธีการ onCreate
Mohit Singh

4

ตรวจสอบว่าคุณไม่ได้โทรวิธีนี้ในอะแดปเตอร์ของคุณหรือไม่

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

3

ตรวจสอบให้แน่ใจว่าคุณตั้งค่าตัวจัดการโครงร่างสำหรับ RecyclerView ของคุณโดย:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

แทนที่จะLinearLayoutManagerคุณสามารถใช้อื่น ๆผู้จัดการเค้าโครงเกินไป


3

ฉันมีข้อผิดพลาดเดียวกันฉันคงแก้ไขการทำเช่นนี้หากคุณกำลังรอข้อมูลอย่างฉันโดยใช้ชุดติดตั้งเพิ่มเติมหรืออะไรทำนองนั้น

ใส่ก่อนสร้าง

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

ใส่ไว้ใน Oncreate ของคุณ

 recyclerView = (RecyclerView) findViewById(R.id.cardList);
 recyclerView.setHasFixedSize(true);
 recyclerView.setLayoutManager(new LinearLayoutManager(this));
 adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
 recyclerView.setAdapter(adapter);

เมื่อคุณได้รับข้อมูลที่ใส่

adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);

ตอนนี้ไปในคลาส ArtistArrayAdapter ของคุณและทำสิ่งที่มันจะทำคือถ้าอาเรย์ของคุณว่างเปล่าหรือเป็นโมฆะมันจะทำให้ GetItemCount ส่งกลับค่า 0 ถ้าไม่มันจะทำให้ขนาดของอาเรย์ศิลปิน

@Override
public int getItemCount() {

    int a ;

    if(artists != null && !artists.isEmpty()) {

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}


2

สิ่งนี้เกิดขึ้นเนื่องจากเลย์เอาต์ที่เกิดขึ้นจริงนั้นแตกต่างจากที่คุณเรียกขณะที่ค้นหา recyclerView ตามค่าเริ่มต้นเมื่อคุณสร้างแฟรกเมนต์เมธอด onCreateView จะปรากฏดังนี้: return inflater.inflate(R.layout.<related layout>,container.false);

แทนที่จะเป็นเช่นนั้นให้สร้างมุมมองแยกต่างหากและใช้สิ่งนั้นเพื่ออ้างถึง recyclerView View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;


2

เริ่มต้นอะแดปเตอร์

public void initializeComments(){
    comments = new ArrayList<>();

    comments_myRecyclerView = (RecyclerView) findViewById(R.id.comments_recycler);
    comments_mLayoutManager = new LinearLayoutManager(myContext);
    comments_myRecyclerView.setLayoutManager(comments_mLayoutManager);

    updateComments();
    getCommentsData();

}

public void updateComments(){

    comments_mAdapter = new CommentsAdapter(comments, myContext);
    comments_myRecyclerView.setAdapter(comments_mAdapter);
}

เมื่อมีการเปลี่ยนแปลงในชุดชุดข้อมูลเพียงแค่เรียกเมธอด updateComments


2

สำหรับผู้ที่ใช้RecyclerViewภายในชิ้นส่วนและขยายตัวได้จากมุมมองอื่น ๆ : เมื่อพองมุมมองส่วนทั้งให้แน่ใจว่าคุณผูกRecyclerViewไปที่มุมมองของราก

ฉันกำลังเชื่อมต่อและทำทุกอย่างเพื่อให้อะแดปเตอร์ถูกต้อง แต่ฉันไม่เคยผูกพัน นี้คำตอบโดย@Prateek Agarwalมีทุกอย่างสำหรับฉัน แต่นี่คือรายละเอียดเพิ่มเติม

Kotlin

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    val rootView =  inflater?.inflate(R.layout.fragment_layout, container, false)
    recyclerView = rootView?.findViewById(R.id.recycler_view_id)
    // rest of my stuff
    recyclerView?.setHasFixedSize(true)
    recyclerView?.layoutManager = viewManager
    recyclerView?.adapter = viewAdapter
    // return the root view
    return rootView
}

ชวา

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView= inflater.inflate(R.layout.fragment_layout,container,false);
    recyclerview= rootView.findViewById(R.id.recycler_view_id);
    return rootView;
}

1
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);

เพียงแค่แทนที่รหัสข้างต้นด้วยสิ่งนี้และมันควรจะทำงาน สิ่งที่คุณทำผิดคือคุณเรียกว่า setAdapter (อะแดปเตอร์) ก่อนเรียกตัวจัดการเลย์เอาต์


1

นี่เป็นข้อผิดพลาดง่ายๆที่คุณได้รับโดยไม่จำเป็นต้องทำโค้ดใด ๆ ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากไฟล์เลย์เอาต์ผิดที่ใช้โดยกิจกรรม โดย IDE i สร้างเลย์เอาต์ v21 ของเลย์เอาต์โดยอัตโนมัติซึ่งกลายเป็นเลย์เอาต์เริ่มต้นของกิจกรรม รหัสทั้งหมดที่ฉันทำในไฟล์เลย์เอาต์เก่าและอันใหม่นั้นมีรหัส xml เพียงไม่กี่ตัวเท่านั้นซึ่งทำให้เกิดข้อผิดพลาดนั้น

วิธีแก้ไข: คัดลอกรหัสทั้งหมดของเค้าโครงเก่าและวางในเค้าโครง v 21


1

ในกรณีของฉันฉันกำลังตั้งค่าการ์ดเชื่อมต่อภายในการonLocationChanged()เรียกกลับและการดีบักในโปรแกรมจำลอง เนื่องจากมันไม่ได้ตรวจพบการเปลี่ยนแปลงสถานที่ เมื่อฉันตั้งค่าด้วยตนเองในส่วนขยายของตัวจำลองจะทำงานตามที่คาดไว้


1

ฉันได้แก้ไขข้อผิดพลาดนี้แล้ว คุณเพียงแค่เพิ่มตัวจัดการโครงร่างและเพิ่มอะแดปเตอร์เปล่า

ชอบรหัสนี้:

myRecyclerView.setLayoutManager(...//your layout manager);
        myRecyclerView.setAdapter(new RecyclerView.Adapter() {
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                return null;
            }

            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

            }

            @Override
            public int getItemCount() {
                return 0;
            }
        });
//other code's 
// and for change you can use if(mrecyclerview.getadapter != speacialadapter){
//replice your adapter
//}

1
ฉันทำเพื่อผู้ใช้ระดับเริ่มต้น
mehdi janbarari

1

เพียงเพิ่มรายการต่อไปนี้ RecyclerView

app:layoutManager="android.support.v7.widget.LinearLayoutManager"

ตัวอย่าง:

   <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
        app:layout_constraintBottom_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </android.support.v7.widget.RecyclerView>

1

ฉันมีข้อผิดพลาดนี้และฉันพยายามแก้ไขเป็นระยะเวลาหนึ่งจนกระทั่งพบวิธีแก้ปัญหา

ฉันสร้างเมธอดส่วนตัว buildRecyclerView และฉันเรียกมันสองครั้งครั้งแรกที่ onCreateView และหลังจากโทรกลับของฉัน (ซึ่งฉันดึงข้อมูลจาก API) นี่คือวิธีการของฉัน buildRecyclerView ในส่วนของฉัน:

private void buildRecyclerView(View v) {
        mRecyclerView = v.findViewById(R.id.recycler_view_loan);
        mLayoutManager = new LinearLayoutManager(getActivity());
        ((LinearLayoutManager) mLayoutManager).setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new LoanAdapter(mExampleList);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
}

นอกจากนี้ฉันต้องแก้ไขวิธีรับ-Item-Count ในอะแดปเตอร์ของฉันเพราะเมื่อ On-Create-View รายการนั้นเป็นโมฆะและเกิดข้อผิดพลาด ดังนั้น get-Item-Count ของฉันคือ:

@Override
    public int getItemCount() {
        try {
            return mLoanList.size();
        } catch (Exception ex){return 0;}

    }

0

ในสถานการณ์ของฉันมันเป็นองค์ประกอบที่ถูกลืมซึ่งตั้งอยู่ในชั้นเรียน ViewHolder แต่มันไม่ได้อยู่ในรูปแบบไฟล์


0

ฉันมีปัญหาเดียวกันและรู้ว่าผมได้รับการตั้งค่าทั้งLayoutManage R และอะแดปเตอร์หลังจากการดึงข้อมูลจากแหล่งที่มาของฉันแทนการตั้งค่าทั้งสองในonCreateวิธี

salesAdapter = new SalesAdapter(this,ordersList);
        salesView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        salesView.setAdapter(salesAdapter);

จากนั้นแจ้งอะแดปเตอร์เมื่อมีการเปลี่ยนแปลงข้อมูล

               //get the Orders
                Orders orders;
                JSONArray ordersArray = jObj.getJSONArray("orders");
                    for (int i = 0; i < ordersArray.length() ; i++) {
                        JSONObject orderItem = ordersArray.getJSONObject(i);
                        //populate the Order model

                        orders = new Orders(
                                orderItem.getString("order_id"),
                                orderItem.getString("customer"),
                                orderItem.getString("date_added"),
                                orderItem.getString("total"));
                        ordersList.add(i,orders);
                        salesAdapter.notifyDataSetChanged();
                    }

0

ปัญหานี้เกิดขึ้นเนื่องจากคุณไม่ได้เพิ่มสิ่งใดLayoutManagerไว้สำหรับคุณRecyclerViewของคุณ

สาเหตุอีกประการหนึ่งคือคุณโทรหารหัสนี้ใน NonUIThread ตรวจสอบให้แน่ใจว่าได้โทรสายนี้ใน UIThread

การแก้ปัญหาคือเดียวที่คุณต้องเพิ่มLayoutManagerสำหรับRecyclerViewก่อนที่คุณsetAdapterในหัวข้อ UI

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

หากคุณต้องการชะลอการตั้งค่า LayoutManager คุณควรทำสิ่งนี้จากวิธีการโทรกลับของคุณ: recyclerView.post (() -> {recyclerView.setLayoutManager (mGridLayoutManager); recyclerView.addItemDecoration (itemGff) ใหม่)
ievgen

0

ปัญหาของฉันคือมุมมองผู้รีไซเคิลของฉันเป็นแบบนี้

        <android.support.v7.widget.RecyclerView
        android:id="@+id/chatview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">
    </android.support.v7.widget.RecyclerView>

เมื่อมันควรจะมีหน้าตาแบบนี้

       <android.support.v7.widget.RecyclerView
        android:id="@+id/chatview"
        android:layout_width="395dp"
        android:layout_height="525dp"
        android:layout_marginTop="52dp"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="8dp"></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>

0

ในRecyclerViewคลาสอะแด็ปเตอร์ของคุณMyRecyclerViewAdapterให้สร้าง constructor ด้วย params ต่อไปนี้

MyRecyclerViewAdapter(Context context, List<String> data) {
    this.mInflater = LayoutInflater.from(context); // <-- This is the line most people include me miss
    this.mData = data;
}

mDataคือข้อมูลที่คุณจะส่งผ่านไปยังอะแดปเตอร์ มันเป็นทางเลือกถ้าคุณไม่มีข้อมูลที่จะส่งผ่าน mInflaterเป็นLayoutInflaterวัตถุที่คุณสร้างขึ้นและคุณใช้ในOnCreateViewHolderทำงานของอะแดปเตอร์

หลังจากนี้คุณแนบอะแดปเตอร์ใน MainActivity หรือทุกที่ที่คุณต้องการบนเธรดหลัก / UI อย่างถูกต้องเช่น

MyRecyclerViewAdapter recyclerAdapter;
OurDataStuff mData;

    ....
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Like this:

        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerAdapter = new RecyclerAdapter(this, mData); //this, is the context. mData is the data you want to pass if you have any
        recyclerView.setAdapter(recyclerAdapter);
    }
   ....

0

แก้ไขได้โดยการตั้งค่ารายการว่างและอะแดปเตอร์เริ่มต้นที่ด้านล่างและเรียกการแจ้งเตือน DataSetChanged เมื่อผลลัพธ์ถูกดึงออกมา

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerviewItems.setLayoutManager(linearLayoutManager);
    someAdapter = new SomeAdapter(getContext(),feedList);
    recyclerviewItems.setAdapter(someAdapter);

0

ฉันเสียชีวิตไป 16 นาทีจากปัญหานี้ดังนั้นฉันจะยอมรับความผิดพลาดที่น่าอับอายอย่างไม่น่าเชื่อที่ฉันกำลังทำอยู่ - ฉันใช้ Butterknife และผูกมัดมุมมองใน CreateView ในส่วนนี้

ใช้เวลานานในการหาสาเหตุที่ฉันไม่มีเลย์เอาต์ผู้จัดการ - แต่เห็นได้ชัดว่ามุมมองถูกฉีดดังนั้นพวกเขาจะไม่เป็นโมฆะจริงดังนั้นผู้รีไซเคิลจะไม่เป็นโมฆะ .. อ๊ะ!

@BindView(R.id.recycler_view)
RecyclerView recyclerView;

    @Override
public View onCreateView(......) {
    View v = ...;
    ButterKnife.bind(this, v);
    setUpRecycler()
 }

public void setUpRecycler(Data data)
   if (recyclerView == null) {
 /*very silly because this will never happen*/
       LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
       //more setup
       //...
    }
    recyclerView.setAdapter(new XAdapter(data));
}

หากคุณได้รับปัญหาเช่นนี้ติดตามมุมมองของคุณและใช้สิ่งที่ชอบ uiautomatorviewer


0

คำตอบไม่ค่อยมาก แต่ฉันก็มีปัญหาเดียวกันเช่นกันแม้กระทั่งรหัสที่ถูกต้อง บางครั้งมันเป็นเพียงวิธีที่ง่ายที่สุดในการทำ ในกรณีนี้ข้อผิดพลาดของ OP อาจหายไป<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />จาก Manifest ซึ่งทำซ้ำข้อผิดพลาดเดียวกัน


0

ในกรณีของฉันมันเกิดขึ้นเพราะฉันฝัง RecyclerView ใน LinearLayout

ก่อนหน้านี้ฉันมีไฟล์เลย์เอาต์ที่มีหนึ่งราก RecyclerView ดังนี้

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:listitem="@layout/fragment_products"

    android:name="Products.ProductsFragment"
    app:layoutManager="LinearLayoutManager"
    tools:context=".Products.ProductsFragment"

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"/>

ฉันเชื่อว่าปัญหาอยู่ภายใน 3 บรรทัดแยกกัน อย่างไรก็ตามฉันคิดว่ามันเป็นปัญหาง่ายไม่ดีจะทำงานกับมันในวันพรุ่งนี้ คิดว่าฉันควรจะเขียนสิ่งที่ฉันพบก่อนลืมหัวข้อนี้


0

การเพิ่มอีกคำตอบหนึ่งนับตั้งแต่ฉันได้พบกับเธรดนี้ทำให้เกิดข้อผิดพลาด ฉันพยายามเริ่มต้นPreferenceFragmentCompatแต่ฉันลืมขยาย XML การกำหนดค่าตามความชอบในonCreatePreferencesลักษณะนี้:

class SettingsFragment : PreferenceFragmentCompat() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val inflater = LayoutInflater.from(context)
        inflater.inflate(R.layout.fragment_settings, null)
    }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        // Missing this line here:
        //   setPreferencesFromResource(R.xml.settings, rootKey)
    }
}

ข้อผิดพลาดเป็นปริศนาจนกระทั่งฉันรู้ว่าPreferenceFragmentCompatต้องใช้RecyclerViewภายใน


0

// มันเกิดขึ้นเมื่อคุณไม่ได้ตั้งค่าอะแดปเตอร์ในระหว่างขั้นตอนการสร้าง: โทร informDataSetChanged () เมื่อการตอบสนองของ api เริ่มทำงาน

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);


        magazineAdapter = new MagazineAdapter(getContext(), null, this );
        newClipRecyclerView.setAdapter(magazineAdapter);
        magazineAdapter.notifyDataSetChanged();

       APICall();
}

public void APICall() {
    if(Response.isSuccessfull()){
    mRecyclerView.setAdapter(mAdapter);
   }
}
Just move setting the adapter into onCreate with an empty data and when you have the data call:

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