导航抽屉android studio'void androidx.recyclerview.widget.RecyclerView.setHasFixedSize(boolean)'错误

问题描述

所以我正在尝试制作一个导航抽屉,我正在使用 recyclerview 并且它完美地工作。 问题是我将 recyclerView 放在 android studio 提供给我的“content main.xml”上,所以回收器显示在每个类别中。 我尝试将回收器移动到“fragment_home.xml”,这是我想显示它的地方,但我收到了“void androidx.recyclerview.widget.RecyclerView.setHasFixedSize(boolean)”错误。 我该如何解决?我想我应该使用android studio提供给我的“ui”的“homeFragment”和“homeviewmodel”,但我不明白如何使用它。

主要活动代码

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.sqliteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import android.widget.Toast;

import com.example.pruebadraw.ui.home.HomeFragment;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;

import androidx.annotation.NonNull;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.linearlayoutmanager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements ListaAdaptador.OnNoteListener {

    private AppBarConfiguration mAppBarConfiguration;
    List<ListaElementos> elementos = new ArrayList<>();
    sqliteDatabase basedatos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home,R.id.nav_gallery,R.id.nav_slideshow)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this,R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this,navController,mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView,navController);

        ComidasqliteHelper cmdb = new ComidasqliteHelper(this,"DBComida",null,1);;

        basedatos = cmdb.getWritableDatabase();
        recorrerBD();

        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }
    public void cargar(ListaElementos elemento){
        elementos.add(elemento);
        ListaAdaptador ladp = new ListaAdaptador(elementos,this,this);

        RecyclerView rView = ((MainActivity)this).findViewById(R.id.recyclerView);
        //RecyclerView rView = findViewById(R.id.recyclerView);
        rView.setHasFixedSize(true);
        rView.setLayoutManager(new linearlayoutmanager(this));
        rView.setAdapter(ladp);

    }
    public void añadeComida(View v) {

        Intent intent = new Intent(MainActivity.this,TipoComida.class);
        startActivity(intent);
    }
    @Override
    public boolean onoptionsItemSelected(@NonNull MenuItem item) {
        return super.onoptionsItemSelected(item);
    }
public void recorrerBD(){
    elementos.clear();
    Cursor cursor = basedatos.query("Comida",new String[]{ "tipo","nombre","localizacion"},null); //creas un cursor con toda la informacion de la BD
    cursor.movetoFirst();
    while(cursor.movetoNext()){
        cargar(new ListaElementos(cursor.getString(0),cursor.getString(1),cursor.getString(2)));
    }
}
    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this,R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController,mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }

    public void añadir(ListaElementos elemento) {
       elementos.add(elemento);
    }

    @Override
    public void OnNoteClick(int position) {
    //elementos.remove(position);
        CharSequence text = elementos.get(position).getLocalizacion();
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(this,text,duration);
        toast.show();
        //basedatos.delete("Comida","localizacion = " +"'"+elementos.get(position).getLocalizacion()+"'"+" AND "+" nombre = "+"'"+elementos.get(position).getLocalizacion()+"'",null);
        basedatos.delete("Comida","localizacion = " +"'"+elementos.get(position).getLocalizacion()+"'",null);

        if(elementos.size()!=0){
            recorrerBD();
        }else{
            ListaAdaptador ladp = new ListaAdaptador(elementos,this);
            RecyclerView rView = findViewById(R.id.recyclerView);
            rView.setHasFixedSize(true);
            rView.setLayoutManager(new linearlayoutmanager(this));
            rView.setAdapter(ladp);
        }


    }
}

适配器

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Icon;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.recyclerview.widget.RecyclerView;

import java.io.File;
import java.util.List;

public class ListaAdaptador extends RecyclerView.Adapter<ListaAdaptador.ViewHolder> {
    private List<ListaElementos> datos;
    private LayoutInflater nInflater;
    private Context context;
private OnNoteListener onNoteListener;
    public ListaAdaptador(List<ListaElementos> itemlist,Context context,OnNoteListener onNoteListener) {
        this.nInflater = LayoutInflater.from(context);
        this.context = context;
        this.datos = itemlist;
        this.onNoteListener = onNoteListener;
    }

    public ListaAdaptador(Context context) {
        this.context = context;
    }

    public void RecyclerAdapter(Context context) {
        this.context = context;
    }

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

