Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio:使用ListView显示SQLite数据库行的ArrayList_Java_Android_Sqlite_Listview - Fatal编程技术网

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

Java Android Studio:使用ListView显示SQLite数据库行的ArrayList,java,android,sqlite,listview,Java,Android,Sqlite,Listview,我有一个SQLite数据库,我想使用ListView显示每一行/营地 返回营地ArrayList的DBHandler方法: public ArrayList<Campsite> getAllCampsites() { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CAMPSITES, null); Arra

我有一个SQLite数据库,我想使用ListView显示每一行/营地

返回营地ArrayList的DBHandler方法:

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;
}
公共阵列列表getAllCampsites(){ SQLiteDatabase db=this.getReadableDatabase(); Cursor Cursor=db.rawQuery(“选择*自”+表_营地,空); ArrayList营地=新建ArrayList(); 营地营地; if(cursor.getCount()>0){ 对于(int i=0;i 我有一个名为Browse的活动,它在布局文件中包含ListView。我还有一个browse_row_布局,它有一排/营地的布局

因此,在Browse.java中,我需要创建适配器来显示每个营地。 注意:我仅在列表视图中显示3个特定列(名称、城市、特征)

因此,我有一个activity_browse布局文件,它有实际的ListView元素,还有一个browse_row_布局,它代表数据库的一行,并且只有3列的textview

到目前为止,我所拥有的:

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();

}
导入android.os.Bundle;
导入android.widget.ListView;
导入androidx.appcompat.app.appcompat活动;
导入java.util.ArrayList;
公共类浏览扩展AppCompatActivity{
ListView露营地;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u浏览);
lvCampsites=findviewbyd(R.id.lvCampsites);
DatabaseHandler db=新的DatabaseHandler(此);
ArrayList campsites=db.getAllCampsites();
}
}


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

您需要首先移动光标。请参阅以下代码:

                         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);
                        }

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

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;
    }
 }
公共类营地Stadapter扩展BaseAdapter{
私有上下文;
私有数组列表;
公共营地静态适配器(上下文mContext,列出国家/地区){
this.mContext=mContext;
该列表=国家;
}
@凌驾
public int getCount(){
返回list.size();
}
@凌驾
公共对象getItem(int位置){
返回列表。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=视图。充气(mContext,R.layout.campsite\u layout,null);
TextView name=(TextView)view.findViewById(R.id.nametxt);
Textview城市=(Textview)view.findViewById(R.id.cityText);
Textview功能=(Textview)view.findViewById(R.id.featuretxt);
name.setText(list.get(position.getname());
city.setText(list.get(position.getcity());
feature.setText(list.get(position.getfeature());
返回视图;
}
}
这是您的listview活动

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);
}
导入android.os.Bundle;
导入android.widget.ListView;
导入androidx.appcompat.app.appcompat活动;
导入java.util.ArrayList;
公共类浏览扩展AppCompatActivity{
ListView露营地;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u浏览);
lvCampsites=findviewbyd(R.id.lvCampsites);
DatabaseHandler db=新的DatabaseHandler(此);
ArrayList campsites=db.getAllCampsites();
//自定义适配器的实例
CampsitesListAdapter=新的CampsitesListAdapter(此为露营地);
//将适配器设置为listview
lvCampsites.setAdapter(适配器);
}

我希望这可能会对你有所帮助。

这可能会对你有所帮助。当你可以使用RecycleServiceWn时,是否有任何特定的需要使用listview?没有特定的需要,我已经读过。它会改变我显示数据的方式吗?你的数据没有什么特别的,只需要使用你在谷歌上找到的任何自定义listview适配器教程。另外,请使用
android studio
仅为IDE特定的问题标记。谢谢,关于使用适配器在listview中显示它的想法?@Override public View getView(int position,View convertView,ViewGroup parent){LayoutFlater inflater=(LayoutFlater)context.getSystemService(context.LAYOUT\u inflater\u SERVICE);View View=inflater.inflate(R.layout.campsite_layout,parent,false);return view;}像上面那样更改getView()方法并绑定视图和设置文本感谢我能够通过将每个campsite对象添加到arraylist中、设置自定义列表适配器,以及使用campsite campsite=(campsite)在setOnItemClickListner()中获取每个campsiteparent.getItemAtPosition(位置);很抱歉,但我实际上如何在我的ListView活动中实现这一点?首先为adapter创建一个单独的类,然后在ListView活动中创建adapter类的实例,并将营地的arraylist传递给adapter的构造函数和上下文,然后将adapter设置为ListView。我已经编辑了答案我想这可能会对你有所帮助。是的,我刚才能够成功地做到这一点,谢谢。现在我真的想添加一个新的监听器,让它变得如此w