Android: Listview отображает только один результат / одну строку - PullRequest
0 голосов
/ 14 ноября 2011

У меня проблема с заполнением данных из базы данных в просмотр списка.Который мой БД имеет более 1 строки, но в списке просмотра отображается только 1 результат, который является первыми данными, которые я сохраняю.Теперь мы собираемся пропустить функцию сохранения и прямо перейти к коду для адаптера.Например, я имею одну кнопку и действую как кнопка обновления.При нажатии этой кнопки будет выполнена следующая строка кода:

    button.setOnClickListener(new OnClickListener(){
          public void onClick(View v){
              refreshAdapter();
          }
    });

    public void refreshAdapter(){
         SQLiteDatabase db=null;
         String path=DBPATH+DBNAME;

         db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
         Cursor resultset = db.query("Event_Log", null, null, null, null, null,   null);

        if(resultset.getCount()>0){
           resultset.moveToFirst();             
           List<String> arl = new ArrayList<String>();              
           while(resultset.isAfterLast()==false){

              arl.add(resultset.getString(6).toString() + "\n" +  resultset.getString(3).toString() 
                                + " " + resultset.getString(4).toString() 
                                + "@@" + resultset.getString(1).toString());                    
                        resultset.moveToNext();                         
                    }               
             Toast.makeText(refView.getContext(), "arl size " + arl.size() + " arl value " + arl, Toast.LENGTH_LONG).show();
             lView = (ListView) findViewById(R.id.personList);
             lView.setAdapter(new PersonAdapter(getApplicationContext(), arl));
    }
}

- вот мой адаптер

import java.util.List;
import android.content.Context;
import android.graphics.Color;
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 final Context context;
    private final List<String> list;
    private TextView descHolder;
    private ImageView typeHolder; 

    public PersonAdapter(Context c, List<String> list){
        super(c, R.layout.person_adapter, list);
        this.context = c;
        this.list = list;                               
    }

    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    public View getView(int position, View convertview, ViewGroup group){               
            if(convertview==null){
                LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertview = inf.inflate(R.layout.person_adapter, null);
                descHolder = (TextView) convertview.findViewById(R.id.personDescLbl);
                typeHolder = (ImageView) convertview.findViewById(R.id.presonCategoryImage);
            }           

            String[]  textSplit = list.get(position).toString().split("@@");
            descHolder.setText(textSplit[0]);
            if(position%2==0){
                descHolder.setBackgroundColor(Color.parseColor("#badce8"));
            }else{
                descHolder.setBackgroundColor(Color.parseColor("#f7f7f7"));
            }

            String category = textSplit[1];                     
            if(category.equals("Male")){
                typeHolder.setImageResource(R.drawable.maleicon);
            }else{
                typeHolder.setImageResource(R.drawable.female_icon);
            }                   
        return convertview;
    }
}

Мой макет person_adapter

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  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"
        android:textColor="#000000"
        android:textSize="20dp"/>
     <ImageView 
        android:id="@+id/personCategoryImage"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>          
</LinearLayout>

Onclick ofНа кнопке я также поставил функцию Toast и отобразил значение / размер массива, он поднял точное значение, как в БД, только в адаптере он отображает первые сохраненные данные.Пожалуйста, ведите меня.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2011

Проверьте, не превышает ли ваш размер списка больше одного, и какие значения списка вы получили внутри представления.

0 голосов
/ 14 ноября 2011

Я не уверен, что ваш код больше не имеет проблем, но вот большая: в вашем getView descHolder и typeHolder будут иметь правильное значение, только если convertView равен нулю.Вот как ваш getView должен выглядеть (не проверено), используя шаблон ViewHolder:

public View getView(int position, View convertview, ViewGroup group){               
        ViewHolder vh;

        if(convertview==null){
            LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertview = inf.inflate(R.layout.person_adapter, null);
            vh = new ViewHolder();
            vh.descHolder = (TextView) convertview.findViewById(R.id.personDescLbl);
            vh.typeHolder = (ImageView) convertview.findViewById(R.id.presonCategoryImage);
            convertview.setTag(vh);
        } else {
            vh = (ViewHolder)convertview.getTag();
        }

        String[] textSplit = list.get(position).toString().split("@@");
        vh.descHolder.setText(textSplit[0]);
        if(position%2==0){
            vh.descHolder.setBackgroundColor(Color.parseColor("#badce8"));
        }else{
            vh.descHolder.setBackgroundColor(Color.parseColor("#f7f7f7"));
        }

        String category = textSplit[1];                     
        if(category.equals("Male")){
            vh.typeHolder.setImageResource(R.drawable.maleicon);
        }else{
            vh.typeHolder.setImageResource(R.drawable.female_icon);
        }                   
    return convertview;
}

, где ViewHolder - это просто внутренний класс вашего адаптера:

class ViewHolder {
    public TextView descHolder;
    public ImageView typeHolder;
}

У меня нетпроверил ваш код на наличие других проблем, но это должно дать вам место для начала.

...