recyclerview Không có bộ chuyển đổi kèm theo; bỏ qua bố cục


241

Chỉ cần thực hiện RecyclerViewtrong mã của tôi, thay thế ListView.

Mọi thứ đều hoạt động tốt. Dữ liệu được hiển thị.

Nhưng thông báo lỗi đang được ghi lại:

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

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

cho mã sau:

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

Như bạn thấy tôi đã đính kèm một bộ chuyển đổi cho RecyclerView. Vậy tại sao tôi cứ bị lỗi này?

Tôi đã đọc các câu hỏi khác liên quan đến cùng một vấn đề nhưng không ai trong số họ giúp đỡ.


nghệ sĩ có trống không? Điều gì xảy ra khi bạn chuyển setAd CHƯƠNG và setLayoutManager?
Blackbelt

Bạn phải sử dụng RecyclerView.Ad
CHƯƠNG

12
Bạn có thể thấy nó nếu bạn không khởi tạo recyclerview ngay khi nó được gắn vào cửa sổ.
số

1
@yigit Tôi đang chờ trang bị thêm để tải xuống dữ liệu và sau khi hoàn thành mã đã cho!
Equitharn 20/03/2015

3
Lỗi này nghiêm trọng đến mức nào? Điều này có thể được bỏ qua? Dù sao, tôi sử dụng setAd CHƯƠNG (null) để tránh lỗi.
Priyankvex

Câu trả lời:


243

Bạn có thể chắc chắn rằng bạn đang gọi các câu lệnh này từ luồng "chính" (ví dụ bên trong onCreate()phương thức). Ngay khi tôi gọi các tuyên bố tương tự từ một phương pháp "trì hoãn". Trong trường hợp của tôi a ResultCallback, tôi nhận được thông điệp tương tự.

Theo tôi Fragment, việc gọi mã dưới đây từ bên trong một ResultCallbackphương thức tạo ra cùng một thông điệp. Sau khi chuyển mã sang onConnected()phương thức trong ứng dụng của tôi, tin nhắn đã biến mất ...

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

9
Nhưng tôi cần tải dữ liệu trước rồi mới hiển thị!
Equitharn

93
Chỉ cần đặt bộ điều hợp trống trước, cập nhật nó ngay khi bạn có dữ liệu (đây là những gì phù hợp với tôi).
Peter

3
Đó là những gì yigit đề xuất!
Equitharn

13
@equitharn Bạn nên đặt bộ điều hợp trống trước, sau đó dữ liệu được tải xuống, hãy gọi mAd CHƯƠNG.notifyDataSetChanged (), điều đó hiệu quả với tôi.
DomonLee

2
Giải pháp này không giúp tôi. Trong thực tế không có giải pháp trong chủ đề này là giúp tôi. Ai đó có thể vui lòng xem xét trường hợp của tôi ở đây không
Pulak

41

Tôi đã nhận được hai thông báo lỗi giống nhau cho đến khi tôi sửa hai điều trong mã của mình:

(1) Theo mặc định, khi bạn triển khai các phương thức trong RecyclerView.Adapternó sẽ tạo ra:

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

Hãy chắc chắn rằng bạn cập nhật mã của mình để thông báo:

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

Rõ ràng nếu bạn không có vật phẩm nào trong các vật phẩm của mình thì bạn sẽ nhận được không có vật phẩm nào được hiển thị trên màn hình.

(2) Tôi đã không làm điều này như được hiển thị trong câu trả lời hàng đầu: CardView layout_creen = "match_parent" không khớp với chiều rộng của RecyclerView gốc

//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) EDIT: THƯỞNG: Cũng đảm bảo rằng bạn thiết lập RecyclerViewnhư thế này:

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

KHÔNG như thế này:

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

Tôi đã thấy một số hướng dẫn sử dụng phương pháp sau. Trong khi nó hoạt động tôi nghĩ rằng nó cũng tạo ra lỗi này.


1
getItemCount () của tôi trông như thế này public int getItemCount() { return artists == null ? 0 : artists.size(); }và LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
Equitharn

cái này hoạt động với tôi: @Override public int getItemCount () {return artist.size (); }
AstonCheah

