Привязка данных курсора к макету не в списке - PullRequest
5 голосов
/ 14 февраля 2012

Я пишу экран, который отображает информацию о количестве строк из БД. По сути, это фрагмент данных, который представляет информацию, относящуюся к одной «строке» в таблице. Я хочу понять, как лучше всего связывать данные из курсора (одной уникальной строки таблицы) с макетом текстовых представлений, флажков и т. Д.

Является ли AdapterView билетом?

@ ДжоМалин предложил:

Затем напишите адаптер между курсором и массивом текстовых представлений.

Что сводится к моему вопросу. Как правильно подключить ряд текстовых представлений к курсору?

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

Если вы хотите выполнить обработку некоторых данных курсора, прежде чем перемещать их в текстовые представления, то вы выходите за рамки шаблона адаптера, который предполагает, что «преобразование» формы структуры данных в другую структуру данных без какой-либо промежуточной обработки. Преимущество адаптера состоит в том, что для двух структур данных A и B, связанных адаптером, предполагается, что B автоматически изменяется при каждом изменении A.

Конечно, вы можете переопределить идею адаптера для вставки своей собственной промежуточной операции, такой как преобразование дат, или . Вы можете сделать преобразование аспектом представления, отображающего данные. Я предполагаю, что «обработка» - это действительно форматирование, которое вы делаете для целей отображения. Это атрибут текстового представления, а не данные; напишите что-нибудь, что расширяет текстовое представление и преобразовывает даты по мере необходимости. Затем напишите адаптер между курсором и массивом текстовых представлений.

1 голос
/ 03 апреля 2012

Я недавно реализовал свой собственный класс адаптера данных, который может быть в Ball Ball.

public class NoteImageDataAdapter {

private final View mMainView;
private Cursor mCursor;
private ViewHolder holder;
private ContentObserver mContentObserver;

public static class ViewHolder {
    public TextView title;
    public TextView text;
    public ImageView image;
}

public NoteImageDataAdapter(View mainView, Cursor c) {
    if (mainView == null) {
        throw new IllegalArgumentException("View mainView cannot be null");
    }

    if (c == null) {
        throw new IllegalArgumentException("Cursor c cannot be null");
    }
    mMainView = mainView;
    mCursor = c;

    holder = new ViewHolder();
    holder.title = (TextView) mMainView.findViewById(R.id.title);
    holder.text = (TextView) mMainView.findViewById(R.id.text);
    holder.image = (ImageView) mMainView.findViewById(R.id.myImageView);

    mContentObserver = new ImageNoteContentObserver(new Handler());
    mCursor.registerContentObserver(mContentObserver);
    bindView();
}

class ImageNoteContentObserver extends ContentObserver {

    public ImageNoteContentObserver(Handler handler) {
        super(handler);
    }

    @Override
    public boolean deliverSelfNotifications() {
        return true;
    }

    @Override
    public void onChange(boolean selfChange) {
        Log.d("NoteImageDataAdapter", "ImageNoteContentObserver.onChange( "
                + selfChange + ")");
        super.onChange(selfChange);
        mCursor.requery();
        bindView();
    }
}

public void bindView() {
    Log.d("NoteImageDataAdapter", "bindView");
    mCursor.moveToFirst();

    holder.text.setText(Note.getText(mCursor));
    holder.title.setText(Note.getTitle(mCursor));

    Uri imageUri = Note.getImageUri(mCursor);
    if (imageUri != null) {
        assignImage(holder.image, imageUri);
    } else {
        Drawable d = Note.getImageThumbnail(mCursor);
        holder.image.setImageDrawable(d);
        holder.image.setVisibility(View.VISIBLE);
    }
}

private static final int MAX_IMAGE_PIXELS = 1024*512;

private void assignImage(ImageView imageView, Uri imageUri){
    if (imageView != null && imageUri != null){

        ContentResolver cr = imageView.getContext().getContentResolver();

        Display display = ((WindowManager) imageView.getContext()
                .getSystemService(Context.WINDOW_SERVICE))
                .getDefaultDisplay();
        int width = (int) (display.getWidth() * 0.9);
        int height = (int) (display.getHeight() * 0.9);

        int minSideLength = Math.min(height, width);

        Bitmap b = Util.makeBitmap(minSideLength, MAX_IMAGE_PIXELS, imageUri, cr, false);

        if (b == null){
            b = Util.makeBitmap(minSideLength, MAX_IMAGE_PIXELS/2, imageUri, cr, false);                
        }
        if (b != null){
            imageView.setImageBitmap(b);
            imageView.setAdjustViewBounds(true);
            imageView.setVisibility(View.VISIBLE);
        }   
    }   
}

}

и в вашей деятельности

private NoteImageDataAdapter mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.note_image_view_layout);

    wireDataAdapter();       
}

private void wireDataAdapter() {
    final String[] COLUMNS = new String[] { 
            Note.Columns.TITLE,
            Note.Columns.TEXT,
            Note.Columns.IMAGE_URI, 
            Note.Columns.IMAGE_THUMBNAIL,
            Note.Columns._ID };

    // the uri for the note row
    Uri contentUri = getIntent().getData();
    Cursor cur = managedQuery(contentUri, COLUMNS, null, null, null);

    View mainLayout = this.findViewById(R.id.noteImageViewLayout);
    mAdapter = new NoteImageDataAdapter(mainLayout, cur);
}
0 голосов
/ 14 февраля 2012

От активности использования:

Adpater adapter = new Adapter(Activity.this or context , Cursor);
setListAdapter(adapter) in case of List Activity;

В противном случае

listViewObj.setAdpater(adapter)   

открытый класс CustomCursorAdapter расширяет CursorAdapter {

 private LayoutInflater mInflater;
 private Context activityContext;

 private ViewHolder holder;

 public ContactsAdapter(Context aContext,Cursor cursor) {
        super(mContext, cursor);
        mInflater = LayoutInflater.from(mContext); 
        activityContext = aContext;

    }  

 public static class ViewHolder{
     public TextView textView1;
     // View Group on Row inflate lyaout that need to be used
     public ImageView imageView;
   }

 @Override
 public void bindView(View v, Context context, Cursor c) { 
  holder=(ViewHolder)v.getTag();

 }


 @Override
 public View newView(Context context, Cursor cursor, ViewGroup parent) {
  final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.item_inflate_layout, parent, false);  

        holder = new ViewHolder();
     holder.textView1 = (TextView) v.findViewById(R.id.TEXTVIEW1);
  // Other Id that need to be used and are available on item_inflate_layout
     holder.imageView = (ImageView) v.findViewById(R.id.IMAGEVIEW);
     v.setTag(holder);     
  bindView(v, context, cursor);
        return v;  
 }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...