2014-02-09 93 views
2

我有一个活动,其唯一目的是显示一个列表视图。有一个自定义适配器用于为阵列中的每个元素提供视图。当我调试时,它会在“count”中停止多次 - 前几次返回值为零,然后它变为3(在这种情况下是正确的值)。然后我们停在“getView” - 所有正确的东西都会发生,并且在我们完成所有的中断点之后,所有三条记录都显示在屏幕上。是啊!自定义适配器getView只在调试时被调用

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

我不确定哪个代码位与这个问题有关&不想污染整个项目的问题;请让我知道是否有一个有用的特定部分。我研究过所有的“getView不叫”的问题,但那些始终是一个地方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

POst你的getView()方法/整个适配器类。 –

+0

@Sagar编辑包含适配器代码 - 谢谢 – ssdscott

+0

也:只是添加一个空的视图,因为在[这个问题](http://stackoverflow.com/questions/18670277/how-to-show-that-a-listview-is -empty-with-a-custom-list-adapter?rq = 1) - 即使count> 0,它也会显示出来 – ssdscott

回答

0

idk为什么这个EVER在调试器中工作 - 原来是一个红鲱鱼。

发现,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(); 

} 

现在,当查询返回时,适配器更新是针对在正确的线程上运行,万岁,一切都看起来很好,很好看。

哇!

相关问题