2013-09-05 12 views
8

Obecnie mam widok listy, który wyświetla informacje o rzeczach, które muszą być zrobione.jak się dowiedzieć, kiedy kończy się ładowanie listview na Androidzie

Gdy użytkownik kliknie element na liście, aplikacja sprawdza, który element został kliknięty i ustawiony jako gotowy.

Jeśli pozycja została ustawiona jako wykonana, wyświetli obraz z zaznaczeniem; ten widok jest częścią elementu listy.

wszystko działa dobrze. Jeśli przewijam, zakończ działanie i otwórz je ponownie, odznacz element, wszystko działa dobrze i pokazuje lub ukrywa widok obrazu odpowiedniego elementu listy.

ale mój problem jest to, że:

mam 2 przyciski, aby sortować elementy widoku listy alfabetycznie oraz według daty. Kiedy je klikam, działają świetnie. ALE, aplikacja nie pokazuje widoku obrazu elementów, które zostały sprawdzone.

Wiem, że to dlatego, że aby pojawiły się kontrole, potrzebuję pełnego załadowania listy. Mam na myśli, pokaż w działaniu wszystkie informacje.

Moje pytanie brzmi:

Skąd mogę wiedzieć, kiedy widok listy odbywa wypełniania lub załadunku, tak że mogę wywołać metodę upewnić, które elementy zostały wyboru, aby wyświetlić podgląd obrazu?

Używam isfocused(), onfocuschanged(), onWindowChangeState() i wszystkich tych typów metod, ale żaden z nich nie uruchamia mojej metody.

Czy istnieje sposób sprawdzenia, czy pojawił się widok listy, aby sprawić, że pojawi się on na pokazanych przedmiotach, bez interakcji użytkownika?

Dziękujemy za poświęcony czas i pomoc.

PD: Mam już część, w której użytkownik przewija listę, ta część jest pod opieką.

Używam SimpleCursorAdapter do wypełnienia listy.

To gdzie ja wypełnić widoku listy:

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

      }); 

    } 

Jest to metoda, że ​​zrobiłem poruszanie się przedmiotów, które są widoczne i sprawdzić, czy zostały one sprawdzone, czy nie

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

ten to metoda, której używam do sortowania listy:

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

i cóż, układ pozycji na liście s:

<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" 

    /> 

+0

jej zbyt długo zachowaj sortowanie czy chcesz czegoś na końcu listy? – Trikaldarshi

+0

Jedna rzecz, która nigdy się nie kończy Załaduj tylko te elementy, które są aktualnie wyświetlane podczas przewijania, a inne są ładowane – Trikaldarshi

+0

Cześć :) i jak wiedzieć, kiedy elementy, które są obecnie wyświetlane, są ładowane? To jest to, czego potrzebuję, abym mógł zadzwonić do mojej metody i umieścić czek na elementach, które wcześniej sprawdził użytkownik. – user2549221

Odpowiedz

2

Ok, udaje mi się rozwiązać problem.

Wszystko, co musiałem zrobić, było zastąpione metodą getView, jak powiedziałem.

Ale ponieważ Im używając SimpleCursorAdapter rozszerzonego klasy, musiałem zrobić coś takiego:

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

SO, że zrobił to pracę, a teraz za każdym ListView jest kolejność lub ciągnione lub przewijane widoki są odświeżony poprawnie.

Dzięki chłopaki za pomoc

3

Nie należy polegać na stan ładowania danych „Finish”, a nie, należy ustawić widoczność zobaczyć obraz w locie.

Powinieneś zrobić coś takiego w metodzie getView adaptera widoku listy.

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

Można użyć Handler do wykonania tego zadania, na przykład:

W swojej aktywności dodać Handler jak każdy inny obiekt.

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

A wewnątrz metody getView swojej pogrupowanych zrobić porównanie, czy aktualna pozycja jest ostatni, więc będzie to zakończyć (wystarczy umieścić go przed powrotem):

public View getView(int position, View convertView, ViewGroup parent) { 
     //Your views logic here 

     if (position == mObjects.size() - 1) { 
       mViewDidLoadHanlder.sendEmptyMessage(0); 
      } 

     return convertView; 
    } 
+3

Liczba pozycji wyświetlanych w widoku listy nie jest skorelowana z całkowitą liczbą w zbiorze danych (mObjects).Lista zakończy renderowanie, gdy wyświetlany jest ostatni "widoczny" element, a NIE, gdy wyświetlana jest ostatnia pozycja w zestawie danych. – AndroidDev

9
  1. Skonfiguruj addOnLayoutChangeListener w widoku listy
  2. Zadzwoń .notifyDataSetChanged();
  3. To wystrzelić z OnLayoutChangeListener raz zakończone
  4. Usuń słuchacza

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

Wygląda na to, że skopiowałeś odpowiedź [this] (https://stackoverflow.com/a/29173680/3808178) bez dodawania linku. –

4

Moje rozwiązanie:

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

on pracował dla mnie: mc.android.developer-code

listview.getViewTreeObserver().addOnPreDrawListener(onPreDrawListener); 

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

    //do changes 
     return true; 
    } 
}; 
Powiązane problemy