java - Android Studio:使用 ListView 显示 SQLite 数据库行的 ArrayList
问题描述
我有一个 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 创建一个适配器来显示包含数据库每一行的露营地列表中的每个露营地。
解决方案
创建一个扩展 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);
}
我希望这可以帮助你。
推荐阅读
- javascript - AngularJS输入字段复选框ng-click不触发方法
- python - 当没有任何行是唯一的时,使用 pandas 将一列分组为一个
- ios - 以编程方式快速自动布局
- android - 如何在xml中使用gradle占位符applicationId来制作唯一的contentProvider权限
- mysql - 如何获取用户 id 已经下过超过 1 个订单的订单记录
- javascript - 我想在网页中添加一些 Javascript 代码,该代码可以记录用户与网页交互时网页发出的所有网络请求和响应
- django - TemplateView 在 django get_absolute_url 中不起作用
- javascript - 浮动菜单项不起作用
- flutter - 禁用 TabBar 颤动中的滑动标签
- javascript - 如何获取单选按钮的 Javascript 警报?