4
Ôi Chúa ơi. Khoảnh khắc đó khi bạn quay trở lại SO, và thấy một câu trả lời mà bạn đã nêu lên, và nhận ra rằng bạn đang làm điều tương tự ngu ngốc. Cảm ơn một lần nữa @Micro.
androidevil

20

Tôi có cùng một tình huống với bạn, hiển thị là ok, nhưng lỗi xuất hiện trong locat. Đó là giải pháp của tôi: (1) Khởi tạo RecyclerView & bind adapter ON CREATE ()

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

(2) gọi notifyDataStateChanged khi bạn nhận được dữ liệu

adapter.notifyDataStateChanged();

Trong mã nguồn của recyclerView, có một luồng khác để kiểm tra trạng thái của dữ liệu.

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

            }
        }
    };

Trong công vănLayout (), chúng ta có thể thấy có lỗi trong đó:

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

Tôi có vấn đề này, một vài vấn đề thời gian là recyclView đặt trong đối tượng ScrollView

Sau khi kiểm tra thực hiện, lý do có vẻ như sau. Nếu RecyclerView được đưa vào ScrollView, thì trong khi đo bước, chiều cao của nó không được chỉ định (vì ScrollView cho phép bất kỳ chiều cao nào) và kết quả là, có được chiều cao tối thiểu (theo thực hiện) dường như bằng không.

Bạn có một vài lựa chọn để sửa lỗi này:

  1. Đặt độ cao nhất định cho RecyclerView
  2. Đặt ScrollView.fillViewport thành true
  3. Hoặc giữ RecyclerView bên ngoài ScrollView. Theo tôi, đây là lựa chọn tốt nhất cho đến nay. Nếu chiều cao RecyclerView không bị giới hạn - đó là trường hợp khi nó được đưa vào ScrollView - thì tất cả các chế độ xem của Adaptor có đủ vị trí theo chiều dọc và được tạo cùng một lúc. Không có chế độ xem tái chế nữa mà loại này phá vỡ mục đích của RecyclerView.

(Có thể được theo dõi android.support.v4.widget.NestedScrollViewlà tốt)


đặt ScrollView.fillViewport thành đúng đã giải quyết vấn đề của tôi, cảm ơn rất nhiều
Eman

10

1) Tạo ViewHolder không có gì :)

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

2) Tạo lại RecyclerView mà không làm gì :)

// 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) Bây giờ khi trình tái chế thực sự của bạn chưa sẵn sàng, chỉ cần sử dụng mẫu như bên dưới.

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

Đây không phải là giải pháp tốt nhất mặc dù nó hoạt động! Hy vọng điều này là hữu ích.


Xin chào, xin vui lòng tôi có cùng một lỗi và tôi không biết nên kiểm tra xem bộ tái chế chưa sẵn sàng để chuyển một bộ chuyển đổi trống) và nơi tôi có thể kiểm tra xem bộ tái chế đã sẵn sàng chưa (để chuyển bộ chuyển đổi có dữ liệu)
James

Điều này thật tuyệt, đây là một ý chính của phong cách kéo thả gist.github.com/anonymous/bcf027945f08f40601090c55d6048e21
nmu

9

Nó xảy ra khi bạn không cài đặt bộ điều hợp trong giai đoạn tạo:

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

Chỉ cần di chuyển cài đặt bộ điều hợp vào onCreate với dữ liệu trống và khi bạn có cuộc gọi dữ liệu:

mAdapter.notifyDataSetChanged();

đảm bảo bạn đặt dữ liệu trong hàm tạo tùy chỉnh trong phương thức onCreate
Mohit Singh

4

Kiểm tra nếu bạn đã bỏ lỡ để gọi phương thức này trong bộ chuyển đổi của bạn

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

3

Đảm bảo bạn đặt trình quản lý bố cục cho RecyclerView của mình bằng cách:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

Thay vì LinearLayoutManager, bạn cũng có thể sử dụng các trình quản lý bố cục khác .


3

Tôi đã có cùng một lỗi Tôi đã sửa nó khi bạn đang chờ dữ liệu như tôi sử dụng trang bị thêm hoặc một cái gì đó tương tự

Đặt trước khi điều trị

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

Đặt chúng vào Oncreate của bạn

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

Khi bạn nhận được dữ liệu đặt

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

