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

    />

Ответ 1

Хорошо, мне удается решить проблему.

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

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

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

Ответ 2

  • Настройка addOnLayoutChangeListener в списке
  • Вызов .notifyDataSetChanged();
  • Это приведет к отключению OnLayoutChangeListener после завершения
  • Удалить прослушиватель

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

Ответ 3

Мое решение:

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

Ответ 4

У меня это сработало (mc.android.developer):

listview.getViewTreeObserver().addOnPreDrawListener(OnPreDrawListener);

private final ViewTreeObserver.OnPreDrawListener OnPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {

    //do changes
        return true;
    }
};

Ответ 5

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

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

Ответ 6

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

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

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