如何使用CursorAdapter在listview中实现Horizo​​ntalScrollView?

时间:2015-09-22 07:35:13

标签: android android-listview android-imageview android-cursoradapter horizontalscrollview

我正在尝试使用自定义HorizontalScrollView在多行listview上实现CursorAdapter

我有一个模块,允许一次选择多个图像,并使用唯一的时间戳标记将其路径插入数据库。时间戳标记对于一次选择的所有图像都是相同的,因为我试图根据这些标记将这些图像放在水平滚动视图中。

我想在一行中显示一组具有相同时间戳标记的图像,在第二行中显示另一组图像,依此类推。

我的行XML是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/llParent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <HorizontalScrollView
        android:id="@+id/hsvImage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:id="@+id/llImage"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="horizontal" >
        </LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

newView()

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

    View viewLayout = inflater.inflate(R.layout.adapter_single_chat,
                parent, false);

    ViewHolder holder = new ViewHolder();

    holder.llParent = (LinearLayout) viewLayout.findViewById(R.id.llParent);
    holder.hsvImg = (HorizontalScrollView) viewLayout.findViewById(R.id.hsvImage);
    holder.llImg = (LinearLayout) viewLayout.findViewById(R.id.llImage);
    return viewLayout;
}

bindView()中的第一种方法:

首先,我只是将我的程序化图像视图添加到holder.llImg。它在一个简单的行中添加一个图像,根本不显示水平滚动视图:

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

    ViewHolder holder = (ViewHolder) view.getTag();

    String imagePath = cursor.getString(indexImagePath);

    ImageView iv = new ImageView(context);
    iv.setLayoutParams(new LayoutParams(450, 450));
    iv.setBackgroundColor(Color.BLACK);
    iv.setScaleType(ScaleType.CENTER_CROP);

    Bitmap bm = BitmapFactory.decodeFile(imagePath);

    iv.setImageBitmap(bm);

    //Add views to linear layout
    holder.llImg.addView(iv);
}

bindView()中的第二种方法:

我尝试基于imageTags对图像进行分组,通过将当前标记与下一个标记进行比较,如果找到不匹配,则使用findViewById()创建新的线性布局实例以切换到下一行:

在以下情况中,llImgLinearLayout实例变量和tagThis&amp; tagPrev是String实例变量。

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

    ViewHolder holder = (ViewHolder) view.getTag();

    String imagePath = cursor.getString(indexImagePath);

    String imageTag = cursor.getString(indexImageTag);

    if (imageTag != null) {

        if (llImg == null) {

            //Create new linear layout
            llImg = (LinearLayout) view.findViewById(R.id.llImage);
        }

        //Check if cursor position is greater than 0
        if (cursor.getPosition() < cursor.getCount() - 1) {

            //get current image tag
            tagThis = cursor.getString(indexImageTag);

            //get next record's image tag
            cursor.moveToPosition(cursor.getPosition() + 1);
            tagPrev = cursor.getString(indexImageTag);
        }
        //Return cursor to original position
        cursor.moveToPosition(cursor.getPosition());

        //compare current and next record's image tag
        if ((tagThis != null) && (!tagThis.equals(tagPrev))) {

            //Create new linear layout
            llImg = (LinearLayout) view.findViewById(R.id.llImage);
        }

        ImageView iv = new ImageView(context);
        iv.setLayoutParams(new LayoutParams(450, 450));
        iv.setBackgroundColor(Color.BLACK);
        iv.setScaleType(ScaleType.CENTER_CROP);

        Bitmap bm = BitmapFactory.decodeFile(imagePath);

        iv.setImageBitmap(bm);

        //Add views to linear layout
        llImg.addView(iv);
    }
}

结果有点成功但后来发现findViewById()没有返回linear layout的新实例,所以在某些点上它不会切换到下一行。而且有时候滚动时视图会相互混淆 - 这是旧的回收问题。

bindView()中的第3种方法:

第三,当第一个imageTag点击时,我通过WHERE查询获取该imageTag表中的所有行,并在linear layout中添加所有结果。但是在某些方面再次无法切换到下一行。:

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

    ViewHolder holder = (ViewHolder) view.getTag();

    String imagePath = cursor.getString(indexImagePath);

    String imageTag = cursor.getString(indexImageTag);

    if (imageTag != null) {

        //Create new linear layout
        llImg = (LinearLayout) view.findViewById(R.id.llImage);

        LocalStoreDB localDB = new LocalStoreDB(context);
        localDB.openDB();

        //Get all rows of imageTag with where query
        Cursor cr = localDB.selectTagData(imageTag);
        while (cr.moveToNext()) {

            String imagePath2 = cr.getString(indexFilePath);

            ImageView iv = new ImageView(context);
            iv.setLayoutParams(new LayoutParams(450, 450));
            iv.setBackgroundColor(Color.BLACK);
            iv.setScaleType(ScaleType.CENTER_CROP);

            Bitmap bm = BitmapFactory.decodeFile(imagePath2);

            iv.setImageBitmap(bm);

            //Add views to linear layout
            llImg.addView(iv);
        }

        localDB.closeDB();
    }
}

我尝试了这3种方法,但无法切换到listview行,其中linear layout具有水平方向。

完成此任务的正确方法是什么?

0 个答案:

没有答案