繁体   English   中英

如何在数据库中使用RecylerView?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM