#android #sqlite #listview #adapter
#Android #sqlite #listview #адаптер
Вопрос:
прямо сейчас я пытаюсь открыть базу данных, используя
db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
Cursor resultset = db.query("person_table", null, null, null, null, null, null);
итак, я использую курсор, чтобы получить каждый из результирующих наборов, возвращаемых запросом к БД. Каждый возвращаемый результат из результирующего набора я добавляю в массив для просмотра в ListView. Ниже приведен мой код для извлечения данных из базы данных
package com.android.my.mypackage;
import android.app.ListActivity;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.Cursor;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class personDetail extends ListActivity{
private static String DBPATH="data/data/com.android.my.mypackage/databases/";
private static String DBNAME="persondb.db";
private View refView;
public ListView personlist;
public personDetail(View v, ListView l){
refView = v;
personlist = l;
}
public void DisplayPersonDetail(){
SQLiteDatabase db=null;
String path=DBPATH DBNAME;
db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
Cursor resultset = db.query("person_table", null, null, null, null, null, null);
if(resultset.getCount()==0){
/*please ignore this block*/
}else{
resultset.moveToFirst();
List<String> arl = new ArrayList<String>();
while(resultset.isAfterLast()==false){
arl.add(resultset.getString(6).toString() "@@" resultset.getString(1).toString());
resultset.moveToNext();
}
//Toast.makeText(refView.getContext(), "Arl value " arl, Toast.LENGTH_LONG).show();
personlist.setAdapter(new PersonAdapter(this, arl));
}
}
}
А ниже приведен класс PersonAdapter
package com.android.my.mypackage;
import java.util.List;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.ImageView;
public class PersonAdapter extends ArrayAdapter<String>{
private static Activity context;
private final List<String> list;
public PersonAdapter(Activity c, List<String> list){
super(context, R.layout.person_adapter, list);
this.context = c;
this.list = list;
}
static class ViewHolder{
private TextView descHolder;
private ImageView typeHolder;
}
public View getView(int position, View convertview, ViewGroup group){
ViewHolder holder;
View lView = convertview;
if(lView==null){
LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
lView = inf.inflate(R.layout.person_adapter, group, true);
holder = new ViewHolder();
holder.descHolder = (TextView) lView.findViewById(R.id.personDescLbl);
holder.typeHolder = (ImageView) lView.findViewById(R.id.personCategoryImage);
}else{
holder = (ViewHolder) lView.getTag();
}
holder.descHolder.setText(list.get(position).toString().split("@@")[0]);
String category = list.get(position).toString().split("@@")[1];
if(category.equals("Male")){
holder.typeHolder.setImageResource(R.drawable.male);
}else{
holder.typeHolder.setImageResource(R.drawable.female);
}
return lView;
}
}
и мой макет person_adapter для расширения в виде списка
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@ id/personDescLbl"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"/>
<ImageView
android:id="@ id/personCategoryImage"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
Мой код основан на руководстве с этого сайта. Но я получаю ошибку исключения Nullpointer в классе PersonAdapter, на который указано
super(context, R.layout.person_adapter, list);
Перед этим я отображаю результирующий набор, используя table layout, и это рабочий find. Но на практике нецелесообразно использовать макет таблицы для отображения большого объема данных, поскольку это требует времени и памяти. Поэтому, пожалуйста, помогите мне создать адаптер ListView. Спасибо.
Комментарии:
1. возможно ли добавить Logcat сюда? Я полагаю, вы подтвердили, что список<String>, который вы передали PersonAdapter, не равен null?
Ответ №1:
В вашем PersonAdapter
вашем context
поле находится null
при вызове super
конструктора. Вы инициализируете его только во второй строке. Вы должны передать действие в качестве первого параметра super
(вы его вызвали c
), а затем повлиять на ваше context
поле.
public class PersonAdapter extends ArrayAdapter<String>{
private static Activity context;
...
public PersonAdapter(Activity c, List<String> list){
super(c, R.layout.person_adapter, list);
this.context = c;
this.list = list;
}