【问题标题】:how do i create a custom cursor adapter for a listview for use with images and text?如何为列表视图创建自定义光标适配器以用于图像和文本?
【发布时间】:2011-07-15 02:53:42
【问题描述】:

您好,我想创建一个自定义光标适配器,这样我就可以显示带有 2 行文本的图像。 我在理解自定义光标适配器时遇到了一些麻烦,但我不明白如何添加要从数据库中的路径填充的图像视图。

【问题讨论】:

    标签: java android listview simplecursoradapter


    【解决方案1】:

    会,

    我实际上已经实现了一些与您正在寻找的非常相似的东西。这是我的实现。

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.res.Resources;
    import android.database.Cursor;
    import android.preference.PreferenceManager;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.CursorAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    
    public class ItemAdapter extends CursorAdapter {
        private LayoutInflater mLayoutInflater;
        private Context mContext;
        public ItemAdapter(Context context, Cursor c) {
            super(context, c);
            mContext = context;
            mLayoutInflater = LayoutInflater.from(context); 
        }
    
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View v = mLayoutInflater.inflate(R.layout.items_row, parent, false);
            return v;
        }
    
        /**
         * @author will
         * 
         * @param   v
         *          The view in which the elements we set up here will be displayed.
         * 
         * @param   context
         *          The running context where this ListView adapter will be active.
         * 
         * @param   c
         *          The Cursor containing the query results we will display.
         */
    
        @Override
        public void bindView(View v, Context context, Cursor c) {
            String title = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_TITLE));
            String date = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_DATE));
            String imagePath = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_IMG));
            int deletion = c.getInt(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_DELETION));
            int priority = c.getInt(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_PRIORITY));
    
            /**
             * Next set the title of the entry.
             */
    
            TextView title_text = (TextView) v.findViewById(R.id.item_text);
            if (title_text != null) {
                title_text.setText(title);
            }
    
            /**
             * Set Date
             */
    
            TextView date_text = (TextView) v.findViewById(R.id.item_date);
            if (date_text != null) {
                date_text.setText(date);
            }       
    
            /**
             * Decide if we should display the paper clip icon denoting image attachment
             */
    
            ImageView item_image = (ImageView) v.findViewById(R.id.item_attachment);
            item_image.setVisibility(ImageView.INVISIBLE);
            if (imagePath != null && imagePath.length() != 0 && item_image != null) {
                item_image.setVisibility(ImageView.VISIBLE);
            }
    
            /**
             * Decide if we should display the deletion indicator
             */
            ImageView del_image = (ImageView) v.findViewById(R.id.item_deletion);
            del_image.setVisibility(ImageView.INVISIBLE);
            if (deletion == 1) {
                del_image.setVisibility(ImageView.VISIBLE);
            }
        }
    }
    

    XML 只是装箱...

    <?xml version="1.0" encoding="utf-8"?>
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="@drawable/list_bg">
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <TextView android:id="@+id/item_text"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:lines="1"
                android:scrollHorizontally="true"
                android:ellipsize="end"
                android:paddingLeft="2sp"
                android:paddingTop="2sp"
                android:textSize="18sp"
                android:textStyle="bold"
                android:shadowColor="#90909090"
                android:shadowDx="1.0"
                android:shadowDy="1.0"
                android:shadowRadius="1.0"/>
    
            <TextView android:id="@+id/item_date"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="12sp"
                android:textColor="#FF808080"
                android:paddingLeft="2sp"
                android:paddingTop="2sp"/>
        </LinearLayout>
    
        <ImageView android:id="@+id/item_deletion"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/deletion"
            android:visibility="invisible"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:paddingRight="5sp"/>
    
        <ImageView android:id="@+id/item_attachment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/attachment"
            android:visibility="invisible"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/item_deletion"/>
    
    </RelativeLayout>
    

    这会根据特定条件在文本右侧显示两行文本和最多 2 个图像。

    我希望这能给你一个工作的基础!

    祝你好运:]

    【讨论】:

      【解决方案2】:

      检查我做了什么: 顺便说一句:CheckpointsView.getImageResId() 返回一个有效的可绘制引用

      public class CheckpointCursorAdapter extends ResourceCursorAdapter {
      
          private int layoutType = 0;
          public static final int BLOTTER = 1;
          public static final int DAY = 2;
          public static final int MONTH = 3;
          public static final int OVERVIEW = 4;
          public static final int LAYOUT_ID = R.layout.checkpoint_row;
      
          public CheckpointCursorAdapter(Context context, int layoutType, Cursor cursor) {
              super(context, LAYOUT_ID, cursor);
              this.layoutType = layoutType;
          }
      
          @Override
          public View newView(Context context, Cursor cur, ViewGroup parent) {
              LayoutInflater li = (LayoutInflater) context
                      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              return li.inflate(LAYOUT_ID, parent, false);
          }
      
          @Override
          public void bindView(View view, Context context, Cursor cursor) {
      
              TextView tvListText = (TextView) view.findViewById(R.id.txtCheckPoint);
              Date dt = new Date(cursor.getLong(cursor.getColumnIndex(DatabaseHelper.KEY_CHECKPOINT)));
              switch (layoutType) {
                  case BLOTTER:
                      tvListText.setText(dt.toLocaleString());
                      ((ImageView) view.findViewById(R.id.imgCheckpointInOut))
                              .setImageResource(CheckpointsView.getImageResId(cursor.getCount()
                                      - cursor.getPosition()));
                      break;
                  case DAY:
                      tvListText.setText(new SimpleDateFormat("HH:mm:ss").format(dt));
                      ((ImageView) view.findViewById(R.id.imgCheckpointInOut))
                              .setImageResource(CheckpointsView.getImageResId(cursor.getPosition() + 1));
                      break;
                  case MONTH:
                      tvListText.setText(new SimpleDateFormat("MMM dd HH:mm:ss").format(dt));
                      ((ImageView) view.findViewById(R.id.imgCheckpointInOut))
                              .setImageResource(CheckpointsView.getImageResId(cursor.getPosition() + 1));
                      break;
                  case OVERVIEW:
                      break;
              }
          }
      
      }
      

      还有 XML 以防万一

      <?xml version="1.0" encoding="utf-8"?>
      

      <TextView android:id="@+id/txtCheckPoint"
          android:layout_width="wrap_content" android:layout_height="wrap_content"
          android:textSize="20dp" android:padding="8dp" android:textStyle="bold">
      </TextView>
      <LinearLayout android:layout_width="fill_parent"
          android:layout_height="wrap_content" android:orientation="horizontal"
          android:gravity="right" android:layout_weight="1"
          android:layout_marginRight="8px">
          <TextView android:id="@+id/txtTotalHours"
          android:layout_width="wrap_content" android:layout_height="wrap_content"
          android:textSize="20dp" android:padding="8dp" android:paddingRight="12dp">
      </TextView>
          <TextView android:id="@+id/txtHourBalanceRow"
              android:layout_width="wrap_content" android:layout_height="wrap_content"
              android:textSize="12dp" android:padding="8dp">
          </TextView>
          <ImageView android:id="@+id/imgCheckpointInOut"
              android:layout_width="wrap_content" android:layout_height="wrap_content"
              android:src="@drawable/black_clock" />
      </LinearLayout>
      

      您可以在以下位置查看整个代码: http://code.google.com/p/droidtimesheet/

      【讨论】:

      • @大家感谢大家的帮助。我明白了
      【解决方案3】:

      添加图片和文字不是CursorAdapter特有的;您对任何类型的适配器都使用相同的技术。您可以为您的行创建一个布局并在您的 getView 方法中对其进行扩展。 APIDemos 示例项目包含在 Android SDK android-sdk-PLATFORM/samples/android-XY/ApiDemos 文件夹中,可以满足您的需求。您可以在list_item_icon_text.xml 中找到行定义。这是文件内容的副本(没有许可证)。

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="horizontal"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
      
          <ImageView android:id="@+id/icon"
              android:layout_width="48dip"
              android:layout_height="48dip" />
      
          <TextView android:id="@+id/text"
              android:layout_gravity="center_vertical"
              android:layout_width="0dip"
              android:layout_weight="1.0"
              android:layout_height="wrap_content" />
      
      </LinearLayout>
      

      【讨论】:

        【解决方案4】:

        这是一个很棒的tutorial,我以前用它来帮助我的自定义列表适配器。听起来它正在做你想做的完全相同的事情。本教程展示了如何使用图像和两行文本构建自定义列表适配器。

        【讨论】:

        • 我注意到您链接的教程有点过时。它使用ArrayAdapter 而不是CursorAdapter。此外,布局文件使用LinearLayout 可以替换为RelativeLayout 以避免一个堆栈级别。作者参考的link中提到了更好的布局。此外,一些命名约定已经过时,例如android:id="@+id/android:empty" 而不是 android:id="@android:id/empty"
        • 感谢您指出这一点,这是技术教程的问题……保质期不长。
        • @JJD 使用数组适配器是完全可以的。如果列表视图的数据是数组形式,请使用数组适配器。如果数据采用游标的形式,则使用游标适配器。布局不应被线性布局取代。它应该一起被删除,因为每个布局都基于一个框架布局作为起点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多