我正在尝试使用自定义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()创建新的线性布局实例以切换到下一行:
在以下情况中,llImg
是LinearLayout
实例变量和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
具有水平方向。
完成此任务的正确方法是什么?