Android SimpleCursorAdapter с ImageView и TextViews

Я делаю приложение для Android, в котором мне нужно отображать записи списка из моей базы данных. Однако фотографии, которые я назвал чертежами, и присвоили им массив. Как я могу отображать фотографии в ImageView с помощью SimpleCursorAdapter?

Вот что я пробовал до сих пор:

    static final int[] imgs = {
        R.drawable.dinaretreat, // 0
        R.drawable.cobterrace, // 1
        R.drawable.ventassostreet, // 2
        R.drawable.summerhillblvddrouin, // 3
        R.drawable.todmanstreetdrouin, // 4
        R.drawable.aqueductroad // 5
};

    private DBHelper dbHelper;
SimpleCursorAdapter dataAdapter;
Cursor cursor;

Button back, filter;
TextView highest, lowest, location;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewhouseandland);

    initControls();

    displayRecords();
}

private void displayRecords() {
    // TODO displayRecords
    // TODO CheckDBConnection
    checkDatabaseConnection();

    // TODO 
    cursor = dbHelper.getAllHouses();


    // The desired columns to be bound
    String[] columns = new String[] {
      DBHelper.KEY_HOUSE,
      DBHelper.KEY_PRICE
    };

    // the XML defined views which the data will be bound to
    int[] to = new int[] {
      R.id.image,
      R.id.text1,
      R.id.text2
    };

    // create the adapter using the cursor pointing to the desired data
    //as well as the layout information
    dataAdapter = new SimpleCursorAdapter(
      this, R.layout.listrow,
      cursor,
      columns,
      to,
      0);

    lv.setAdapter(dataAdapter);

}

Мне трудно отображать изображения в моем списке. Есть идеи? Буду рад вашей помощи. Спасибо.


person neknek mouh    schedule 29.10.2013    source источник


Ответы (3)


Вам нужен класс (-> CustomAdapter), который расширяется от BaseAdapter. Там вы можете определить свой собственный макет для каждого элемента списка.

Поэтому создайте собственный макет для элементов строки (как я понимаю, это должен быть просто ImageView). Этот макет должен быть настроен в методе getView() вашего BaseAdapter. Но, пожалуйста, прочтите эту статью, чтобы обеспечить "плавную прокрутку" вы перечисляете View.

Ваш CustomAdapter должен выглядеть так:

public class MyCustomAdapter extends BaseAdapter{

    // MEMBER
    private int[] mImgs;

    public MyCustomAdapter(Activity context, int[] imgs){
        mImgs = imgs;
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return mImgs.length;
    }

    @Override
    public Object getItem(int position) {
        return mImgs[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    // --- detail settings of single views
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // check if your layout is null
        if(convertView == null){
            convertView = createNewView();              
        }

        // get the ViewHolder of your view
        ViewHolder holder = (ViewHolder) convertView.getTag();

        // --- set data to listItem
        holder.imageView.setImageDrawable(mImgs[position])

        return convertView;
    }


    // new View
    private View createNewView() {
        View convertView = null;
        int layout = 0;

        ViewHolder holder = new ViewHolder();

        layout = R.layout.customlayout;
        convertView = mInflater.inflate(layout, null);
        holder.imageView = (ImageView) convertView.findViewById(R.id.customlayout_imageview);

        convertView.setTag(holder);
        return convertView;
    }

    //ViewHolder
    public static class ViewHolder{
        public ImageView imageView;
    }

}
person owe    schedule 29.10.2013
comment
Привет, а я использую курсорный адаптер? Я получаю данные из своей базы данных - person neknek mouh; 29.10.2013
comment
Это должно быть то же самое. Создайте CustomAdapter, который расширяется от CursorAdapter-> Там у вас также есть метод с именем getView(), где вы можете раздуть свой пользовательский макет и установить данные из вашего курсора. Также ваш конструктор должен быть почти таким же -> вместо доставки Integer-Array (как в моем примере) вы должны доставить свой курсор. Также не забудьте адаптировать другие методы (getCount(), ...). - person owe; 29.10.2013

во-первых: параметры "от" и "до" должны иметь одинаковый размер, во-вторых: используйте SimpleCursorAdapter. ViewBinder

person pskink    schedule 29.10.2013
comment
Можете ли вы дать мне несколько фрагментов кода, чтобы я начал? Спасибо. - person neknek mouh; 29.10.2013

Добавьте столбец, такой как DBHelper.KEY_IMAGE_TYPE, зафиксируйте размер «от» таким же, как «до», пример кода с использованием ViewBinder выглядит следующим образом:

    // The desired columns to be bound
    String[] columns = new String[] { DBHelper.KEY_IMAGE_TYPE, DBHelper.KEY_HOUSE,
            DBHelper.KEY_PRICE };

    // the XML defined views which the data will be bound to
    int[] to = new int[] {  
            R.id.image,
            R.id.text1,
            R.id.text2};

    SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(this,
            R.layout.listrow, cursor, columns, to, 0);
    dataAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(View view, Cursor cursor,
                int columnIndex) {
            switch (view.getId()) {
            case R.id.image:
                int imageType = cursor.getInt(columnIndex);
                int imageToBeShown=0;
                switch (imageType) {
                case TYPE_ONE:
                    imageToBeShown=imgs[0];
                    break;
                case TYPE_TWO:
                    imageToBeShown=imgs[1];
                    break;
                case TYPE_THREE:
                    imageToBeShown=imgs[2];
                    break;
                case TYPE_FOUR:
                    imageToBeShown=imgs[3];
                    break;
                case TYPE_FIVE:
                    imageToBeShown=imgs[4];
                    break;
                case TYPE_SIX:
                    imageToBeShown=imgs[5];
                    break;
                }
                ((ImageView)view).setImageResource(imageToBeShown);
                return true;
            }
            return false;
        }
    });
person Ricky    schedule 29.10.2013