如何知道listview何时完成在android上加载数据

我目前有一个列表视图,显示必须完成的事情的信息。

当用户单击列表视图上的项目时,应用程序将检查已单击的项目并将其设置为已完成。

如果项目已设置为已完成,则会显示带有检查的图像视图; 此imageview是listview项目的一部分。

一切都运作良好。 如果我滚动,退出活动并再次打开它,取消选中该项,一切正常,并显示或隐藏相应列表视图项的图像视图。

但我的问题是:

我有2个按钮来按字母顺序和日期顺序对列表视图项进行排序。 当我点击它们时,它们工作得很好。 但是,应用程序不会显示已检查项目的图像视图。

我知道这是因为为了使检查出现,我需要将listview完全加载。 我的意思是,在活动中显示所有信息。

我的问题是:

我怎么知道列表视图何时填充或加载,以便我可以调用确保哪些项目已经检查以显示图像视图的方法?

我使用了isfocused(),onfocuschanged(),onWindowChangeState()以及所有这些types的方法,但它们都不能用于触发我的方法。

是否有任何方法可以知道列表视图何时填充以使检查显示在已显示的项目上,而无需任何用户交互?

感谢您的时间和帮助。

PD:我已经拥有用户滚动列表的部分,该部分已经完成。

我正在使用SimpleCursorAdapter来填充listview。

这是我填充列表视图的地方:

public void mostrarLista(){ Cursor c = admin.obtenerCursorGastosFijos(ordenadoPor); // The desired columns to be bound String[] columnas = new String[] {"_id", "Descripcion", "Costo_Estimado", "Fecha_Pago"}; // the XML defined views which the data will be bound to int[] views = new int[] {R.id.IdGstFijo, R.id.DescGstFijo, R.id.CostoGstFijo, R.id.FechaGstFijo }; // create the adapter using the cursor pointing to the desired data //as well as the layout information dataAdapter = new SimpleCursorAdapter(this, R.layout.lista_gastos_fijos, c, columnas, views, 0); listaGastos = (ListView) findViewById(R.id.listaGastosFijos1); // Assign adapter to ListView listaGastos.setAdapter(dataAdapter); listaGastos.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView Listview, View v, int position, long id) { // TODO Auto-generated method stub Cursor cursor = (Cursor) Listview.getItemAtPosition(position); String idGst=cursor.getString(cursor.getColumnIndexOrThrow("_id")); dialogoOpcionesGst(Integer.parseInt(idGst), v).show(); return true; } }); listaGastos.setOnScrollListener(new OnScrollListener(){ @Override public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void onScrollStateChanged(AbsListView arg0, int arg1) { // TODO Auto-generated method stub mostrarItemsPagados(listaGastos); } }); } 

这是我用来导航可见项目并查看它们是否被选中的方法

 public void mostrarItemsPagados(ListView lista){ for (int i = 0; i <= lista.getLastVisiblePosition() - lista.getFirstVisiblePosition(); i++){ View item = (View)lista.getChildAt(i); ImageView img = (ImageView)item.findViewById(R.id.imgPagado); if(admin.existeGstFijoReal(Integer.parseInt(((TextView)item.findViewById(R.id.IdGstFijo)).getText().toString()))){ img.setImageResource(R.drawable.img_check); } else img.setImageDrawable(null); } } 

这是我用来排序列表的方法:

  public void ordenarNombre(View v){ ordenadoPor=1; mostrarLista(); } 

好吧,列表中项目的布局是:

       

  1. 在listview上设置addOnLayoutChangeListener
  2. 调用.notifyDataSetChanged();
  3. 这将在完成后触发OnLayoutChangeListener
  4. 删除监听器

     listaGastos.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { listaGastos.removeOnLayoutChangeListener(this); Log.d(TAG, "list got updated, do what ever u want"); } }); dataAdapter.notifyDataSetChanged(); 

我的解决方案

 list = (ListView) findViewById(R.id.list); list.getViewTreeObserver().addOnPreDrawListener(mOnPreDrawListener); ... private final ViewTreeObserver.OnPreDrawListener mOnPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { mMessageList.getViewTreeObserver().removeOnPreDrawListener(this); // Do what you want to do on data loading here return true; } }; 

您不应该依赖“完成加载数据”的条件,而是应该动态设置图像视图可见性。

您应该在列表视图适配器的getView方法中执行类似的操作。

 @Override public View getView(int position, View convertView, ViewGroup parent) { final ItemView item; if (convertView == null) { item = mLayoutInflator.inflate(R.layout.listlayout) } else { item = (ItemView) convertView; } ImageView image = (ImageView)item.findViewById(R.id.yourimageidinitemview); if(mTodoTask[posistion].isChecked) { image.setVisibility(View.Visible); } else { image.setVisibility(View.Invisible); } return item; } 

它对我有用:mc.android.developer-code

 listview.getViewTreeObserver().addOnPreDrawListener(onPreDrawListener); private final ViewTreeObserver.OnPreDrawListener OnPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { //do changes return true; } }; 

好的,我设法解决了这个问题。

我所要做的就是覆盖getView方法。

但是,因为我使用SimpleCursorAdapter扩展类,我必须做这样的事情:

 public View getView(int position, View convertView, ViewGroup parent){ View item = super.getView(position, convertView, parent); //Validation code for drawing or not the check image return item; } 

所以,这完成了工作,现在每次listview重新排序或绘制或滚动时,视图都会正确刷新。

谢谢大家的帮助

您可以使用Handler来完成此任务,如下所示:

在您的活动中,将Handler添加为任何其他属性。

 private Handler mListViewDidLoadHanlder = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message message) { //Do whatever you need here the listview is loaded return false; } }); 

在listview的getView方法中,你进行比较以查看当前位置是否是最后一个位置,因此,它将完成(只需将它放在返回之前):

 public View getView(int position, View convertView, ViewGroup parent) { //Your views logic here if (position == mObjects.size() - 1) { mViewDidLoadHanlder.sendEmptyMessage(0); } return convertView; }