    @Override
    public ListaAdaptador.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        View view = nInflater.inflate(R.layout.lista_elementos,null);
        return new ListaAdaptador.ViewHolder(view,onNoteListener);
    }

    @Override
    public void onBindViewHolder(final ListaAdaptador.ViewHolder holder,final int position) {
        holder.bindData(datos.get(position));
    }

    public void setItem(List<ListaElementos> items) {
        datos = items;
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        ImageView icono;
        OnNoteListener onNoteListener;
        TextView t_Nombre,t_Tipo,t_Localizacion;
        ViewHolder(View itemView,OnNoteListener onNoteListener) {
            super(itemView);
            icono = itemView.findViewById(R.id.i_editacontacto);
            t_Nombre = itemView.findViewById(R.id.tvNombre);
            t_Tipo = itemView.findViewById(R.id.tvTipo);
            t_Localizacion = itemView.findViewById(R.id.tvLocalizacion);
            this.onNoteListener = onNoteListener;
            itemView.setonClickListener(this);

        }

        void bindData(final ListaElementos item) {

            if(item.getTipo().equalsIgnoreCase("pizza")){//Comprueba si es una pizza o una hamburguesa y cambia la imagen. El ignorecase no hace falta,hay que removerlo
                icono.setimageResource(R.drawable.ic_pizza);
            }else{
                icono.setimageResource(R.drawable.ic_hamburguesa);
            }
            

            t_Nombre.setText(item.getNombre());
            t_Tipo.setText(item.getTipo());
            t_Localizacion.setText(item.getLocalizacion());

        }

        @Override
        public void onClick(View v) {
onNoteListener.OnNoteClick(getAdapterPosition());
        }
    }
    public interface  OnNoteListener{
        void OnNoteClick(int position);
    }
}

一些代码以备不时之需

package com.example.pruebadraw;

public class ListaElementos {
    public String tipo;
    public String nombre;
    public String localizacion;

    public ListaElementos(String tipo,String numero,String localizacion) {
        this.tipo=tipo;
        this.nombre = nombre;
        this.localizacion = localizacion;
    }
    

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getLocalizacion() {
        return localizacion;
    }

    public void setLocalizacion(String localizacion) {
        this.localizacion = localizacion;
    }
}

回收商现在在哪里

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/app_bar_main">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="407dp"
        android:layout_height="542dp"
        android:layout_marginStart="1dp"
        android:layout_marginEnd="70dp"
        android:layout_marginBottom="92dp"
        app:layout_anchor="@+id/include"
        app:layout_anchorGravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"

        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent" />

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="16dp"
        app:defaultNavHost="true"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>

我想展示的地方

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.home.HomeFragment"/>
package com.example.pruebadraw.ui.home;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.viewmodelProviders;

import com.example.pruebadraw.R;

public class HomeFragment extends Fragment {

    private Homeviewmodel homeviewmodel;

    public View onCreateView(@NonNull LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        homeviewmodel =
                viewmodelProviders.of(this).get(Homeviewmodel.class);
        View root = inflater.inflate(R.layout.fragment_home,container,false);

        homeviewmodel.getText().observe(getViewLifecycleOwner(),new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
               // textView.setText(s);
            }
        });
        return root;
    }
}
package com.example.pruebadraw.ui.home;

import android.database.sqlite.sqliteDatabase;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.mutablelivedata;
import androidx.lifecycle.viewmodel;
import androidx.recyclerview.widget.linearlayoutmanager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.pruebadraw.ComidasqliteHelper;
import com.example.pruebadraw.ListaAdaptador;
import com.example.pruebadraw.ListaElementos;
import com.example.pruebadraw.MainActivity;
import com.example.pruebadraw.R;

import java.util.ArrayList;
import java.util.List;

public class Homeviewmodel extends viewmodel {

    private mutablelivedata<String> mText;
    List<ListaElementos> elementos = new ArrayList<>();
    sqliteDatabase basedatos;
    public Homeviewmodel() {
        mText = new mutablelivedata<>();
        mText.setValue("This is home fragment");

    }

    public LiveData<String> getText() {
        return mText;
    }
}

当然还有“manifest.xml”

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pruebadraw">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".NombreComida"></activity>
        <activity android:name=".TipoComida" />
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...