Intereting Posts
Android Map API v2 не отображает карту на некоторых устройствах Сообщение обработчика Android и ListView Android AppStateManager :: Внутренняя утечка данных в обнаруженном объекте DataBuffer Android – Изменить цвет темы темы Holo по умолчанию Как встраивать i-jetty сервер в приложение для Android? Как добавить пользовательский вид в JellyBean Launcher для Android Как переключить / изменить testInstrumentationRunner динамически с помощью gradle Исключение при вызове метода setDataSource (FileDescriptor) (не удалось: status = 0x80000000) Как представить отношения «многие-ко-многим» в XML или другом простом формате? Метод onDateChanged не работает Android Возможно ли разместить шаблон ограничения внутри ScrollView API уведомлений в браузере Android Chrome Android Сохранить объект как blob в sqlite Не удается создать папку на внешнем хранилище на Android Honeycomb Android-эмулятор – собака медленная – будет ли она управляться до официального релиза?

Как узнать, когда список окончен, загрузив данные на Android

В настоящее время у меня есть список, который отображает информацию о том, что нужно сделать.

Когда пользователь щелкает элемент в списке, приложение проверяет, какой элемент был нажат и установлен как выполнен.

Если элемент был установлен как выполненный, он будет показывать изображение с проверкой; Это изображение является частью элемента списка.

Все работает хорошо. Если я прокрутку, выйдите из действия и откройте его снова, снимите отметку с элемента, все будет хорошо работать и отобразит или скроет изображение соответствующего элемента списка.

НО моя проблема в том, что это:

У меня есть 2 кнопки для сортировки элементов списка, в алфавитном порядке и по порядку даты. Когда я нажимаю на них, они отлично работают. НО, приложение не отображает изображение просмотренных элементов.

Я знаю, это потому, что для того, чтобы сделать проверки, мне нужно, чтобы listview был полностью загружен. Я имею в виду, показывать в своей деятельности всю информацию.

Мой вопрос:

Как узнать, когда заполняется или загружается представление списка, чтобы я мог вызвать метод, который проверяет, какие элементы были проверены, чтобы показать изображение?

У меня есть isfocused (), onfocuschanged (), onWindowChangeState () и все эти типы методов, но ни один из них не работает для запуска моего метода.

Есть ли способ узнать, когда список заполняется, чтобы проверка отображалась на отображаемых элементах без какого-либо взаимодействия с пользователем?

Спасибо за ваше время и помощь.

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

Это метод, который я использую для сортировки списка:

  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 "Как узнать, когда список окончен, загрузив данные на 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(); 

Вы не должны полагаться на условие «закончить загрузку данных», вместо этого вы должны установить видимость изображения на лету.

Вы должны сделать что-то подобное в своем методе 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; } 

Мое решение:

 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, как сказано.

Но, поскольку я использовал расширенный класс 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; } 

Таким образом, это выполнило эту работу, и теперь каждый раз, когда список просматривается переупорядоченным или нарисованным или прокручивается, просмотры обновляются правильно.

Спасибо, ребята, за помощь

Вы можете использовать обработчик для выполнения этой задачи, например:

В своей деятельности добавьте обработчик как любое другое свойство.

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

И внутри метода 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; } };