问题描述
所以我正在尝试制作一个导航抽屉,我正在使用 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 (将#修改为@)