2013-03-23 135 views
1

旋转图像我试图做一个假的ListView水平。为此,我想旋转适配器中每个单元格的内容。它几乎工程:在列表视图

Turn graphics

class ImageAdapter(ctx: Context, viewResourceId: Int, imageResourceId: Int, strings: Array[String], icons: TypedArray, colorSelected: Int, colorNotSelected: Int, colorBorder: Int) extends ArrayAdapter[String](ctx, viewResourceId, strings) { 
    // Useful variables 
    private val mInflater: LayoutInflater = ctx.getSystemService(
       Context.LAYOUT_INFLATER_SERVICE).asInstanceOf[LayoutInflater] 
    private val mStrings: Array[String] = strings 
    private val mIcons: TypedArray = icons 
    private val mViewResourceId: Int = viewResourceId 

    private var mSelected : Int = 0 

    def setSelected(s: Int) = mSelected = s 

    // Inherited from ArrayAdapter 
    override def getCount():Int = mStrings.length 
    override def getItem(position: Int): String = mStrings(position) 
    override def getItemId(position: Int): Long = position 

    // The rotation machinery 
    var rotation = 90 
    private var matrix = new Matrix() 
    val rect1 = new RectF(0, 0, 0, 0) 
    val rect2 = new RectF(0, 0, 0, 0) 
    val cst = Matrix.ScaleToFit.CENTER 

    // Getting the view. 
    override def getView(position: Int, convertView: View, parent: ViewGroup): View = { 
     var result = if(convertView == null) mInflater.inflate(mViewResourceId, null) else convertView 

     var iv: ImageView = result.findViewById(imageResourceId).asInstanceOf[ImageView] 
     val drawable = mIcons.getDrawable(position) 
     iv.setScaleType(ScaleType.MATRIX) 
     matrix.reset() 
     val height = drawable.getIntrinsicHeight() 
     val width = drawable.getIntrinsicWidth() 
     rotation match { 
      case 0 => 
      rect1.set(0, 0, width, height) 
      rect2.set(0, 0, iv.getWidth(), iv.getHeight()) 
      matrix.setRectToRect(rect1, rect2, cst) 
      case 90 => 
      rect1.set(0, 0, width, height) 
      rect2.set(-iv.getHeight()/2, -iv.getWidth()/2, iv.getHeight()/2, iv.getWidth()/2) 
      matrix.setRectToRect(rect1, rect2, cst) 
      matrix.postRotate(rotation, 0, 0) 
      matrix.postTranslate(iv.getWidth()/2, iv.getHeight()/2) 
      ... 
      case _ => 
     } 
     iv.setImageMatrix(matrix) 
     iv.setImageDrawable(drawable) 
     iv.postInvalidate() 

     if(position == mSelected) { 
      result.setBackgroundColor(colorSelected) 
     } else { 
      result.setBackgroundColor(colorNotSelected) 
     } 
     result.setTag(mStrings(position)) 
     result 
    } 
} 

唯一的问题是,它不显示的第一张照片。相反,它会显示: Listview empty

要显示第一个列表,我需要单击每个列表中的一个元素。的onclick方法如下:

listGraphismesView.setOnItemClickListener(new OnItemClickListener { 
    override def onItemClick(parent: AdapterView[_], view: View, position: Int, notUsedId: Long) = { 
     var graphismeName = view.getTag().asInstanceOf[String] 
     mAdapter.setSelected(position) 
     mAdapter.notifyDataSetChanged() 
     showGChallenge(position, graphismeName) 
    } 
    }) 

我试图然后把mAdapter.notifyDataSetChanged()在片段的onResume功能,但它不更新从一开始的名单。我仍然需要点击所有图片才能显示。 任何想法,为什么?

+0

你可以尝试在旋转图像之前设置视图的背景色吗? – 2013-03-24 00:29:05

+0

很好的建议,但它没有任何效果。 – 2013-03-25 21:21:29

回答

0

我发现iv.getWidth()和iv.getHeight()均返回零,因为getview将由onActivityCreated函数被调用。将notifyDataSetChanged()放在onResume函数中还为时尚早。所以绘制将与大小为0绘制,当我可以点击按钮重新加载。

因此,要改变这种状况,我写了下面的代码,调用带有监听调整大小功能。

var iv: ImageView = result.findViewById(imageResourceId).asInstanceOf[ImageView] 
val drawable = mIcons.getDrawable(position) 
iv.setImageDrawable(drawable) 
iv.setScaleType(ScaleType.MATRIX) 
val vto = iv.getViewTreeObserver() 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    private var matrix = new Matrix() 
    val rect1 = new RectF(0, 0, 0, 0) 
    val rect2 = new RectF(0, 0, 0, 0) 
    private var height = drawable.getIntrinsicHeight() 
    private var width = drawable.getIntrinsicWidth() 
    override def onGlobalLayout() { 
    val iv_width = iv.getWidth 
    val iv_height = iv.getHeight 
    matrix.reset() 
    rotation match { 
     case 0 => 
     rect1.set(0, 0, width, height) 
     rect2.set(0, 0, iv_width, iv_height) 
     matrix.setRectToRect(rect1, rect2, cst) 
     case 90 => 
     rect1.set(0, 0, width, height) 
     rect2.set(-iv_height/2, -iv_width/2, iv_height/2, iv_width/2) 
     matrix.setRectToRect(rect1, rect2, cst) 
     matrix.postRotate(rotation, 0, 0) 
     matrix.postTranslate(iv_width/2, iv_height/2) 
     ... 
     case _ => 
    } 
    iv.setImageMatrix(matrix) 
    } 
})