我有一项活动,其唯一目的是显示列表视图。有一个自定义适配器可以为数组中的每个元素提供视图。
我到处都有断点,当我调试时,它在“计数”中停止多次 - 返回值为零的前几次,然后它变为3(在这种情况下为正确的值)。然后我们停在“getView” - 所有正确的东西发生,在我们通过所有断点之后,然后presto magico所有三个记录显示在屏幕上。是啊!
然后我尝试在调试器之外运行应用程序。我得到日志消息,它被访问“计数”,日志消息显示返回值,所以我知道它是正确的 - 但“getView”永远不会被调用!!
我不确定哪些代码与此问题相关&不想污染整个项目的问题;如果有一个特定的部分会有所帮助,请告诉我。我已经研究了所有“getView not called”问题,但这些问题始终是针对getView 从不被调用的情况,这显然可以......有时:(
编辑:适配器代码
public class DivisionAdapter extends BaseAdapter {
private static final String TAG = "DIV_ADAPT";
private ArrayList<Division> divisionList;
private Context context;
public DivisionAdapter(Context c, ArrayList<Division> divList) {
divisionList = divList;
context = c;
}
@Override
public int getCount() {
Integer count = 0;
if (divisionList != null) count = divisionList.size();
Log.v(TAG,count.toString());
return count;
}
@Override
public Object getItem(int position) {
Object o = null;
if (divisionList != null)
o = divisionList.get(position);
return o;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.v(TAG,"getView");
if (divisionList == null)
return null;
LinearLayout divisionView = null;
Division thisDiv = divisionList.get(position);
if (convertView == null) {
divisionView = new LinearLayout(context);
LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
li.inflate(R.layout.division_item, divisionView, true);
} else {
divisionView = (LinearLayout) convertView;
}
Log.v(TAG,thisDiv.name());
TextView v = (TextView) divisionView.findViewById(R.id.divisionName);
v.setText(thisDiv.name());
v = (TextView) divisionView.findViewById(R.id.divisionRegion);
v.setText(thisDiv.region());
return divisionView;
}
public void setList(ArrayList<Division> newList) {
divisionList = null;
divisionList = newList;
}
}
以防它有用,来自活动类的一些片段:
@Override
public void onResume() {
super.onResume();
refreshList();
}
private void refreshList() {
// use the class static query method to get the list of divisions
Division.query(Division.class,
new StackMobQuery().fieldIsEqualTo("status", "ACTIVE"),
new StackMobQueryCallback<Division>() {
@Override
public void failure(StackMobException arg0) {
// TODO Auto-generated method stub
Log.v(TAG, "query fail");
}
@Override
public void success(List<Division> arg0) {
Log.v(TAG, "query success");
divAdapt.setList((ArrayList<Division>) arg0);
divAdapt.notifyDataSetChanged();
}
});
}
编辑2/11: 我发现了这个问题:Markers not showing on map after stackmob query揭示了堆栈暴徒查询在后台线程上运行的迄今未知的事实。我开始研究线程和适配器之间的关系,并认为我会分享这个线索,以防它帮助其他任何人比我更快地弄清楚这里发生了什么。 TIA。
答案 0 :(得分:0)
idk为什么这个EVER在调试器中起作用 - 结果证明是一个红色的鲱鱼。
发现时,StackMobModel静态查询方法确实在后台线程中运行,从中调用NotifyDataSetChanged()完全无效。
我最终在StackMobQueryCallback中替换了success方法,如下所示:
@Override
public void success(final List<Division> arg0) {
Log.v(TAG, "query success");
runOnUiThread(new Runnable() {
public void run() {
updateList((ArrayList<Division>) arg0);
}
});
}
然后添加了这个新方法
private void updateList(ArrayList<Division> newList) {
divAdapt.setList(newList);
divAdapt.notifyDataSetChanged();
}
现在,当查询返回时,适配器更新将被指示在正确的线程上运行,并且万事如意,所有内容看起来都很好并且花花公子。
呼!