Android: элемент ListView с textview и изображением, основанный на результате запроса к базе данных

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