2017-08-18 2 views
0

私は自分にとっては少し難しいかもしれないタスクに自分自身を投げました。 私は、患者のスキャン画像を表示し、器官を描写するいくつかの等高線を重ね合わせる医療アプリケーションを設計しています。Android:リスト内に多数の画像ビューを動的に作成するビューのカスタムフレームレートを表示

患者のスキャンは、一連のPNG画像(スライスリストビュー行の背景)です。 輪郭はベクトルであり、同じスキャンスライスには数十の輪郭が含まれている場合があります。

このようにするには、スキャンスライスがカスタムアダプタのリストビューに読み込まれます。等高線は、以前に行われた臓器の選択に従って追加される。等高線は、同じフレームレートでスキャンしたときに透明な背景が追加されたimageViewです。したがって、輪郭の画像ビューはレイアウト内で動的に追加されます。

問題は、私がリストビューからあまりにも多くを求めているかもしれないということです。実際、私はアダプタの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> 

答えて

1

私はあなたがGetViewメソッド

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); 
      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(); 
     } 

     // Then do operation here on your view holder 
     // ... 

     return convertView; 

} 

の悪い使い方をすると、あなたが今、このプロジェクトを開始する場合は、代わりにRecyclerViewを使用して考えると思いますリストビューの。

これで問題ないので、古いビューが残っていない場合は、removeAllViews()メソッドを呼び出してImageViewsを追加する前にFramelayoutをクリアする必要があります。

+0

ありがとうございます。 1 /私はコードをフォーマットしました。それは読みやすいですか? 2 /あなたは正しい私のパターンは正しくありませんでした。しかし、問題は残っています:興味深いことに、ベクトル画像(円柱2)は不正確なスライスで再利用されているようです。瞬間的に、位置1のベクトルは、位置5のスライスでも見つかります。 新しいimageViewが作成されると、ビューのリサイクルに関係していると思います。私は、しかし、どのように把握することはできません。どんな助けにも感謝! – Kranck

+0

はい!このオプションはレイアウトエディタでも利用できます – smora

+0

私は自分の答えを更新しました。あなたの問題を解決することを願っています。 – smora

関連する問題