簡體   English   中英

RecyclerView沒有布局管理器

[英]RecyclerView has no layout manager

我已經看過很多這樣的問題,但是我沒有任何子元素,所以我不知道為什么它不能正常工作。 我將其移至某個活動的片段中,該片段不再起作用。 我看到以前的問題在使用recyclerview中存在子元素方面存在問題,但事實並非如此。 這是我的代碼:

public class TodoListFragment extends Fragment {

    @BindView(R.id.todo_recycler_view)
    protected RecyclerView mRecyclerView;

    @BindView(R.id.fab)
    protected FloatingActionButton mFab;

    private TodoListAdapter mTodoListAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    public static TodoListFragment newInstance() {
        return new TodoListFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.todo_list_recycler_view, container, false);

        ButterKnife.bind(this, view);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);

        mTodoListAdapter = new TodoListAdapter();
        mRecyclerView.setAdapter(mTodoListAdapter);


        return view;
    }

    @OnClick(R.id.fab)
    public void onAdd() {
        TodoItemView todoItemView = new TodoItemView(getContext());
        todoItemView.setText("Schedule a dentist's appointment");
        todoItemView.setTime(new Date());
        mTodoListAdapter.addItem(todoItemView);
    }
}

這是todo_list_recycler_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView 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"
                                        android:id="@+id/todo_recycler_view"
                                        android:scrollbars="vertical"
                                        android:layout_width="match_parent"
                                        android:layout_height="match_parent"
                                        app:layout_behavior="@string/appbar_scrolling_view_behavior"
                                        tools:context=".presentation.TodoActivity"
                                        tools:showIn="@layout/activity_todo_list" />

知道為什么我會收到此錯誤嗎?

Caused by: java.lang.IllegalStateException: RecyclerView has no LayoutManager
                                                                                    at android.support.v7.widget.RecyclerView.generateLayoutParams(RecyclerView.java:3393)
                                                                                    at android.view.LayoutInflater.inflate(LayoutInflater.java:502)
                                                                                    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
                                                                                    at com.vorple.shortlist.shortlist.presentation.TodoListFragment.onCreateView(TodoListFragment.java:44)

考慮移動這條線

mRecyclerView.setHasFixedSize(true);

在將布局管理器分配給回收站視圖的行之后。 您可能需要聲明布局管理器,然后才能調用setHasFixedSize

嘗試在另一個方法重寫中添加recyclerview管理器,Butterknife和對象可能正在工作,將布局管理器添加到onResume中或需要加載數據時會發生什么情況。

我對您要使用TodoItemViewlink )類實現的功能非常困惑。 init()方法內部,您正在放大另一個我認為要使用此類在列表中顯示項目的視圖。 這個類內部會出現問題,根據您的邏輯,每次添加模型時,您都將重新創建視圖。 它應該膨脹一次,然后存儲引用,並在添加另一個項目時簡單地收回視圖。 在這種情況下,我認為recyclerView無法回收您的視圖。

因此,我重新創建了一個方案並簡化了您的代碼。 但是我不確定這是否是您問題的確切解決方案。 但是,也許您可​​以在這里找到有用的東西。

1)活動

public class MainActivity extends AppCompatActivity{

private Button playBtn, startActivityBtn;
private MediaPlayer mediaPlayer;

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

    getSupportFragmentManager().beginTransaction()
            .add(R.id.mainContent, new TododFragment())
            .commit();

}
}

2)片段

public class TododFragment extends Fragment {

private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private TodoListAdapter mTodoListAdapter;

public TododFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_todod, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    mRecyclerView = (RecyclerView)view.findViewById(R.id.todo_recycler_view);
    mRecyclerView.setHasFixedSize(true);

    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);

    mTodoListAdapter = new TodoListAdapter();
    mRecyclerView.setAdapter(mTodoListAdapter);

    //Create 10 dummies data
    SimpleDateFormat dt = new SimpleDateFormat("h:mm a");
    for(int i = 0; i < 10; i++){
        if(i % 2 == 0)
            mTodoListAdapter.addItem(new TodoItem("Schedule a dentist's appointment", dt.format(new Date()), 0));
        else
            mTodoListAdapter.addItem(new TodoItem("Schedule a dentist's appointment", dt.format(new Date()), 1));
    }
}
}

3)型號

public class TodoItem {
private String text;
private String time;
//LayoutType is used to display different layout.
private int layoutType;

public TodoItem(String text, String time, int layoutType) {
    this.text = text;
    this.time = time;
    this.layoutType = layoutType;
}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}

public int getLayoutType() {
    return layoutType;
}

public void setLayoutType(int layoutType) {
    this.layoutType = layoutType;
}
}

4)適配器(在這種情況下,我有兩種布局。如果要使用一種布局,請刪除getItemViewType

public class TodoListAdapter extends RecyclerView.Adapter<TodoListAdapter.TodoItemViewHolder> {
private List<TodoItem> mItems;


public static class TodoItemViewHolder extends RecyclerView.ViewHolder{

    public TextView mTextViewText;
    public TextView mTextViewTime;

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

        mTextViewText = (TextView)itemView.findViewById(R.id.mTextViewText);
        mTextViewTime = (TextView)itemView.findViewById(R.id.mTextViewTime);
    }
}

public TodoListAdapter() {
    mItems = new ArrayList<>();
}

@Override
public int getItemViewType(int position) {
    //ItemViewType will return an int for every row. You can use this to control with layout you want to display
    return mItems.get(position).getLayoutType();
}

@Override
public TodoItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    //get the viewType and display the layout accordingly
    View view = null;
    if(viewType == 0){
        view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.todo_list_item, parent, false);
    }
    else{
        view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.todo_list_item2, parent, false);
    }

    TodoItemViewHolder rcv = new TodoItemViewHolder(view);
    return rcv;
}

@Override
public void onBindViewHolder(TodoItemViewHolder holder, int position) {
    holder.mTextViewText.setText(mItems.get(position).getText());
    holder.mTextViewTime.setText(mItems.get(position).getTime());
}

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

public void addItem(TodoItem item) {
    mItems.add(item);
    notifyItemInserted(mItems.size() - 1);
}
}

6)結果 在此處輸入圖片說明

我找出了異常的原因。

這是我在活動的XML文件中所做的更改:

<!-- <include layout="@layout/todo_list_recycler_view" /> -->
    <FrameLayout
        android:id="@+id/todo_list_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

實例化片段時,我沒有在活動的布局文件中包含@ layout / todo_list_recycler_view,而是將空的FrameLayout替換為todo_list_recycler_view,從而擺脫了異常。 我不確定為什么會這樣,但是它為我解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM