xamarin - NotifyDataSetChanged() Xamarin.Android 的奇怪行为
问题描述
我正在开发一个要求用户提供物品照片的应用程序。
我的主要目标是
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;
}
现在在我的 MainActivity 中,我调用了两个活动(用于结果),一个是启动相机并保存照片的相机活动。另一个活动是在项目中创建的画廊类型活动。
结果活动调用如下:
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();
}
当它来自相机活动时,应用程序可以正常工作。它更新记录并且图像按钮也是可见的。当 MainActivity 在 GalleryActivity 之后获得控制权时,问题就来了。当我删除图库中的所有图像时,将SetPicture
执行该方法,使该HasPhotos
属性为 false。但是NotifyDataSetChanged
适配器的一部分不起作用(当我在调试器中测试它时,GetView
不会为适配器触发该方法)。
所以发生的情况是,我的 ListView 仍然处于即使该项目没有照片 ImageButton(用于图片)仍然可用的状态。有人可以让我知道我做错了什么吗?
编辑
我注意到,如果我滚动列表一次并返回到该项目,ImageButton 是不可见的,这意味着它正在工作,但为什么它不起作用StartActivityForResult
?
解决方案
推荐阅读
- .net-core - Ocelot 发布请求未通过
- git - 推送到 GitHub,如何用敏感信息替换配置文件?
- django - 如何将图像上传到 Django
- html - 全屏宽度的卡盒 - 引导程序
- sql - 使用某些条件匹配模式并使用 Oracle 中的 regexp_replace 将其替换为某个字符串
- python - 将单线从 Numpy Python 转换为 Julia,其中涉及将一个 2D 数组映射到另一个 2D 数组
- drawing - Use clipboard images to draw paths that repeat over entire length of the line
- azure-data-factory - 将文件从一个区域复制到其他区域 - Azure Data Lake Gen2
- reactjs - React-native:无法获取本地颁发者证书
- batch-file - =< 在 SET /P 和变量名之后的批处理文件中是什么意思?