【问题标题】:custom adapter getView only gets called while debugging自定义适配器 getView 仅在调试时被调用
【发布时间】:2014-02-09 19:02:12
【问题描述】:

我有一个活动,其唯一目的是显示列表视图。有一个自定义适配器为数组中的每个元素提供视图。

我到处都有断点,当我调试时,它在“计数”中停止了很多次——前几次返回值为零,然后它变为 3(在这种情况下是正确的值)。然后我们在“getView”中停下来——所有正确的事情都发生了,在我们完成所有断点之后,所有三个记录都显示在屏幕上。是的!

然后我尝试在调试器之外运行应用程序。我收到日志消息,它已访问“计数”,并且日志消息显示返回值,所以我知道它是正确的 - 但永远不会调用“getView”!

我不确定哪些代码与这个问题相关并且不想污染整个项目的问题;请让我知道是否有特定的部分会有所帮助。我已经研究了所有“getView not called”的问题,但这些问题始终是针对 getView never 被调用的情况,这显然是我的……有时:(

编辑:适配器代码

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;
}

}

为了以防万一它有用,来自活动类的一些sn-ps:

@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。

【问题讨论】:

  • 发布您的 getView() 方法/整个适配器类。
  • @Sagar 已编辑以包含适配器代码 - 谢谢
  • 另外:刚刚添加了一个空视图,如 this question - 即使当 count >0 时它也会显示

标签: android listview background-thread


【解决方案1】:

我知道为什么这在调试器中一直有效 - 结果证明这是一个红鲱鱼。

正如所发现的,StackMobModel 静态查询方法确实在后台线程中运行,从中调用 NotifyDataSetChanged() 完全无效。

我最终将 StackMobQueryCallback 中的成功方法替换如下:

                @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();

}

现在,当查询返回时,适配器更新将被引导到正确的线程上运行,万岁,一切看起来都很好,花花公子。

哇!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多