![](/img/trans.png)
[英]Recyclerview Layout Manager Get View in Position After Scrolling in Android
[英]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中或需要加載數據時會發生什么情況。
我對您要使用TodoItemView
( link )類實現的功能非常困惑。 在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);
}
}
我找出了異常的原因。
這是我在活動的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.