Bây giờ hãy vào lớp ArtistArrayAd CHƯƠNG của bạn và làm điều này những gì nó sẽ làm là nếu mảng của bạn trống hoặc rỗng, nó sẽ làm cho GetItemCount trả về 0 nếu không nó sẽ làm cho kích thước của mảng nghệ sĩ

@Override
public int getItemCount() {

    int a ;

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

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}

3

Các dòng này phải nằm trong OnCreate:

mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);

2

Điều này xảy ra bởi vì bố cục bị thổi phồng thực tế khác với bố cục đang được bạn giới thiệu trong khi tìm recyclerView. Theo mặc định khi bạn tạo đoạn, phương thức onCreateView xuất hiện như sau: return inflater.inflate(R.layout.<related layout>,container.false);

Thay vào đó, hãy tạo riêng biệt khung nhìn và sử dụng khung nhìn đó để tham khảo recyclerView View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;


2

Đầu tiên khởi tạo bộ chuyển đổi

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

Khi có sự thay đổi trong tập dữ liệu, chỉ cần gọi phương thức updateComments.


2

Đối với những người sử dụng RecyclerViewbên trong một đoạn và thổi phồng nó từ các chế độ xem khác: khi thổi phồng toàn bộ khung nhìn, hãy đảm bảo rằng bạn liên kếtRecyclerView khung nhìn gốc của nó.

Tôi đã kết nối và làm mọi thứ cho bộ chuyển đổi một cách chính xác, nhưng tôi không bao giờ thực hiện ràng buộc. Câu trả lời này của @Prateek Agarwal có tất cả cho tôi, nhưng ở đây có nhiều chi tiết hơn.

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
}

Java

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

Chỉ cần thay thế mã trên bằng cái này và nó sẽ hoạt động. Những gì bạn đã làm sai là bạn đã gọi setAd CHƯƠNG (bộ chuyển đổi) trước khi gọi trình quản lý bố cục.


1

Đây thực sự là một lỗi đơn giản mà bạn đang gặp phải, không cần thực hiện bất kỳ mã nào trong việc này. Lỗi này xảy ra do tệp bố cục sai được sử dụng bởi hoạt động. Bằng IDE, tôi tự động tạo bố cục v21 của bố cục trở thành bố cục mặc định của hoạt động. tất cả các mã tôi đã làm trong tệp bố cục cũ và mã mới chỉ có vài mã xml, dẫn đến lỗi đó.

Giải pháp: Sao chép tất cả các mã của bố cục cũ và dán vào bố cục v 21


1

Trong trường hợp của tôi, tôi đã thiết lập bộ chuyển đổi bên trong onLocationChanged()gọi lại VÀ gỡ lỗi trong trình giả lập. Vì nó không phát hiện ra sự thay đổi địa điểm nên nó không bao giờ bị bắn. Khi tôi đặt chúng theo cách thủ công trong các điều khiển mở rộng của trình giả lập, nó hoạt động như mong đợi.


1

Tôi đã giải quyết lỗi này. Bạn chỉ cần thêm trình quản lý bố cục và thêm bộ điều hợp trống.

Thích mã này:

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
tôi làm điều đó cho người dùng mới bắt đầu
mehdi janbarari

1

Chỉ cần thêm vào như sau RecyclerView

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

Thí dụ:

   <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

Tôi đã có lỗi này và tôi đã cố gắng khắc phục trong một thời gian cho đến khi tôi tìm thấy giải pháp.

Tôi đã tạo một phương thức riêng buildRecyclerView và tôi đã gọi nó hai lần, lần đầu tiên trên onCreateView và sau đó là cuộc gọi lại của tôi (trong đó tôi lấy dữ liệu từ API). Đây là phương thức buildRecyclerView trong Fragment của tôi:

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

Ngoài ra, tôi phải sửa đổi phương thức get-Item-Count trong bộ điều hợp của mình, bởi vì On-Creat-View danh sách là null và nó thông qua một lỗi. Vì vậy, get-Item-Count của tôi là như sau:

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

    }

0

Trong tình huống của tôi, nó là một thành phần bị lãng quên nằm trong lớp ViewHolder nhưng nó không nằm trong tệp bố cục


0

