Проблема с пользовательским SimpleCursorAdapter - PullRequest
0 голосов
/ 15 января 2012

Я пытаюсь заполнить сетку, используя данные из курсора БД, используя пользовательский SimpleCursorAdapter.У моего курсора есть данные (я проверил), но в GridView ничего не отображается, а метод getView () даже не вызывается.

Кто-нибудь может помочь?Почему не вызывается getView ()?

Спасибо

Активность

dbAdapter = new DBAdapter(this);    
dbAdapter.open();

Cursor c;
c = dbAdapter.fetchPCList();
startManagingCursor(c);     

String[] from = new String[] {};
int[] to = new int[] {};

GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new PCIconAdapter(this, R.layout.pc_icon, c, from, to));

c.close();
dbAdapter.close();

Адаптер

public class PCIconAdapter extends SimpleCursorAdapter {
    private final Context mContext;
    private final int mLayout;
    private final Cursor mCursor;
    private final int mPCIDIndex;
    private final int mClassNameIndex;
    private final LayoutInflater mLayoutInflater;

    private final class ViewHolder {
        public TextView pc_id_view;
        public TextView clas_name_view;
    }

    public PCIconAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);

        this.mContext = context;
        this.mLayout = layout;
        this.mCursor = c;
        this.mPCIDIndex = mCursor.getColumnIndex(DBAdapter.KEY_PC_LM_ID);
        this.mClassNameIndex = mCursor.getColumnIndex(DBAdapter.KEY_PC_CLAS_NAME);
        this.mLayoutInflater = LayoutInflater.from(mContext);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        if (mCursor.moveToPosition(position)) {
            ViewHolder viewHolder;

            if (convertView == null) {
                convertView = mLayoutInflater.inflate(mLayout, null);

                viewHolder = new ViewHolder();
                viewHolder.pc_id_view = (TextView) convertView.findViewById(R.id.pc_id);
                viewHolder.clas_name_view = (TextView) convertView.findViewById(R.id.clas_name);

                convertView.setTag(viewHolder);
            }
            else {
                viewHolder = (ViewHolder) convertView.getTag();
            }

            String pc_id = mCursor.getString(mPCIDIndex);
            String clas_name = mCursor.getString(mClassNameIndex);

            viewHolder.pc_id_view.setText(pc_id);
            viewHolder.clas_name_view.setText(clas_name);
        }

        return convertView;
    }
}

Ответы [ 4 ]

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

У меня была такая же проблема.Я использовал ArrayAdapter, а затем перешел на SimpleCursorAdapter, но он ничего не показывает на экране.

Я удалил

c.close();
dbAdapter.close();

, и теперь он работает нормально.

0 голосов
/ 15 января 2012

Ваш массив имен столбцов и массив Views пуст.Поэтому сопоставление имени столбца с представлениями никогда не произойдет.Возможно, это причина того, что вы не получаете обратный вызов в getView

0 голосов
/ 16 января 2012

Если я уберу

c.close();
dbAdapter.close();

это работает ...

Так, где я должен закрыть этот курсор? ...

0 голосов
/ 15 января 2012

, поскольку у CursorAdapter нет метода getView.у него есть метод newView.так расширяйте SimpleCursorAdapter и overRide newWiev и другие методы, такие как

public class ContactListCursorAdapter extends SimpleCursorAdapter implements Filterable {

    private Context context;

    private int layout;

    public ContactListCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);
        this.context = context;
        this.layout = layout;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        Cursor c = getCursor();

        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(layout, parent, false);

        int nameCol = c.getColumnIndex(People.NAME);

        String name = c.getString(nameCol);

        /**
         * Next set the name of the entry.
         */     
        TextView name_text = (TextView) v.findViewById(R.id.name_entry);
        if (name_text != null) {
            name_text.setText(name);
        }

        return v;
    }

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

        int nameCol = c.getColumnIndex(People.NAME);

        String name = c.getString(nameCol);

        /**
         * Next set the name of the entry.
         */     
        TextView name_text = (TextView) v.findViewById(R.id.name_entry);
        if (name_text != null) {
            name_text.setText(name);
        }
    }

    @Override
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
        if (getFilterQueryProvider() != null) { return getFilterQueryProvider().runQuery(constraint); }

        StringBuilder buffer = null;
        String[] args = null;
        if (constraint != null) {
            buffer = new StringBuilder();
            buffer.append("UPPER(");
            buffer.append(People.NAME);
            buffer.append(") GLOB ?");
            args = new String[] { constraint.toString().toUpperCase() + "*" };
        }

        return context.getContentResolver().query(People.CONTENT_URI, null,
                buffer == null ? null : buffer.toString(), args, People.NAME + " ASC");
    }
}
...