Пользовательский CursorAdapter не заполняет ListView - PullRequest
0 голосов
/ 29 октября 2011

Когда я запускаю свою деятельность, у которой есть представление списка, которое я пытаюсь заполнить, оно отображается как пустое.Тем не менее, в logcat я вижу, что пользовательский CursorAdapter проходит через мои данные и возвращает по крайней мере некоторые представления.

    public class JobAdapter extends CursorAdapter {

private String status;
private static final String tag ="TESTING CursorAdapter";

public JobAdapter(Context context, Cursor cur, boolean autoRequery, String s) {
    super(context, cur, autoRequery);
    Log.d(tag, "Job adapter create");
    status = s;
}

@Override
public void bindView(View row, Context context, Cursor cursor) {
    Log.d(tag, "Starting a bind");
    Cursor c = getCursor();
    if(!c.isClosed()){  
        TextView companyName = (TextView) row.findViewById(R.id.listCompanyName);
        TextView positionTitle = (TextView) row.findViewById(R.id.listPositionTitle);


        while(!c.isLast() && !c.getString(c.getColumnIndex(JobsDbAdapter.KEY_STATUS)).equalsIgnoreCase(status)){
            Log.d(tag, "bind - moving c to next 1");
            c.moveToNext();
        }

        if(c.getString(c.getColumnIndex(JobsDbAdapter.KEY_STATUS)).equalsIgnoreCase(status)){
            Log.d(tag, "found a status and trying to populate the view");
            companyName.setText(c.getString(c.getColumnIndex(JobsDbAdapter.KEY_COMPANY)));
            positionTitle.setText(c.getString(c.getColumnIndex(JobsDbAdapter.KEY_POSITION)));

            Log.d(tag, "Company name = "+c.getString(c.getColumnIndex(JobsDbAdapter.KEY_COMPANY)));

            if(c.isLast()) {
                Log.d(tag, "bind - Closing c 1");
                c.close();
            }else {
                Log.d(tag, "bind - moving c to next 2");
                c.moveToNext();
            }
         }
    }
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    Cursor c = getCursor();
    Log.d(tag, "Starting a new");
    final LayoutInflater inflater = LayoutInflater.from(context);
    View row = inflater.inflate(R.layout.job_list_item, parent, false);

    if(!c.isClosed()){  
        TextView companyName = (TextView) row.findViewById(R.id.listCompanyName);
        TextView positionTitle = (TextView) row.findViewById(R.id.listPositionTitle);

        while(!c.isLast() && !c.getString(c.getColumnIndex(JobsDbAdapter.KEY_STATUS)).equalsIgnoreCase(status)){
            Log.d(tag, "new - moving c to next 1");
            c.moveToNext();
        }

        if(c.getString(c.getColumnIndex(JobsDbAdapter.KEY_STATUS)).equalsIgnoreCase(status)){
            Log.d(tag, "new - found a status and trying to populate the view");
            companyName.setText(c.getString(c.getColumnIndex(JobsDbAdapter.KEY_COMPANY)));
            positionTitle.setText(c.getString(c.getColumnIndex(JobsDbAdapter.KEY_POSITION)));

            if(c.isLast()) {
                Log.d(tag, "new - Closing c 1");
                c.close();
            }else {
                Log.d(tag, "new - moving c to next 2");
                c.moveToNext();
            }

    }
    Log.d(tag, "new - returning row");
    return row;
}

}

Должен ли я проверять, достиг ли курсор конца базы данных?Или это будет обработано для меня?

Мой класс, который использует этот адаптер, просто

    public class AppliedForActivity extends ListActivity {

private JobsDbAdapter mDbHelper;

public void onCreate(Bundle savedInstanceState) {
    Log.d("TESTING C", "STARTING THE APPLIED FOR ACTIVITY");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.job_list);
    mDbHelper = new JobsDbAdapter(this);
    mDbHelper.open();
    Cursor c = mDbHelper.fetchAllJobs();
    setListAdapter(new JobAdapter(this, c, false, "applied for"));
}

}

Пожалуйста, извините за фигурные скобки, возможно, я скопировал неправильно.

1 Ответ

1 голос
/ 29 октября 2011

Идея CursorAdapter состоит в том, чтобы инкапсулировать все позиции из вашего кода и оставить только визуализацию для вас.То есть вам не нужно использовать moveToNext и другие методы позиционирования.

Как я вижу в вашем коде, вы пытаетесь реализовать некоторую фильтрацию.Но идея работы с базой данных состоит в том, чтобы сформулировать ваши критерии в запросе SQL.Вместо того чтобы запрашивать ВСЕ задания, вы должны выбрать только те, которые должны отображаться в ListView.

bindView и newView должны работать только с текущей записью, на которую указывает курсор, и никогда не должны вызывать moveToNext или close.Кроме того, CursorAdapter предполагает, что ваш курсор имеет целочисленное поле с именем _id.

См. Также здесь и там .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...