如何在运行时生成卡片视图以显示来自 Sqlite 的数据?

Posted

技术标签:

【中文标题】如何在运行时生成卡片视图以显示来自 Sqlite 的数据?【英文标题】:How can I Generate Card view at run time to display data from Sqlite? 【发布时间】:2021-04-11 07:21:02 【问题描述】:

您好,我需要一点帮助。我正在做一个项目,根据聚合、类别和城市推荐大学。我知道如何在运行时在简单列表视图中显示大学列表,但我想使用子文本视图系统地显示它以显示列数据,以便用户友好地阅读大学列表。

下面是我的代码,用于显示简单生成的大学列表。

DisplayList.java

package com.example.dsecollegerecommender;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;

import android.os.Bundle;

import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.HashMap;
import java.util.List;
import java.util.Objects;

import static java.lang.Boolean.getBoolean;

public class DisplayList extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        setContentView(R.layout.activity_display_list);

        Bundle bundle = getIntent().getExtras();
        HashMap<String, String> cities = new HashMap<>();

        Boolean city1 = getIntent().getExtras().getBoolean("Pune");
        Boolean city2 = getIntent().getExtras().getBoolean("Amravati");
        Boolean city3 = getIntent().getExtras().getBoolean("Ahmednagar");
        Boolean city4 = getIntent().getExtras().getBoolean("Nashik");
        Boolean city5 = getIntent().getExtras().getBoolean("Nanded");
        Boolean city6 = getIntent().getExtras().getBoolean("Aurangabad");
        Boolean city7 = getIntent().getExtras().getBoolean("Nagpur");
        Boolean city8 = getIntent().getExtras().getBoolean("Mumbai");
        Boolean city9 = getIntent().getExtras().getBoolean("Sangli");

        if(city1) 
            cities.put("city1", "Pune");
        
        if(city2) 
            cities.put("city2", "Amravati");
        
        if(city3) 
            cities.put("city3", "Ahmednagar");
        
        if(city4) 
            cities.put("city4", "Nashik");
        
        if(city5) 
            cities.put("city5", "Nanded");
        
        if (city6) 
            cities.put("city6", "Aurangabad");
        
        if(city7) 
            cities.put("city7", "Nagpur");
        
        if(city8) 
            cities.put("city8", "Mumbai");
        
        if(city9) 
            cities.put("city9", "Sangli");
        

        ListView listView = (ListView) findViewById(R.id.listview);
        DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this);
        databaseAccess.open();
        List<String> colleges = databaseAccess.getColleges((String)bundle.get("Percentage"),(String)bundle.get("Category"), cities);
        databaseAccess.close();
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, colleges);
        listView.setAdapter(adapter);
    


DatabaseAccess.java 中的函数 getColleges() 返回大学列表

public List<String> getColleges(String per, String cat, HashMap<String,String> cities) 
        List<String> list = new ArrayList<>();
        String pune = cities.get("city1");
        String amra = cities.get("city2");
        String ahmed = cities.get("city3");
        String nashik = cities.get("city4");
        String nanded = cities.get("city5");
        String aurang = cities.get("city6");
        String nagpur = cities.get("city7");
        String mumbai = cities.get("city8");
        String sangli = cities.get("city9");
        String[] vals = new String[cities.size()];
        int index = 0;
        for (Map.Entry<String, String> entry : cities.entrySet()) 
            vals[index] = entry.getValue();
            index++;
        
        if(pune == "Pune" || amra == "Amravati" || ahmed == "Ahmednagar" || nashik == "Nashik" || nanded == "Nanded" || aurang == "Aurangbad" || nagpur == "Nagpur" || mumbai == "Mumbai" || sangli == "Sangli") 
            Cursor cursor = database.rawQuery("SELECT * FROM Colleges WHERE ("+cat+" BETWEEN "+(Float.parseFloat(per)-5)+" AND " +(Float.parseFloat(per)+5)+") AND city IN (?, ?, ?, ?, ?, ?, ?, ?, ?) ORDER BY "+cat+" DESC", vals);
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) 
                list.add(cursor.getString(1));
                list.add(cursor.getString(2));
                list.add(cursor.getString(3));
                list.add(cursor.getString(4));
                if(cat.equals("Open")) 
                    list.add(cursor.getString(5));
                
                if(cat.equals("Obc")) 
                    list.add(cursor.getString(6));
                
                if(cat.equals("Sc")) 
                    list.add(cursor.getString(7));
                
                if(cat.equals("St")) 
                    list.add(cursor.getString(8));
                
                if(cat.equals("Vjnt")) 
                    list.add(cursor.getString(9));
                
                if(cat.equals("Ews")) 
                    list.add(cursor.getString(10));
                
                cursor.moveToNext();
            
            cursor.close();
        
        return list;
    

我想像下面的图片链接一样显示 Dte 代码、大学名称、位置、百分比。

LIST

【问题讨论】:

使用回收站视图:developer.android.com/guide/topics/ui/layout/recyclerview 【参考方案1】:

如果您想为 ListView 项目使用自定义视图,那么您需要创建自定义适配器。

这是一个例子:

