首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MvvmCross -如何强制在MvxList项目中重新绘制自定义视图?

MvvmCross -如何强制在MvxList项目中重新绘制自定义视图?
EN

Stack Overflow用户
提问于 2014-11-06 21:23:48
回答 3查看 720关注 0票数 2

为了帮助这个讨论,我已经在GitHub上发布了所有相关的源代码.https://github.com/WindSpirit/DroidCustomView

基本上,我编写了一个Android自定义视图(Custom,Asgl.Android.Views.RatingView),它继承了TableLayout,并包含了由公共get/set属性(通过MvvmCross绑定和/或AXML属性属性)更改的多个ImageView。

自定义视图用于MvxList,MvxItemTemplate.

以下是MvxItemTemplate AXML代码的样子。

代码语言:javascript
复制
<?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时出现可视列表项更改.

代码语言:javascript
复制
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重新绘制其列表项之一,需要做什么?

EN

回答 3

Stack Overflow用户

发布于 2014-11-07 20:29:18

呼!我终于有了一个解决方案,并将其作为对我的GitHub项目的修订发布在这个线程的第一行中。

我通过检查GroupView视图句柄的DrawChild句柄得到了这个解决方案,然后考虑.“如果我对DrawChild视图参数做了与对GroupView所做的相同的事情,那该怎么办?”它会在屏幕上画出正确的信息吗?

草案的解决方案看上去有点像这样..。

代码语言:javascript
复制
    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(子)可以完成任务!

票数 1
EN

Stack Overflow用户

发布于 2014-11-07 11:59:49

我打开了你的样本项目

尝试首先更新到最新的MvvmCross。

用更低的版本工作是没有意义的

票数 0
EN

Stack Overflow用户

发布于 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逻辑更加高效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26789646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档