Android переопределяет проблемы newView () и bindView () - PullRequest
0 голосов
/ 28 марта 2012

Вот мой пользовательский простой адаптер курсора:

public MySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, 
        int[] to, int flags) {
    super(context, layout, c, from, to, 0);
    this.mContext = context;
    mInflater = LayoutInflater.from(context);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = mInflater.inflate(R.layout.row, parent, false);

    return view;
}

@Override
public void bindView(View view, Context context, Cursor c) {

    TextView rowView = (TextView) view.findViewById(R.id.row);
    ImageView rowImg = (ImageView) view.findViewById(R.id.img);

    String img = null;
    String row = null;

    if (c != null) {
        img = c.getString(c.getColumnIndex(Db.TABLE_IMG));
        row = c.getString(c.getColumnIndex(Db.TABLE_TITLE));
    }

    if (img != null) rowImg.setImageResource(R.drawable.smiley);
    else img.setImageResource(0);

    rowView.setText(row);

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    String[] from = new String[] { ... };
    int[] to = new int[] { ... };
            ... 
    getLoaderManager().initLoader(0, null, this);

    mAdapter = new MySimpleCursorAdapter(this, R.layout.row, null, from,
            to, 0);
    setListAdapter(mAdapter);


public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = { Db.TABLE_ID,
            Db.TABLE_TITLE };

    CursorLoader c = new CursorLoader(this,
            MyProvider.CONTENT_URI, projection, null, null, null);
    return c;
}

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    mAdapter.swapCursor(data);
}

public void onLoaderReset(Loader<Cursor> loader) {
    mAdapter.swapCursor(null);
}

Ошибка при заполнении ListView:

java.lang.IllegalStateException: Не удалось прочитать строку 0col -1 из CursorWindow.Убедитесь, что курсор инициализирован правильно, прежде чем получить доступ к данным из него.

1 Ответ

1 голос
/ 29 марта 2012

Ваша проекция {Db.TABLE_ID, Db.TABLE_TITLE} отличается от значений, которые вы пытаетесь получить Db.TABLE_IMG и Db.TABLE_TITLE.Поскольку вы не запрашиваете Db.TABLE_IMG, когда пытаетесь получить к нему доступ через адаптер, он не будет существовать (что приводит к ошибке).Измените ваш прогноз на Db.TABLE_IMG, и эта ошибка должна исчезнуть

...