为了帮助这个讨论,我已经在GitHub上发布了所有相关的源代码.https://github.com/WindSpirit/DroidCustomView
基本上,我编写了一个Android自定义视图(Custom,Asgl.Android.Views.RatingView),它继承了TableLayout,并包含了由公共get/set属性(通过MvvmCross绑定和/或AXML属性属性)更改的多个ImageView。
此自定义视图用于MvxList,MvxItemTemplate.
以下是MvxItemTemplate AXML代码的样子。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/task_description"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
local:MvxBind="Text RatingValue" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
local:MvxBind="Text ScaleValue" />
<Asgl.Android.Views.RatingView
android:id="@+id/rating"
android:layout_margin="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
local:MvxBind="Rating RatingValue; Scale ScaleValue" />
</LinearLayout>TextView控件按预期通过MvvmCross绑定显示数据,但自定义视图控件无法正确显示数据。
基于"N-28-CustomBinding",当在视图对象上调用公共属性设置器方法时,我定制了自定义视图的外观。另见http://slodge.blogspot.ca/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html
一切都按其应有的方式工作,除了所有初始的MvxItemTemplate项都显示完全相同,即使它们应该以不同的方式显示。似乎每个列表项都使用了自定义视图的缓存映像,尽管列表项属性的值不同。
在Custom-View,this.Parent()中永远不可用,调用Custom方法(如this.Invalidate()或this.InvalidateDrawable( this.myDrawable.Drawable ) )似乎没有任何效果。
换句话说,简单地执行以下代码并不一定会导致在构造MvxList时出现可视列表项更改.
public int? Rating
{
get { return _rating; }
set {
if ((value != null) && (value < -2 || value > 5))
throw new ArgumentOutOfRangeException();
if (_rating != value)
{
_rating = value;
_isUpdating = true;
try
{
var testValue = Scale ?? 0;
Rating0.Visibility = (testValue > 0) ?
ViewStates.Visible : ViewStates.Gone;
Rating1.Visibility = (testValue > 0) ?
ViewStates.Visible : ViewStates.Gone;
Rating2.Visibility = (testValue > 2) ?
ViewStates.Visible : ViewStates.Gone;
Rating3.Visibility = (testValue > 3) ?
ViewStates.Visible : ViewStates.Gone;
Rating4.Visibility = (testValue > 4) ?
ViewStates.Visible : ViewStates.Gone;
ActnGood.SetColorFilter((Rating > 0) ?
ColourGood : ColourDisabled, PorterDuff.Mode.SrcIn);
Rating0.SetImageDrawable(ActnGood);
ActnBad.SetColorFilter((Rating > 0) ?
ColourDisabled : ColourBad, PorterDuff.Mode.SrcIn);
Rating1.SetImageDrawable(ActnBad);
this.Invalidate();
// etc...
if (RatingChanged != null)
RatingChanged(this, EventArgs.Empty);
} finally {
_isUpdating = false;
}
}
}
}
public event EventHandler RatingChanged;问题:,当列表项属性值由于MvvmCross绑定而发生变化时,要让MvxList重新绘制其列表项之一,需要做什么?
发布于 2014-11-07 20:29:18
呼!我终于有了一个解决方案,并将其作为对我的GitHub项目的修订发布在这个线程的第一行中。
我通过检查GroupView视图句柄的DrawChild句柄得到了这个解决方案,然后考虑.“如果我对DrawChild视图参数做了与对GroupView所做的相同的事情,那该怎么办?”它会在屏幕上画出正确的信息吗?
草案的解决方案看上去有点像这样..。
protected override bool DrawChild(Canvas canvas, View child, long drawingTime)
{
System.Diagnostics.Debug.Print(string.Format("this.Handle = {0} Scale = {1} Rating = {2}", Handle, Scale, Rating));
InitControls(child);
Refresh();
return base.DrawChild(canvas, child, drawingTime);
}是的!更新传递给DrawChild的DrawChild(子)可以完成任务!
发布于 2014-11-07 11:59:49
我打开了你的样本项目
尝试首先更新到最新的MvvmCross。
用更低的版本工作是没有意义的
发布于 2014-11-11 15:48:07
覆盖DrawChild方法并将其可视化设置与事件处理程序的实例设置同步,是目前为止显示自己的唯一解决方案。
这个自定义视图(Android )似乎是正确的方法,尽管侦听器在错误的位置注册(它们应该在OnAttachedToWindows()中注册,并在OnDetachedFromWindow()中删除)。
这个YouTube.com视频重申了我对所采取的方法的信念。
Google /O 2013 -为Android https://www.youtube.com/watch?v=NYtB6mlu7vA#t=1286编写自定义视图
然而,我真诚地相信,我缺少的东西将使DrawChild逻辑更加高效。
https://stackoverflow.com/questions/26789646
复制相似问题