如何将RecylerView与数据库一起使用?

时间:2017-10-03 16:35:11

标签: java android android-recyclerview recycler-adapter simplecursoradapter

我有一个问题,我坐了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;




            }
        }

2 个答案:

答案 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
}