Tôi đã có cùng một vấn đề và nhận ra rằng tôi đã thiết lập cả LayoutManage r và adaptor sau khi lấy dữ liệu từ nguồn của mình thay vì đặt hai trong phương thức onCreate .

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

Sau đó thông báo bộ chuyển đổi về thay đổi dữ liệu

               //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

Vấn đề này là do bạn không thêm bất kỳ LayoutManagercho bạn RecyclerView.

Một lý do khác là vì bạn đang gọi mã này trong NonUIThread. Đảm bảo gọi cuộc gọi này trong UIThread.

Giải pháp là chỉ bạn phải thêm một LayoutManagercho RecyclerViewtrước khi bạn setAdaptertrong UI Thread.

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

Nếu bạn cần trì hoãn cài đặt LayoutManager, bạn nên thực hiện việc này từ phương thức gọi lại của mình: recyclerView.post (() -> {recyclerView.setLayoutManager (mGridLayoutManager); recyclerView.addItemDecor (Item Itemsetset mới)
ievgen

0

Vấn đề của tôi là quan điểm tái chế của tôi trông như thế này

        <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>

Khi nó nên trông như thế này

       <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

Trong bạn RecyclerView lớp bộ điều hợp , ví dụ MyRecyclerViewAdapter, tạo một hàm tạo với các tham số sau.

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

mDatalà dữ liệu bạn sẽ chuyển đến bộ điều hợp. Nó là tùy chọn nếu bạn không có dữ liệu để được thông qua. mInflaterLayoutInflaterđối tượng mà bạn đã tạo và bạn sử dụng trongOnCreateViewHolder chức năng của bộ chuyển đổi.

Sau này, bạn đính kèm bộ điều hợp trong MainActivity hoặc bất cứ nơi nào bạn muốn trên luồng chính / UI như thế nào

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

Giải quyết bằng cách đặt danh sách trống và bộ điều hợp trống được khởi tạo ở phía dưới và gọi notifyDataSetChanged khi kết quả được tìm nạp.

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

0

Tôi đã mất 16 phút cuộc đời với vấn đề này, vì vậy tôi sẽ thừa nhận sai lầm cực kỳ xấu hổ này mà tôi đang mắc phải - Tôi đang sử dụng Butterknife và tôi ràng buộc quan điểm trong onCreateView trong đoạn này.

Phải mất một thời gian dài để tìm ra lý do tại sao tôi không có bố cục - nhưng rõ ràng các khung nhìn được chèn để chúng thực sự không có giá trị, vì vậy trình tái chế sẽ không bao giờ là null .. rất tiếc!

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

Nếu bạn gặp vấn đề như thế này, hãy theo dõi quan điểm của bạn và sử dụng một cái gì đó như uiautomatorviewer


0

Không có nhiều câu trả lời nhưng tôi cũng gặp vấn đề tương tự ngay cả với mã là chính xác. Đôi khi, nó chỉ đơn giản nhất làm cho. Trong trường hợp này, lỗi của OP cũng có thể bị thiếu <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />trong Bản kê khai, lỗi này tái tạo cùng một lỗi.


0

Trong trường hợp của tôi, điều đó đã xảy ra vì tôi đã nhúng RecyclerView trong linearLayout.

Trước đây tôi có một tệp bố cục chỉ chứa một RecyclerView gốc như sau

<?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"/>

Tôi tin rằng vấn đề là trong 3 dòng tách biệt. Dù sao, tôi nghĩ rằng đó là một vấn đề đơn giản, tôi sẽ làm việc với nó vào ngày mai; nghĩ rằng tôi nên viết những gì tôi tìm thấy trước khi quên chủ đề này.


0

Thêm một câu trả lời nữa kể từ khi tôi bắt gặp chủ đề này để tìm ra lỗi. Tôi đã cố gắng khởi tạo một PreferenceFragmentCompatnhưng tôi đã quên thổi phồng XML ưu tiên onCreatePreferencesnhư thế này:

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

Lỗi là một bí ẩn cho đến khi tôi nhận ra rằng PreferenceFragmentCompatphải sử dụng RecyclerViewnội bộ.


0

// Nó xảy ra khi bạn không thiết lập bộ điều hợp trong giai đoạn tạo: gọi notifyDataInChanged () khi phản hồi api đang hoạt động

@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();
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.