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

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

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

如果该项目已设置完成,它将显示一个检查图像视图; 这个imageview是列表视图的项目的一部分。

一切正常。 如果我滚动,退出活动并再次打开,取消选中项目,一切运作良好,并显示或隐藏相应的listview项目的imageview。

但我的问题是这样的:

我有2个button来sorting列表视图项目,按字母顺序和date的顺序。 当我点击他们,他们工作很好。 但是,该应用程序不显示已检查项目的图像视图。

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

我的问题是:

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

我有使用isfocused(),onfocuschanged(),onWindowChangeState()和所有这些types的方法,但他们都没有工作来触发我的方法。

有什么办法能够知道什么时候listview被填充,使检查出现在已经显示的项目,没有任何用户交互?

感谢您的时间和帮助。

PD:我已经有用户滚动列表的部分,那部分是照顾的。

我正在使用SimpleCursorAdapter来填充列表视图。

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

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

这是我用来sorting列表的方法:

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

而且,列表中项目的布局是:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/IdGstFijo" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="2" android:visibility="gone" android:gravity="center" android:lines="4" /> <TextView android:id="@+id/DescGstFijo" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="2" android:gravity="center" android:lines="4" /> <TextView android:id="@+id/CostoGstFijo" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="2" android:gravity="center" android:lines="4"/> <TextView android:id="@+id/FechaGstFijo" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="2" android:gravity="center" android:lines="4" /> <ImageView android:id="@+id/imgPagado" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="1" /> 

Solutions Collecting From Web of "如何知道什么时候listview完成在android上加载数据"

  1. 在列表视图上设置一个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(); 

我的解决scheme

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

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

我所要做的就是重写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被重新sorting或绘制或滚动视图刷新正确。

谢谢你们的帮助

您可以使用处理程序来完成此任务,如下所示:

在您的活动中添加处理程序作为任何其他财产。

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

它为我工作:mc.android.developer-code

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