[英]How to use RecylerView with Database?
我有一个问题,我待了3天,什么也想不起来。 即,我正在为一家我有SaladMeterialFragment
活动的餐厅编写应用程序,该活动在RecyclerView
中显示CardView
。 当我使用Salad类并从中提取数据时,一切都会正常进行。 但是,我需要重写我的SaladMaterialFragment
才能处理从DatabaseHelper
检索到的数据。 整个问题是我不太了解这些下载的数据如何附加到在RecyclerView
下准备的适配器上。 我如何从游标中检索数据并将其保存在String []
数组中,因为仅RecyclerView
适配器才需要它?
SaladMaterialFragment
激活了SaladDetailFragment
活动,在那里我能够启动数据库,一切正常。 但是我不知道RecyclerView
视图应该是什么样子? 我是一名初学者,只是在学习数据库,所以请耐心等待并说明问题。 预先感谢您的帮助。
回收适配器
//我必须具有STRING[]
和INT[]
,但是光标返回String或int,因此如何从数据库中以这种格式获取数据: String[] ; int[] ?
String[] ; int[] ?
//我必须在这里更改适配器类中的任何内容吗? 如果要使用数据库?
import android.support.v7.widget.CardView;
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;
class RecyclerAdapter extends RecyclerView.Adapter<CaptionedImagesAdapter.ViewHolder> {
private String[] captions;
private int[] imageIds;
private Listener listener;
public static interface Listener {
public void onClick(int position);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private CardView cardView;
public ViewHolder(CardView v) {
super(v);
cardView=v;
}
}
public RecyclerAdapter(String[] captions, int[] imageIds){
this.captions = captions;
this.imageIds = imageIds;
}
public void setListener(Listener listener) {
this.listener = listener;
}
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
CardView cv = (CardView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_captioned_image, parent, false);
return new ViewHolder(cv);
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
CardView cardView = holder.cardView;
ImageView imageView = (ImageView)cardView.findViewById(R.id.info_image);
Drawable drawable = cardView.getResources().getDrawable(imageIds[position]);
imageView.setImageDrawable(drawable);
imageView.setContentDescription(captions[position]);
TextView textView = (TextView)cardView.findViewById(R.id.info_text);
textView.setText(captions[position]);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener != null) {
listener.onClick(position);
}
}
});
}
@Override
public int getItemCount() {
return captions.length;
}
}
数据库助手
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "miodzio";
private static final int DB_VERSION = 1;
public MiodzioDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE SALAD (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "NAME TEXT, "
+ "IMAGE_RESOURCE_ID INTEGER, "
+ "FAVORITE INTEGER);");
insertSalad(db, "Sałatka grecka", R.drawable.salatka_grecka, 0);
insertSalatki(db, "Sałatka z grillowanym kurczakiem", R.drawable.salatka_z_kurczakiem, 0);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
private static void insertSalad(SQLiteDatabase db, String name, int resourceId, int favorite){
ContentValues saladValues = new ContentValues();
saladValues.put("NAME", name);
saladValues.put("IMAGE_RESOURCE_ID", resourceId);
saladValues.put("Favorite", favorite);
db.insert("SALAD", null, saladValues);
}
}
色拉
//当前,从此类中检索SaladMaterialFragment的数据,并且一切正常// //公共类Salad {
private String name;
private int imageResourceId;
public static final Salads[] salad = {
new Salatki("Sałatka grecka", R.drawable.salatka_grecka),
new Salatki("Sałatka z grillowanym kurczakiem", R.drawable.salatka_z_kurczakiem)
};
private Salatki(String name, int imageResourceId) {
this.name = name;
this.imageResourceId = imageResourceId;
}
public String getName() {
return name;
}
public int getImageResourceId() {
return imageResourceId;
}
}
SaladDeteil活动
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.ShareActionProvider;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class SaladDetailActivity extends AppCompatActivity {
public static final String EXTRA_SALATKI = "salatki";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_salatki_detail);
int salatki = (Integer) getIntent().getExtras().get(EXTRA_SALATKI);
/*
The old way of retrieving data is class Salad
*/
/* String salatkiName = Salatki.salatka[salatki].getName();
TextView textView = (TextView) findViewById(R.id.salatki_text);
textView.setText(salatkiName);
int salatkiImage = Salatki.salatka[salatki].getImageResourceId();
ImageView imageView = (ImageView) findViewById(R.id.salatki_image);
imageView.setImageDrawable(getResources().getDrawable(salatkiImage));
imageView.setContentDescription(salatkiName);*/
//We retrieve data from the database, everything works in this class!
try {
SQLiteOpenHelper databaseHelper = new DatabaseHelper(this);
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = db.query("SALAD",
new String[]{"NAME", "IMAGE_RESOURCE_ID", "FAVORITE"},
"_id = ?",
new String[]{Integer.toString(salatki)},
null, null, null);
if(cursor.moveToNext()) {
String nameText = cursor.getString(0);
int photoId = cursor.getInt(1);
boolean isFavorite = (cursor.getInt(2) == 1);
//Display name salad
TextView name = (TextView) findViewById(R.id.salatki_text);
name.setText(nameText);
//Display photo salad
ImageView photo = (ImageView) findViewById(R.id.salatki_image);
photo.setImageResource(photoId);
photo.setContentDescription(nameText);
//Check it for the favorite
CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
favorite.setChecked(isFavorite);
}
cursor.close();
db.close();
}catch (SQLiteException e){
Toast.makeText(this, "Baza danych niedostępna!", Toast.LENGTH_SHORT).show();
}
// getSupportActionBar().setDisplayHomeAsUpEnabled(true); //przycisk w górę!
Toolbar myChildToolbarZupy = (Toolbar) findViewById(R.id.my_child_toolbar_salatki_detail);
setSupportActionBar(myChildToolbarZupy);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
public void onFavoriteClicked(View view) {
int salatki = (Integer) getIntent().getExtras().get(EXTRA_SALATKI);
CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
ContentValues salatkiValues = new ContentValues();
salatkiValues.put("FAVORITE", favorite.isChecked());
SQLiteOpenHelper databaseHelper = new DatabaseHelper(this);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.update("SALAD", salatkiValues,
"_id = ?", new String[]{Integer.toString(salatki)});
db.close();
}
}
色拉材料碎片
*在此类中,存在一个问题,如果使用适配器和RecyclerView视图,我的问题是如何从数据库中提取数据以显示名称和照片。 有关系吗? 我需要将数据从游标转换为String []
和int []
,但是游标不会返回这些类型。*
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class SalatkiMaterialFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
RecyclerView salatkaRecyler = (RecyclerView) inflater.inflate(R.layout.fragment_salatki_material, container, false);
/*
At the moment data is retrieved from the Salad class, I care to be retrieved from DatabaseHelper.
*/
String[] salatkaName = new String[Salatki.salatka.length];
for(int i=0; i<salatkaName.length; i++) {
salatkaName[i] = Salatki.salatka[i].getName();
}
int[] salatkaImage = new int[Salatki.salatka.length];
for(int i=0; i<salatkaImage.length; i++) {
salatkaImage[i] = Salatki.salatka[i].getImageResourceId();
}
//This adapter adopts in the constructor type: String [] and int []
RecyclerAdapter adapter = new RecyclerAdapter(salatkaName, salatkaImage);
salatkaRecyler.setAdapter(adapter);
LinearLayoutManager manager = new LinearLayoutManager(inflater.getContext(), LinearLayoutManager.VERTICAL, false);
salatkaRecyler.setLayoutManager(manager);
adapter.setListener(new CaptionedImagesAdapter.Listener() {
@Override
public void onClick(int position) {
Intent intent = new Intent(getActivity(), SalatkiDetailActivity.class);
intent.putExtra(SalatkiDetailActivity.EXTRA_SALATKI, position);
getActivity().startActivity(intent);
/*
Here I will write my code, which I tried to prick. Of course he does not work, but maybe it will serve to better focus on what exactly I mean.
*/
/*
try {
SQLiteOpenHelper databaseHelper = new DatabaseHelper(inflater.getContext());
SQLiteDatabase db = databaseHelper.getRedableDatabase();
Cursor cursor = db.query("SALAD",
new String[] {"NAME", "IMAGE_RESOURCE_ID"},
null, null, null, null, null);
if(cursor.moveToNext()) {
String name = cursor.getString(0); //But I must have a String[] for RecyclerAdapter?
int photo = cursor.getString(0); ////But I must have a int[] for RecyclerAdapter?
}
db.close();
cursor.close();
}catch(SQLiteException e){
Toast.makeText(inflater.getContext(), "Database does not work!", Toast.LENGTHS_SHORT).show();
}
RecyclerAdapter adapter = new RecyclerAdapter(name, photo); //Here I must have String[] - name AND int[] - resource photo id?
salatkaRecyler.setAdapter(adapter);
LinearLayoutManager manager = new LinearLayoutManager(inflater.getContext(), LinearLayoutManager.VERTICAL, false);
salatkaRecyler.setLayoutManager(manager);
adapter.setListener(new CaptionedImagesAdapter.Listener() {
@Override
public void onClick(int position) {
Intent intent = new Intent(getActivity(), SalatkiDetailActivity.class);
intent.putExtra(SalatkiDetailActivity.EXTRA_SALATKI, position);
getActivity().startActivity(intent);
*/
}
});
return salatkaRecyler;
}
}
首先,最好创建一个Salad类来存储您的Salad数据,这样您的应用程序的其余部分就不必处理原始字符串和int数据
其次,您得到的是Int和String而不是这两个数组,因为数据库游标一次读取一行 。 这是我建议您创建沙拉对象并返回em数组的地方
List<Salad> salads = new ArrayList<>();
while(cursor.moveToNext()){
String name = cursor.getString(0);
int photo = cursor.getInt(1);
boolean isFavorite = (cursor.getInt(2) == 1);
Salad salad = new Salad(name,photo,isFavorite);
salads.add(salad);
}
而且recyclerview应该显示的是沙拉数组,而不是字符串和整数数组,这样您就无需进行重新加工,如果您需要从其他来源加载沙拉数据
您可以尝试skyfishjy CursorRecyclerViewAdapter。
您的RecyclerAdapter.java现在看起来像这样:
class RecyclerAdapter extends CursorRecyclerViewAdapter<MyListCursorAdapter.ViewHolder> {
// onBindViewHolder, onCreateViewHolder and Viewholder inside
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.