代码之家  ›  专栏  ›  技术社区  ›  progrAmmar

NotifyDataSetChanged()Xamarin.Android的Bizzare行为

  •  0
  • progrAmmar  · 技术社区  · 7 年前

    我正在开发一个应用程序,要求用户提供物品的照片。

    我的主要目标是

    public class PickedObject
    {
        int ID { get; set; }
        int Name{ get; set; }
        bool HasPhotos { get; set; }
    }
    

    我还有另外一张桌子放照片,因为一个物品可以有多张照片。

    发生的事情是,在我的适配器中,我创建了一个回收器视图,这样,如果一个项目有图像,它前面应该有一个可见的ImageButton。

    这是我的行模板

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:weightSum="8">
            <TextView
                android:id="@+id/lblItemName"
                android:layout_width="0dp"
                android:layout_weight="6"
                android:layout_marginTop="5dp"
                android:layout_marginLeft="10dp"
                android:layout_height="wrap_content"
                android:textSize="20dp"
                android:text="" />
            <ImageButton
                android:layout_weight="1"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:adjustViewBounds="true"
                android:scaleType="fitCenter"
                android:layout_marginTop="5dp"
                android:background="@android:color/transparent"
                android:padding="5dp"
                android:src="@drawable/rowcamera"
                android:id="@+id/btnCamera" />
            <ImageButton
                android:layout_weight="1"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:adjustViewBounds="true"
                android:scaleType="fitCenter"
                android:layout_marginTop="5dp"
                android:background="@android:color/transparent"
                android:padding="5dp"
                android:src="@drawable/rowpicture"
                android:id="@+id/btnPicture" />     
    </LinearLayout>
    

    在适配器中,我正在使用 GetView(int position, View convertView, ViewGroup parent)

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            ItemViewHolder holder = null;
            PickedObject item = _items[position];
            View view = convertView;
    
            try
            { 
                if (view != null)
                    holder = (ItemViewHolder)view.Tag; //Holder
    
                if(holder == null)
                {
                    holder = new ItemViewHolder();
                    view = _context.LayoutInflater.Inflate(Resource.Layout.ItemRow, null);
                    holder.ItemName = view.FindViewById<TextView>(Resource.Id.lblItemName);
    
                    holder.CameraButton = view.FindViewById<ImageButton>(Resource.Id.btnCamera);
                    holder.CameraButton.Tag = item.ID;   
                    holder.PictureButton = view.FindViewById<ImageButton>(Resource.Id.btnPicture);
                    holder.PictureButton.Tag = item.ID;                    
    
                    CameraClickListener cameraListener = new CameraClickListener(_context, this); 
                    cameraListener.CameraClickEvent += CameraClickedEvent;
                    holder.CameraButton.SetOnClickListener(cameraListener);
                    ImageClickListener imageClickListener = new ImageClickListener(_context);
                    imageClickListener.ImageClickEvent += ImageClickedEvent;
                    holder.PictureButton.SetOnClickListener(imageClickListener);                                        
                    view.Tag = holder;
                }
    
                holder.ItemName.Text = item.Name;               
                holder.CameraButton.Visibility = ViewStates.Visible;
    
                if (item.HasPhotos)
                {
                    holder.PictureButton.Visibility = ViewStates.Invisible;
                }
                else
                {
                    holder.PictureButton.Visibility = ViewStates.Visible;
                }
            }
            catch(Exception ex)
            {
                Log.Error("Item adapter", ex.Message);
            }
            return view;
        }
    

    现在在我的主活动中,我调用了两个活动(结果),一个是启动相机并保存照片的相机活动。 另一个活动是在项目中创建的库类型活动。

    result上的活动称为:

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        int itemId = CameraApp.ID; // Camera App is a static object to hold data
        if (requestCode == General.CAMERA_ACTIVITY) // Camera activity code 110
        {
            CompleteCameraActivity(resultCode, data); // Save picture into gallery and update db
        }
        if(requestCode == General.GALLERY_ACTIVITY) // Gallery activity code 113
        {
            CompleteGalleryActivity(resultCode, data);
        }
    
        SectionFragment frag = (SectionFragment)sectionsAdapter.GetItem(viewPager.CurrentItem);
        int sectionId = frag.Section.ID;        
        frag.Adapter.SetPicture(questionId, dataAccess.HasPictures(itemId));        
    }
    

    这个 SetPicture 适配器中的方法如下:

    public void SetPicture(int id, bool hasPics)
    {
        Item itm = _items.SingleOrDefault(a => a.ID == id);
        if (itm != null)
            _items.SingleOrDefault(a => a.ID == id).HasPhotos = hasPics;
    
        this.NotifyDataSetChanged();        
    }
    

    这个应用程序在相机活动中运行良好。它会更新记录,并且图像按钮也可见。 当主活动在厨房活动之后获得控制时,麻烦就来了当我删除库中的所有图像时 设置图片 方法的执行使 HasPhotos 属性设置为false但是 NotifyDataSetChanged 适配器的一部分不工作(当我在调试器中测试它时 GetView 未为适配器激发方法)。

    因此,发生的情况是,我的ListView仍然处于这样一种状态:即使项目没有照片,ImageButton(用于图片)仍然可用。 有人能告诉我我做错了什么吗?

    编辑

    我注意到如果我滚动列表一次并返回到项目,ImageButton是不可见的,这意味着它可以工作,但为什么它不能工作 StartActivityForResult ?

    0 回复  |  直到 7 年前