我正在尝试在片段中使用回收器视图,但我遇到一个问题,我的列表没有出现,我有这个错误:
e/recycle view:未连接适配器;跳过布局
我检查了解决方案,显然问题出现在:
> < li > < p > RecyclerView在适配器后初始化
绑定和设置回收器在“创建”查看“而不是”创建“中查看
但我注意到了,我尝试了其他选择,我仍然面临着同样的问题。
这是我的片段代码:
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.gosia.weightapplication.databinding.FragmentHistoryBinding;
import com.example.gosia.weightapplication.model.WeightData;
import com.orhanobut.logger.Logger;
import com.raizlabs.android.dbflow.sql.language.SQLite;
import java.util.ArrayList;
import java.util.List;
public class HistoryFragment extends Fragment {
private List<WeightData> mWeightData = new ArrayList<>();
private FragmentHistoryBinding mFragmentHistoryBinding;
private ListAdapter mAdapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_history, viewGroup, false);
//binding variable
mFragmentHistoryBinding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_history);
mFragmentHistoryBinding.setVariable(this);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//recycler
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
// define an adapter
mAdapter = new ListAdapter(mWeightData, getContext());
recyclerView.setAdapter(mAdapter);
prepareWeightData();
}
private void prepareWeightData() {
mWeightData = SQLite.select().
from(WeightData.class).queryList();
Logger.d(mWeightData.toString()); //The list isn't null, I have data to show
mAdapter.notifyDataSetChanged();
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="variable"
type="com.example.gosia.weightapplication.HistoryFragment" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorWhite"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBlack">
</View>
</LinearLayout>
</layout>
列表适配器的代码:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.gosia.weightapplication.model.WeightData;
import java.util.List;
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
private List<WeightData> mList;
private Context mContext;
private final LayoutInflater mLayoutInflater;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView date, weight;
public ImageView image;
public ViewHolder(View v) {
super(v);
date = v.findViewById(R.id.text_view_date);
weight = v.findViewById(R.id.text_view_weight);
image = v.findViewById(R.id.image);
}
}
public ListAdapter(List<WeightData> plist, Context pContext) {
this.mList = plist;
this.mContext = pContext;
this.mLayoutInflater = LayoutInflater.from(this.mContext);
}
@Override
public ListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = this.mLayoutInflater.inflate(R.layout.item_weight_history, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//set data
WeightData weightData = mList.get(position);
holder.date.setText(weightData.getLastDayWeightMeasurement());
holder.weight.setText(weightData.getWeight());
}
@Override
public int getItemCount() {
return mList.size();
}
}
而我的活动是适当扩展Android . support . V7 . app . appcompactivity
任何帮助将不胜感激
编辑:它显然与此DataBindingUtil有关?
将正确的上下文传递给适配器类
改变这个
getContext()
到
getActivity()
应该是这样的
mAdapter = new ListAdapter(mWeightData, getActivity(());
recyclerView.setAdapter(mAdapter);
也
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
并始终传递使用getactive()在片段:-更多信息在这里
在片段中使用上下文
合并onCreateView和onViewCreated(见下文)对我有效(错误消失)
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, viewGroup, false);
//binding variable
mFragmentHistoryBinding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_first);
mFragmentHistoryBinding.setVariable(this);
//recycler
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
// define an adapter
mAdapter = new ListAdapter(mWeightData, getContext());
recyclerView.setAdapter(mAdapter);
prepareWeightData();
return view;
}
编辑
像这样更改适配器:
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
private final List<WeightData> mList;
//... existing code
public void updateDataSet(List<WeightData> weightData) {
mList.clear();
mList.addAll(weightData);
notifyDataSetChanged();
}
public ListAdapter(Context pContext) {
this.mList = new ArrayList<>();
this.mContext = pContext;
this.mLayoutInflater = LayoutInflater.from(this.mContext);
}
//... existing code
}
在onCreateView中(从下面更新)
// define an adapter
mAdapter = new ListAdapter(getContext());
recyclerView.setAdapter(mAdapter);
prepareWeightData();
return view;
}
准备重量数据方法:
private void prepareWeightData() {
List<WeightData> weightData = SQLite.select().
from(WeightData.class).queryList();
Logger.d(weightData.toString()); //The list isn't null, I have data to show
mAdapter.updateDataSet(weightData);
}
我在没有绑定的情况下运行您的代码,它运行得非常完美。你应该检查一下你的捆绑
public class HistoryFragment extends Fragment {
private ListAdapter mAdapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_history, viewGroup, false);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//recycler
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
// define an adapter
mAdapter = new ListAdapter(null, getContext());
recyclerView.setAdapter(mAdapter);
}
}
即使使用getContext(),它也可以工作,如果您传递的是空列表,虽然它不会在回收器视图中显示任何内容,但不会出现跳过布局错误。
知道是什么引起的吗?
我想从火力点实时数据库显示图片。(带有加密图像(字符串))类似加密图像是“照片” 函数loadPhoto() 问题出在哪里?我连接adapter和recyclerview,并设置GridManager。
我得到了这个错误,但我不知道是什么原因导致的...也许是因为它是在一个片段中初始化的,而不是在activity本身。编辑:包含的StatsAdapter代码
ListPetientFragment。JAVA 错误是:2021-11-17 18:41:02.417 29997-29997/?E/rtphonemedicat:运行时设置的未知位_标志:0x8000 2021-11-17 18:41:03.628 29997-30029/com。尼戈特。smartphonemedicate E/GED:无法获取GED日志Buf,错误(0)2021-11-17
这是我在片段中的代码: 这是从LogCat得到的 没有连接适配器跳过布局 观赏者 我在model类中设置getter和setter方法。(holder类所必需变量)
给我的 我已经尝试了我找到的所有解决方案(设置一个空适配器,将代码移动到哪里,使用单独的线程),但无济于事。这应该适用于正常的活动,所以我想也许我做错了什么。