【问题标题】:How can load data from sqlite to recyclierview?如何将数据从 sqlite 加载到 recyclerview?
【发布时间】:2019-12-09 19:58:14
【问题描述】:

我正在我的项目中使用 dbSqlite 制作购物车。我可以从 sqlite 添加和检索数据。我也可以添加到recyclierview。但是,我在 recyclierview 上创建了一个产品列表并从中获取数据。单击购物车按钮时,它应该加载到 recyclierview。如何在不手动添加列表的情况下将所有数据从 sqlite 加载到 recyclierview?

我可以像在 CartFragment.java 中那样将数据从数据库添加到 recyclerview:

db = new DatabaseHelper(getContext());

        Cursor rs = db.getData();
        rs.moveToFirst();

         img = rs.getString(rs.getColumnIndex("Image"));
         title = rs.getString(rs.getColumnIndex("Title"));
         cost = rs.getString(rs.getColumnIndex("Cost"));
         market = rs.getString(rs.getColumnIndex("Market"));

        productList = new ArrayList<>();
        product = new Product(title, img, cost,"asdas",market,"");
        productList.add(product);
        product = new Product(getString(R.string.dell_title), getString(R.string.dell_url), "11.990 TL","dasdaaaaas","Migros","");
        productList.add(product);

CartAdapter.java

public class CartAdapter extends RecyclerView.Adapter<CartAdapter.CartViewHolder> {
    private Context mContext;
    private List<Product> productList;
    private TextView textMarketName, textProductName, textProductCost, textProfit;
    private ImageView imgProduct;

    public CartAdapter(Context mContext, List<Product> productList) {
        this.mContext = mContext;
        this.productList = productList;
    }


    @NonNull
    @Override
    public CartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
       View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_item_view, parent, false);
       return new CartViewHolder(view);
    }

    @Override
    public void onBindViewHolder(CartViewHolder cartViewHolder, int position) {

        Glide.with(mContext).load(productList.get(position).getProductImage())
                .apply(RequestOptions.placeholderOf(R.drawable.ic_glide_img).error(R.drawable.ic_glide_warning)).
                into(imgProduct);
        textProductName.setText(productList.get(position).getProductName());
        textMarketName.setText(productList.get(position).getProductMarket());
        textProductCost.setText(productList.get(position).getProductCost());
    }

    @Override
    public int getItemCount() {
        return productList.size();
    }

   class CartViewHolder extends RecyclerView.ViewHolder {
         CartViewHolder(@NonNull View itemView) {
            super(itemView);
            imgProduct = itemView.findViewById(R.id.imageView_cart_product);
            textMarketName = itemView.findViewById(R.id.textViewCart_MarketName);
            textProductName = itemView.findViewById(R.id.textView_cart_product_title);
            textProductCost = itemView.findViewById(R.id.textView_cart_product_cost);
            textProfit = itemView.findViewById(R.id.textView_cart_profit);
        }
    }
}

Product.java

public class Product {
    private String productName;
    private String productImage;
    private String productCost;
    private String productDescription;
    private String productMarket;
    private String productMarketImage;


    public Product(){

    }
    public Product(String productName, String productImage, String productCost, String productDescription, String productMarket, String productMarketImage) {
        this.productName = productName;
        this.productImage = productImage;
        this.productCost = productCost;
        this.productDescription = productDescription;
        this.productMarket = productMarket;
        this.productMarketImage = productMarketImage;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getProductImage() {
        return productImage;
    }

    public void setProductImage(String productImage) {
        this.productImage = productImage;
    }

    public String getProductCost() {
        return productCost;
    }

    public void setProductCost(String productCost) {
        this.productCost = productCost;
    }

    public String getProductDescription() {
        return productDescription;
    }

    public void setProductDescription(String productDescription) {
        this.productDescription = productDescription;
    }

    public String getProductMarket() {
        return productMarket;
    }

    public void setProductMarket(String productMarket) {
        this.productMarket = productMarket;
    }

    public String getProductMarketImage() {
        return productMarketImage;
    }

    public void setProductMarketImage(String productMarketImage) {
        this.productMarketImage = productMarketImage;
    }
}

CartFragment.java

public class CartFragment extends Fragment {