public class BrandsListAdapter extends BaseAdapter 

    private ArrayNode _data_set;
    private Context _context;

    public BrandsListAdapter(ArrayNode dataSet, @NonNull Context context) 
        super();
        this._context = context;
        this._data_set = dataSet;
    

    public int getCount()
    
        return _data_set.size();
    

    public Object getItem(int position)
    
        return position;
    
    public long getItemId(int position)
    
        return position;
    

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 

        try 
            JsonNode list_model = _data_set.get(position);

            if(convertView == null) 
                LayoutInflater layout_inflater = LayoutInflater.from(_context);
                convertView = layout_inflater.inflate(R.layout.item_brands, parent, false);
            

            
        return convertView;
    

然后在列表所在的活动中的代码中,您可以这样做:

BrandListAdapter adapter = new BrandListAdapter(dataset, getBaseContext());

在我使用的这个适配器中:

if(convertView == null) 
            LayoutInflater layout_inflater = LayoutInflater.from(_context);
            convertView = layout_inflater.inflate(R.layout.item_brands, parent, false);
        

通过这种方式,我扩展了我之前在 res&gt;layouts 中创建的名为 item_brands 的自定义布局,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="15dp"
    android:clickable="true"
    android:focusable="true"
    android:foreground="?android:attr/selectableItemBackground"
    android:foregroundTint="@color/colorPrimary"
    android:layout_
    android:gravity="center_vertical"
    android:layout_marginEnd="@dimen/standard_layout_margin"
    android:layout_marginStart="@dimen/standard_layout_margin">

    <ImageView
       android:layout_
       android:layout_
       android:src="@drawable/ic_image"
       android:id="@+id/brand_photo"
       android:layout_centerInParent="true"
       android:scaleType="fitCenter"/>
            
</RelativeLayout>

然后在getView()CustomAdapter 中,您可以使用它来获取视图并填充您的数据:

ImageView brand_image = convertView.findViewById(R.id.brand_photo);

并像往常一样使用brand_image 或任何其他变量。为了让您获得 CardView 的外观,您可以使用以下内容:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:clickable="true"
    android:layout_gravity="center"
    android:focusable="true"
    app:cardCornerRadius="10dp"
    app:cardElevation="20dp"
    android:layout_marginStart="5dp"
    android:layout_marginEnd="5dp"
    android:foreground="?android:attr/selectableItemBackground"
    android:foregroundTint="@color/colorPrimary"
    android:layout_>

    <LinearLayout
        android:layout_
        android:layout_
        android:padding="10dp"
        android:gravity="center_vertical"
        android:orientation="vertical">

        <TextView
            android:layout_
            android:layout_
            android:textAlignment="textStart"
            android:text="SOMETEXT"
            android:layout_marginStart="5dp"
            android:textSize="@dimen/subtitle1"
            style="@style/TextAppearance.MaterialComponents.Subtitle1"
            android:textColor="@color/colorSecondary"
            android:id="@+id/tv_brand_name"/>

        <TextView
            android:layout_
            android:layout_
            android:textAlignment="textStart"
            android:text="SOMETEXT"
            android:layout_marginStart="5dp"
            android:textSize="@dimen/subtitle1"
            style="@style/TextAppearance.MaterialComponents.Subtitle1"
            android:textColor="@color/colorSecondary"
           />

        <TextView
            android:layout_
            android:layout_
            android:textAlignment="textStart"
            android:text="SOMETEXT"
            android:layout_marginStart="5dp"
            android:textSize="@dimen/subtitle1"
            style="@style/TextAppearance.MaterialComponents.Subtitle1"
            android:textColor="@color/colorSecondary"
            />
    </LinearLayout>
</androidx.cardview.widget.CardView>

所以你得到了这个:

【讨论】:

【参考方案2】:

将 CardView 与 RecyclerView 一起使用。为此,您将必须创建模型类,将数据提取到卡片中的适配器。 基本上它将是一个 For 循环,它将从 sqlite 获取记录到卡上所需的 textview 中。

【讨论】:

你能告诉我如何将数据提取到卡片中吗? @YashodeepD 我无法为您提供完整的代码。但这里是链接youtube.com/watch?v=APZlsLTcX5g 我已经为学校项目做了同样的事情。希望它能解决你的问题。 使用适配器时不需要 for 循环,因为它应该被使用。正如我所见,在他的问题中,他已经拥有有关大学的数据,现在他只需要填写意见,但他不知道该怎么做。 @YashodeepD 我在上面给了你我的答案。您实际上可以将其复制到您的代码中并进行一些小的更改以将其用于您的问题。您需要 ListAdapter 或 RecyclerView 适配器,这取决于您要使用什么。使用该适配器,您可以将数据传递到您的视图中。 @techfangirl 谢谢这对我有帮助 最后,我尝试了将近两天的回收站视图工作,然后你的推荐视频帮助了我。

以上是关于如何在运行时生成卡片视图以显示来自 Sqlite 的数据?的主要内容,如果未能解决你的问题,请参考以下文章

在运行时更新 QStackedWidget 内容

如何根据内容自动调整卡片视图的大小

如何在 Flutter 中使用 Hero 转换期间未运行的动画/动画?

如何使用光标和循环显示来自 sqlite 的片段的 recyclerview

如何在 Android Studio 中显示来自 SQLite 数据库浏览器的图像?

将数据从(设计时未知)SQLite db 动态显示到表视图