我全身心投入到对我来说可能有点难度的任务中。 我正在设计一个医疗应用程序,显示患者扫描的图像,并叠加描绘器官的几个轮廓。
患者的扫描是一系列PNG图像(切片列表视图行的背景)。 轮廓是矢量,并且相同的扫描切片可以包含几十个轮廓。
为此,使用自定义适配器将扫描切片加载到列表视图中。根据先前完成的器官选择添加轮廓。轮廓是在同一帧布局中通过扫描添加透明背景的imageView。因此,轮廓的图像视图在布局中动态添加。
问题是我可能会从listview中提出太多要求。事实上,我已经陷入了适配器的getView方法。轮廓出现,但通过切片的刷新和迭代似乎是随机的。
有人可以告诉我这种情况的暗示吗?我不确定图像视图的动态分配现在是否聪明......我该怎么办?
欢迎任何帮助!
适配器:
package bhouse.radiovolumes;
import android.content.Context;
import android.media.Image;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
/**
* Created by kranck on 8/3/2017.
*/
public class ScannerListAdapter extends ArrayAdapter<SliceItem> {
private Context context;
private LayoutInflater inflater;
private ArrayList<SliceItem> slices;
public ScannerListAdapter(Context context, ArrayList<SliceItem> slices) {
super(context, R.layout.list_view_scan, slices);
this.context = context;
this.slices = slices;
inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_view_scan, parent, false);
convertView.setMinimumHeight(parent.getMeasuredHeight());
holder = new ViewHolder();
holder.scanView = (ImageView) convertView.findViewById(R.id.view_scan);
holder.frameLayout = (FrameLayout) convertView.findViewById(R.id.zoomLayout);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
SliceItem item = getItem(position);
int resIdScan = this.context.getResources().getIdentifier(item.getStorageLocation(), "drawable", context.getPackageName());
Picasso
.with(context)
.load(resIdScan)
.error(R.drawable.borabora)
.into(holder.scanView);
for (int i = 0; i < item.getVectorStorageLocation().size(); i++) {
ImageView imageView = new ImageView(context);
String resourceName = "cylindre__2___" + String.valueOf(position);
int resId = context.getResources().getIdentifier(resourceName, "drawable", context.getPackageName());
imageView.setImageResource(resId);
holder.frameLayout.addView(imageView);
}
return convertView;
}
static class ViewHolder {
FrameLayout frameLayout;
ImageView scanView;
}
}
布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<bhouse.radiovolumes.ZoomView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" >
<FrameLayout
android:id="@+id/zoomLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/view_scan"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
>
</ImageView>
</FrameLayout>
</bhouse.radiovolumes.ZoomView>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<bhouse.radiovolumes.ZoomView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" >
<FrameLayout
android:id="@+id/zoomLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/view_scan"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
>
</ImageView>
</FrameLayout>
</bhouse.radiovolumes.ZoomView>
</LinearLayout>
答案 0 :(得分:1)
我认为你错误地使用了getView方法
inner join
如果您现在开始这个项目,请考虑使用RecyclerView而不是ListView。
现在可以正常使用,如果没有旧视图,则需要在调用removeAllViews()方法添加ImageView之前清除Framelayout。