    private ImageView imageShare;
    List<Product> productList;
    List<Supermarket> supermarketList;
    Product product;
    Supermarket supermarket;
    DatabaseHelper db;
    String title, cost, img, market;
    private Toolbar toolbar;
    private RecyclerView recyclerViewCart;
    private OnFragmentInteractionListener mListener;

    public CartFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_cart, container, false);
        recyclerViewCart = v.findViewById(R.id.recyclerview_cart);
        LinearLayoutManager verticalLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerViewCart.setLayoutManager(verticalLayoutManager);
        db = new DatabaseHelper(getContext());

        Cursor rs = db.getData();
        rs.moveToFirst();

         img = rs.getString(rs.getColumnIndex("Image"));
         title = rs.getString(rs.getColumnIndex("Title"));
         cost = rs.getString(rs.getColumnIndex("Cost"));
         market = rs.getString(rs.getColumnIndex("Market"));

        productList = new ArrayList<>();
        product = new Product(title, img, cost,"asdas",market,"");
        productList.add(product);

        CartAdapter myAdapter = new CartAdapter(getActivity(), productList);
        recyclerViewCart.setAdapter(myAdapter);

}

【问题讨论】:

  • 你想做什么?
  • 扩展CursorRecyclerAdapter适配器而不是RecyclerView.Adapter
  • @PembaTamang 我想在单击购物车按钮时将购物车作为列表添加到 recyclierview。

标签: java android sqlite android-recyclerview android-sqlite


【解决方案1】:

从 SQLite DB 获取数据并设置为 recyclerview 的示例代码:

 RecyclerView recyclerView = view.findViewById(R.id.recycler);
        SQLiteOpenHelper sqopenhelper = new Akdbhelper(getActivity());
        try {
            SQLiteDatabase db = sqopenhelper.getReadableDatabase();
            Cursor cursor = db.query("CAT_AVAIL", new String[]{"CUISINE", "IMAGE"}, null, null, null, null, null);
            cuisineNames = new String[cursor.getCount()];
            //Move to the first record in the Cursor based on Selection Key.

            for (int i = 0; i <cursor.getCount(); i++) {
                switch (i) {
                    case 0:
                        cursor.moveToFirst();
                        cuisineNames[i] = cursor.getString(0);
                        break;
                    case 1:
                        cursor.moveToNext();
                        cuisineNames[i] = cursor.getString(0);
                        break;
                    case 2:
                        cursor.moveToNext();
                        cuisineNames[i] = cursor.getString(0);
                        break;
                    case 3:
                        cursor.moveToNext();
                        cuisineNames[i] = cursor.getString(0);
                        break;
                }

            }

            cursor.close();
            db.close();
        } catch (SQLiteException e) {
            Log.v("DBE", "Error on Fetching database");
        }


        Adapter adapter = new Adapter(cuisineNames, cuisineImages);
        recyclerView.setAdapter(adapter);
        GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 2);
        recyclerView.setLayoutManager(layoutManager);

【讨论】:

    【解决方案2】:

    1 - 在您的 cartFragment 中,您必须创建一个返回 Cursor 并读取存储在 db 中的所有数据的方法,然后将光标作为参数提供给您的适配器。

    类似:

    private Cursor getAllProducts(){
      return db.query(TABLE_NAME, null....); 
    }
    

    你可以准备一下query here:

    在 createView() 中,您调用如下方法:Cursor myCursor = getAllProducts(); 然后你像这样设置你的适配器:

    CartAdapter myAdapter = new CartAdapter(getActivity(), myCursor);
    

    2 - 在您的 CartAdapter.java 类中,您从 onBindViewHolder() 中的光标检索数据并将光标的值设置为您的视图。

    适配器的构造函数将是这样的:

    public CartAdapter(Context mContext, Cursor myCursor) {
            this.mContext = mContext;
            this.mCursor= myCursor;
        }
    

    在 onBindViewHolder() 方法中,您可以像这样读取光标的值:

    public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
    // move the cursor to the position of the item t be displayed
        if(!mCursor.moveToPosition(position)){
            return; //fail if return 0
        }
    
        img = mCursor.getString(rs.getColumnIndex("Image"));
        title = mCursor.getString(mCursor.getColumnIndex("Title"));
        cost = mCursor.getString(mCursor.getColumnIndex("Cost"));
        market = mCursor.getString(mCursor.getColumnIndex("Market"));
    }
    

    和:

    @Override
        public int getItemCount() {
            return mCursor.getCount();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多