в recyclerview не отбражаются элементы
Столкнулся с проблемой, что ресайклер вью не отображает элементы (при этом никаких вылетов приложения и подобного). При этом в LogCat'e: E/RecyclerView: No adapter attached; skipping layout
Код Fragment'a:
public class HomeFragment extends Fragment {
private FragmentHomeBinding binding;
private ImageButton ib_addpas;
private RecyclerView rv_fams;
private LinearLayoutManager llm;
private Spinner sp_pas;
private AppDatabase db;
private FamDao fdao;
private ApiaryDao apdao;
private String pas_name;
private Apiary newap;
private List<Apiary> all;
private boolean is_pas_picked = false;
private List<String> sp_pickpas_list;
private List<Fam> fams;
private Intent i_addfam;
private TextView error;
private RVA_fam rva_fam;
private int id_pas;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
HomeViewModel homeViewModel =
new ViewModelProvider(this).get(HomeViewModel.class);
binding = FragmentHomeBinding.inflate(inflater, container, false);
View root = binding.getRoot();
rv_fams = root.findViewById(R.id.rv_fams);
error = root.findViewById(R.id.tv_error);
sp_pickpas_list = new ArrayList<String>();
sp_pickpas_list.add("---------------");
newap = new Apiary();
rv_fams.setVisibility(View.INVISIBLE);
error.setVisibility(View.VISIBLE);
i_addfam = new Intent(getContext(), AddFamily.class);
ib_addpas = root.findViewById(R.id.ib_add);
Button ib_addfam = root.findViewById(R.id.b_addfam);
sp_pas = root.findViewById(R.id.sp_paspick);
llm = new LinearLayoutManager(getContext());
llm.setOrientation(RecyclerView.VERTICAL);
rv_fams.setLayoutManager(llm);
db = app.getInstance().getDatabase();
fdao = db.FamDao();
apdao = db.ApiaryDao();
ib_addfam.setVisibility(View.INVISIBLE);
rva_fam = new RVA_fam();
rv_fams.setAdapter(rva_fam); //присвоение адаптера вне условия
getListPas();
ArrayAdapter<String> sp_pas_adap = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, sp_pickpas_list);
sp_pas.setAdapter(sp_pas_adap);
sp_pas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if(i!=0) {
fams = fdao.getFams(i); //данные в переменную поступают верно
if(fams.size()!=0) {
rv_fams.setVisibility(View.VISIBLE);
rva_fam.setItems(fams); //внутри условия присвоение адаптеру списка элементов
error.setVisibility(View.INVISIBLE);
} else {
rv_fams.setVisibility(View.INVISIBLE);
error.setVisibility(View.VISIBLE);
}
ib_addfam.setVisibility(View.VISIBLE);
id_pas=i;
is_pas_picked = true;
} else {
rva_fam.clearItems();
rv_fams.setVisibility(View.INVISIBLE);
error.setVisibility(View.VISIBLE);
ib_addfam.setVisibility(View.INVISIBLE);
is_pas_picked = false;
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
ib_addpas.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (is_pas_picked){
i_addfam.putExtra("pas_id", id_pas);
startActivity(i_addfam);
} else {
CreateDialog(savedInstanceState).show();
}
}
});
ib_addfam.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
return root;
}
public Dialog CreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Добавить пасеку");
LayoutInflater li = LayoutInflater.from(getActivity());
View v = li.inflate(R.layout.ad_add_pas, null);
builder.setView(v);
EditText etName = v.findViewById(R.id.et_pasname);
builder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
pas_name = etName.getText().toString();
if (pas_name.compareTo("") == 0) {
Toast.makeText(getContext(),
"Поле не заполнено", Toast.LENGTH_SHORT).show();
} else {
newap.kol_fams = 0;
newap.name = pas_name;
apdao.insert_apiary(newap);
dialog.cancel();
}
}
});
builder.setNegativeButton("ОТМЕНА", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
return builder.create();
}
private void getListPas(){
all = apdao.getAllfromApiary();
for(int i=0; i<all.size(); i++){
sp_pickpas_list.add(all.get(i).name + " (" + all.get(i).kol_fams + ")");
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
Код адаптера:
package com.example.myapiary;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.myapiary.DBmgmt.tables.Fam;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
* TODO: document your custom view class.
*/
public class RVA_fam extends RecyclerView.Adapter<RVA_fam.RVFamViewHolder> {
private List<Fam> listfam = new ArrayList<>();
@NonNull
@Override
public RVFamViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context ctx = parent.getContext();
int layout = R.id.rva_fam;
LayoutInflater li = LayoutInflater.from(ctx);
@SuppressLint("ResourceType") View v = li.inflate(layout, parent, false );
RVFamViewHolder holder = new RVFamViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(@NonNull RVFamViewHolder holder, int position) {
holder.bind(listfam.get(position));
}
public void setItems(List<Fam> list){
listfam = list;
notifyDataSetChanged();
}
public void clearItems(){
listfam.clear();
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return 0;
}
class RVFamViewHolder extends RecyclerView.ViewHolder {
TextView num;
TextView type;
TextView poroda;
TextView matkayear;
TextView date_add;
public RVFamViewHolder(@NonNull View itemView) {
super(itemView);
num = itemView.findViewById(R.id.tv_number);
type = itemView.findViewById(R.id.tv_type);
poroda = itemView.findViewById(R.id.tv_poroda);
matkayear = itemView.findViewById(R.id.tv_matkayear);
date_add = itemView.findViewById(R.id.tv_pasdate);
}
public void bind(Fam f){
num.setText((int)f.number);
if(f.otvodok_ot!=0){
type.setText(f.type + " от семьи №"+f.otvodok_ot);
} else {
type.setText(f.type);
}
poroda.setText((int)f.number);
matkayear.setText((int)f.matka_year);
date_add.setText(f.date_add);
}
}
}
Разметка элемента:
<androidx.cardview.widget.CardView xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rva_fam"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="10sp"
android:layout_margin="2sp"
>
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tv_number"
android:layout_width="154dp"
android:layout_height="30dp"
android:text="Семья №"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_name"
android:layout_width="84dp"
android:layout_height="30dp"
android:text="Семья №"
android:textSize="18sp"
android:textStyle="bold" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tv_desc2"
android:layout_width="217dp"
android:layout_height="23dp"
android:text="Порода:" />
<TextView
android:id="@+id/tv_poroda"
android:layout_width="wrap_content"
android:layout_height="23dp"
android:text="TextView" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/s"
android:layout_width="206dp"
android:layout_height="19dp"
android:text="Год выпуска матки:" />
<TextView
android:id="@+id/tv_matkayear"
android:layout_width="wrap_content"
android:layout_height="19sp"
android:text="TextView" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/s2"
android:layout_width="206dp"
android:layout_height="19dp"
android:text="Дата установки на пасеку:" />
<TextView
android:id="@+id/tv_pasdate"
android:layout_width="wrap_content"
android:layout_height="19sp"
android:text="TextView" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tv_desc"
android:layout_width="199dp"
android:layout_height="23dp"
android:text="Тип семьи:" />
<TextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="23dp"
android:text="TextView" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView8"
android:layout_width="192dp"
android:layout_height="20dp"
android:layout_marginTop="10sp"
android:text="*Служебное поле*" />
</TableRow>
</TableLayout>
</androidx.cardview.widget.CardView>
Подскажите, пожалуйста, в чем может быть проблема. Спасибо заранее!
UPD: изменил структуру условия + проверил на правильность получения данных из бд (данные получает верно)