Android Studio:使用 ListView 显示 SQLite 数据库行的 ArrayList

Posted

技术标签:

【中文标题】Android Studio:使用 ListView 显示 SQLite 数据库行的 ArrayList【英文标题】:Android Studio: Display ArrayList of SQLite database rows using ListView 【发布时间】:2020-01-27 09:01:08 【问题描述】:

我有一个 SQLite 数据库,我想使用 ListView 显示每个 ROW/Campsite。

DBHandler 方法返回营地的 ArrayList:

public ArrayList<Campsite> getAllCampsites() 
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CAMPSITES, null);
    ArrayList<Campsite> campsites = new ArrayList<>();
    Campsite campsite;
    if (cursor.getCount() > 0) 
        for (int i = 0; i < cursor.getCount(); i++) 
            cursor.moveToNext();
            campsite = new Campsite();
            campsite.setName(cursor.getString(1));
            campsite.setCity(cursor.getString(2));
            campsite.setFeature(cursor.getString(3));
            campsite.setFavorite(cursor.getString(4));
            campsite.setRating(cursor.getInt(5));
            campsite.setLatitude(cursor.getDouble(6));
            campsite.setLongitude(cursor.getDouble(7));

            campsites.add(campsite);
        
    
    cursor.close();
    db.close();
    return campsites;

我有一个名为 Browse 的活动,它在布局文件中有 ListView。我还有一个browse_row_layout,它具有一行/露营地的布局。

所以在 Browse.java 中我需要创建适配器来显示每个露营地。 注意:我只在列表视图中显示 3 个特定列(名称、城市、功能)

所以我有 activity_browse 布局文件,它具有实际的 ListView 元素和代表数据库的 1 行的browse_row_layout,并且只有 3 列的 TextViews。

到目前为止我所拥有的:

import android.os.Bundle;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;

public class Browse extends AppCompatActivity 

ListView lvCampsites;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_browse);

    lvCampsites= findViewById(R.id.lvCampsites);

    DatabaseHandler db = new DatabaseHandler(this);
    ArrayList<Campsite> campsites = db.getAllCampsites();


TLDR:如何使用 ListView 创建一个适配器来显示包含数据库每一行的露营地列表中的每个露营地。

【问题讨论】:

这可能会有所帮助guides.codepath.com/android/… 有什么具体的需要用listview,什么时候可以用RecyclerView 没有特殊需要,不过我读过它。它会改变我显示数据的方式吗? 您的数据没有什么特别之处,只需使用您在 google 上找到的任何 自定义列表视图适配器 教程即可。 另外,请使用android-studio 标签仅针对特定于 IDE 的问题。 【参考方案1】:

创建一个扩展 BaseAdapter 的自定义适配器类,然后实现方法,然后在 getView 方法中将布局 id 传递给视图,以便您可以访问布局文件中的文本视图。

public class CampsitesListAdapter extends BaseAdapter 

    private Context mContext;
    private ArrayList<Campsites> list;

    public CampsitesListAdapter(Context mContext , List<Campsites> countries) 
        this.mContext = mContext;
        this.list = countries;
    

    @Override
    public int getCount() 
        return list.size();
    

    @Override
    public Object getItem(int position) 
        return list.get(position);
    

    @Override
    public long getItemId(int position) 
        return position;
    

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

        View view = View.inflate(mContext, R.layout.campsite_layout , null );
        TextView name = (TextView) view.findViewById(R.id.nametxt);
        Textview city = (Textview) view.findViewById(R.id.citytxt);
        Textview feature = (Textview) view.findViewById(R.id.featuretxt);

        name.setText(list.get(position).getname());
        city.setText(list.get(position).getcity());
        feature.setText(list.get(position).getfeature());

        return view;
    
 

这是您的列表视图活动

import android.os.Bundle;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;

public class Browse extends AppCompatActivity 

ListView lvCampsites;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_browse);

    lvCampsites= findViewById(R.id.lvCampsites);

    DatabaseHandler db = new DatabaseHandler(this);
    ArrayList<Campsite> campsites = db.getAllCampsites();

    //Instance of custom adapter 
    CampsitesListAdapter adapter = new CampsitesListAdapter(this ,   campsites);
   //Setting adapter to listview
   lvCampsites.setAdapter(adapter);

希望对你有所帮助。

【讨论】:

很抱歉,我将如何在我的 ListView 活动中实际实现这一点? 首先为适配器创建一个单独的类,然后在您的列表视图活动中创建适配器类的实例并将露营地的数组列表传递给适配器的构造函数和上下文,然后将适配器设置为您的列表视图。 好吧,我已经编辑了答案,我认为这可能会对您有所帮助。 是的,我刚才成功了,谢谢。现在我实际上想添加一个 onItemClickListener 并使其在单击特定行时打开一个新活动,该活动显示所有 7 列而不是该特定行的 3 列。这可能吗?所以基本上它会根据点击的露营地显示有关露营地的更多详细信息。 是的,点击监听只需添加 lvCampsites.setOnItemClickListener();【参考方案2】:

您需要先移动光标。参考以下代码:

                         if (cursor!=null && cursor.getCount()> 0)
                            cursor.moveToFirst();
                            do
                                Campsite campsite = new Campsite();
                                campsite.setName(cursor.getString(1));
                                campsite.setCity(cursor.getString(2));
                                campsite.setFeature(cursor.getString(3));
                                campsite.setFavorite(cursor.getString(4));
                                campsite.setRating(cursor.getInt(5));
                                campsite.setLatitude(cursor.getDouble(6));
                                campsite.setLongitude(cursor.getDouble(7));

                                campsites.add(campsite);

                            while(cursor.moveToNext);
                        

【讨论】:

谢谢,关于使用适配器在列表视图中显示它有什么想法吗? @Override public View getView(int position, View convertView, ViewGroup parent) LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);查看视图 = inflater.inflate(R.layout.campsite_layout , parent,false);返回视图;像上面一样改变你的 getView() 方法并绑定视图并设置文本 谢谢,我可以通过将每个露营地对象添加到 arraylist、设置自定义列表适配器并使用 Campsite campsite = (Campsite) parent.getItemAtPosition(位置);

以上是关于Android Studio:使用 ListView 显示 SQLite 数据库行的 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

Android——ViewHolder的作用与用法

android studio 怎么用arr

列表视图在android中不起作用

android studio冲突对比怎么用

android studio 代码出现删除线如何更换

第三章:使用 Android Studio 编程[Learn Android Studio 汉化教程]