在 notifydatasetchanged 后未调用 getview
Posted
技术标签:
【中文标题】在 notifydatasetchanged 后未调用 getview【英文标题】:getview not called after notifydatasetchanged 【发布时间】:2018-11-29 04:12:53 【问题描述】:所以我正在处理实时列表视图,我需要列表视图在按钮单击时更新,这些也是如此:
private void ReloadData()
DataList.clear();
try
for (int i =0;i<ItemsCount;i++)
TempItem=new STRUCTS.STRUCT_ProductItem();
TempItem.setName(dbh.ReadDefine(ProductID,i+"","name")+"");//Read name if there is any set
TempItem.setImgs(Uri.parse(dbh.ReadDefine(ProductID,i+"","img")+""));//Read image if there is any set
TempItem.setInfo("PR"+i);//Desc
Log.i("TAG", "ReloadData: "+IsOn[i]);//Is product avalible
TempItem.setToggled(IsOn[i]);
DataList.add(TempItem);
catch (Exception ex)
ex.printStackTrace();
Log.e("ERRORCATCHER", "OnForLoop (Fill Product Data): "+ex.getMessage() );
//
if(!IsAdapterSet)
adapter = new LISTCUSTOM_ProductITEM(MyActivity.this,DataList);
list.setAdapter(adapter);
IsAdapterSet=true;
else
try
adapter.swapItems(DataList);
catch (Exception e)
e.printStackTrace();
我的自定义适配器上的 SwapItems:
public void swapItems(ArrayList<STRUCTS.STRUCT_ProductItem> list) throws InterruptedException
DataList=list;
this.notifyDataSetChanged();
这没有给出任何错误,正如我从日志中看到的那样,新项目已成功添加并且它们的数据是新的
listview 不会自行更新!所以当我单击运行 ReloadData() 的按钮时 它对列表视图没有影响......
实际上这个日志没有运行:
@Override
public View getView(final int CPosition, @Nullable View convertView, @NonNull ViewGroup parent)
final STRUCTS.STRUCT_ProductItem Currect_Item=DataList.get(CPosition);
Log.i("TAG", "View updated : "+Currect_Item.gettoggled());
/*Define stuff*/
itempicture.setImageURI(Currect_Item.getImgs());
/*More listview update stuff*/
当我单击该按钮时它不会记录 ViewUpdated 并且它不会更改任何列表视图元素
但是当我滚动列表视图时项目不可见然后我回滚它们的数据已更新!
当一个项目失去可见性然后再次获得它时运行GetView
为什么 Notifydatachanged 不会更新 UI / 在我的自定义适配器上运行 GetView?
【问题讨论】:
先尝试清除DataList
中的项目,然后使用DataList.addAll(list.getData())
;
【参考方案1】:
试试这个代码
private void ReloadData()
DataList.clear();
if(!IsAdapterSet)
adapter = new LISTCUSTOM_ProductITEM(MyActivity.this,DataList);
list.setAdapter(adapter);
IsAdapterSet=true;
try
for (int i =0;i<ItemsCount;i++)
TempItem=new STRUCTS.STRUCT_ProductItem();
TempItem.setName(dbh.ReadDefine(ProductID,i+"","name")+"");//Read name if there is any set
TempItem.setImgs(Uri.parse(dbh.ReadDefine(ProductID,i+"","img")+""));//Read image if there is any set
TempItem.setInfo("PR"+i);//Desc
Log.i("TAG", "ReloadData: "+IsOn[i]);//Is product avalible
TempItem.setToggled(IsOn[i]);
DataList.add(TempItem);
adapter.swapItems(DataList);
catch (Exception ex)
ex.printStackTrace();
Log.e("ERRORCATCHER", "OnForLoop (Fill Product Data): "+ex.getMessage() );
在适配器类中
public void swapItems(ArrayList<STRUCTS.STRUCT_ProductItem> list) throws InterruptedException
DataList.addAll(list);
this.notifyDataSetChanged();
【讨论】:
它使列表滚动到第一个并且当运行 notifydatasetchanged 时 GetView isent 运行它实际上使情况变得更糟? DataList.addAll 没有先清除它?它使我的列表中充满了重复的项目,但仍然无法正常工作 @Disco4uf 更改适配器中的代码 DataList.addAll(list);到你以前的代码 我以为你想添加以前的数据新数据【参考方案2】:试试这个
private void ReloadData()
ArrayList<STRUCTS.STRUCT_ProductItem> list = new ArrayList<>;
try
for (int i =0;i<ItemsCount;i++)
TempItem= new STRUCTS.STRUCT_ProductItem();
TempItem.setName(dbh.ReadDefine(ProductID,i+"","name")+"");//Read name if there is any set
TempItem.setImgs(Uri.parse(dbh.ReadDefine(ProductID,i+"","img")+""));//Read image if there is any set
TempItem.setInfo("PR"+i);//Desc
Log.i("TAG", "ReloadData: "+IsOn[i]);//Is product avalible
TempItem.setToggled(IsOn[i]);
list.add(TempItem);
catch (Exception ex)
ex.printStackTrace();
Log.e("ERRORCATCHER", "OnForLoop (Fill Product Data): "+ex.getMessage() );
DataList.clear();
DataList.addAll(list);
adapter.notifyDataSetChanged();
【讨论】:
以上是关于在 notifydatasetchanged 后未调用 getview的主要内容,如果未能解决你的问题,请参考以下文章
在 customAdapter.notifyDataSetChanged 之后 ListView 不更新
[完成]notifyDataSetChanged() 不会自动更新 ListActivity
在 notifyDataSetChanged 后 Android ListView 不刷新
ArrayAdapter.NotifyDataSetChanged() 不工作?