我目前正在使用MvvmCross和Xamarin iOS开发应用程序。 该应用程序的主要视图分为两部分。视图的下半部分是表格视图。
表视图由正常工作的异步proses填充。
如果用户点击选择项目,则会将其导航到另一个视图,以便他们更新所选项目。此更新导致重新加载数据源(因为编辑可能已影响其他项)和要重新加载的表视图。
在重新加载过程中,表视图不在视图中;但重新加载是在主线程上执行的。
除了选择顶部可见行之外,在所有情况下都可以正常工作。在这种情况下,单元格永远不会更新。每次选择重复使用时,视图都会使用创建的初始数据进行渲染。
从控制台输出中我可以看到正在所有单元格上调用准备重用。我还可以确认正在主线程上调用表上的重新加载操作。
表数据源(从MvxSimpleTableSource扩展)确实调用GetOrCreateCellFor的重载,并更新绑定项的数据。 我的所有调查都无法解决问题。
请任何人帮忙。
更新:我现在已经解决了这个问题,想了解它为什么会发生。
这个问题似乎是由于MvxSimpleTableSource的RowSelected方法的过载引起的。
public class Test extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
Question question=new Question();
getQuestionNo("nik",question);
Toast.makeText(Test.this, question.getQue(), Toast.LENGTH_LONG).show();
}
void getQuestionNo(String email, final Question question)
{
String urlQueNo = PageConfig.QUIZ_QUESTIONNO + email;
StringRequest stringRequest =
new StringRequest(urlQueNo, new Response.Listener<String>()
{
@Override
public void onResponse(String response)
{
question.setQue(response);
}
}, new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(Test.this,
"error on response1", Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
public class Question
{
private String que="hi";
public String getQue()
{
return que;
}
public void setQue(String que)
{
this.que = que;
}
}
绑定命令是异步的,并且代码适用于所有选定的行,除非它是顶部可见行。
当用户选择顶部可见行时,即使直接调用SetNeedsDisplay,单元格似乎也会进入永远不会更新视图的状态。
答案 0 :(得分:0)
不是100%肯定,但我相信这可能是问题所在:
var cell = this.GetCell(tableView, indexPath) as CustomTableCellWithImage;
GetCell
是操作系统在获取要显示的单元格时调用的方法。我不认为你应该自己打电话。相反,您可以使用tableView.CellAt(indexPath)
,因此请尝试将以上行替换为:
var cell = tableView.CellAt(indexPath) as CustomTableCellWithImage;