我有一个问题,我坐了3天,我什么都想不到。也就是说,我正在为一家餐馆编写应用程序,我的SaladMeterialFragment
活动在CardView
中显示RecyclerView
。当我使用Salad类并从中提取数据时,一切正常。但是,我需要重写SaladMaterialFragment
来处理从DatabaseHelper
检索到的数据。整个问题是我不太清楚这些下载的数据是如何附加到我在RecyclerView
下准备的适配器的。如何从游标中检索数据并将其保存在String []
数组中,因为我只需要RecyclerView
适配器?
SaladMaterialFragment
激活SaladDetailFragment
活动,在那里我可以启动数据库,一切正常。但我不知道RecyclerView
次查看应该是什么样子?我是一名初学者,只是学习数据库,所以请耐心等待并解释。提前感谢您的帮助。
RecyclerAdapter
//我必须有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;
}
}
DatabaseHelper
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);
}
}
Salad.java
// 目前,从这个类中检索SaladMaterialFragment的数据,一切正常 // 的 公共课沙拉{
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;
}
}
SaladDeteilActivity
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();
}
}
SaladMaterialFragment
*
在这个类中,存在一个问题,我的问题是如果我使用适配器和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;
}
}
答案 0 :(得分:0)
首先,最好创建一个Salad类来存储您的沙拉数据,这样您的应用程序的其余部分就不必处理原始字符串和int数据
第二,你得到的是Int和String,而不是那两个数组,因为数据库游标一次读取一行。这是我建议你创建沙拉对象并返回一组em
的地方ALTER TABLE tab_name ADD CONSTRAINT
constraint_name CHECK (col LIKE '[A-Z][A-Z][A-Z][0-9][0-9][0-9][0-9]');
并且recyclerview应该显示一系列沙拉而不是一系列字符串和这样的方式,如果您需要从其他来源加载沙拉数据,您将不必重做它
答案 1 :(得分:0)
您可以试试skyfishjy CursorRecyclerViewAdapter。
您的 RecyclerAdapter.java 现在看起来像这样:
class RecyclerAdapter extends CursorRecyclerViewAdapter<MyListCursorAdapter.ViewHolder> {
// onBindViewHolder, onCreateViewHolder and Viewholder inside
}