2013-09-05 52 views
8

Tôi hiện có chế độ xem danh sách hiển thị thông tin về những việc phải thực hiện.cách biết khi nào danh sách xem xong tải dữ liệu trên android

Khi người dùng nhấp vào mục trên danh sách xem, sau đó ứng dụng sẽ kiểm tra mục nào đã được nhấp và đặt là xong.

Nếu mục đã được đặt là xong, nó sẽ hiển thị số lần xem hình ảnh với séc; imageview này là một phần của mục của chế độ xem danh sách.

mọi thứ hoạt động tốt. Nếu tôi cuộn, thoát hoạt động và mở lại, bỏ chọn mục, mọi thứ hoạt động tốt và hiển thị hoặc ẩn số lần xem ảnh của mục listview tương ứng.

NHƯNG vấn đề của tôi là:

Tôi có 2 nút để sắp xếp các mục xem danh sách, theo thứ tự bảng chữ cái và theo thứ tự ngày tháng. Khi tôi nhấp vào chúng, chúng hoạt động rất tốt. NHƯNG, ứng dụng không hiển thị số lần xem hình ảnh của các mục đã được chọn.

Tôi biết điều này là do để kiểm tra xuất hiện, tôi cần danh sách xem được tải đầy đủ. Ý tôi là, hiển thị trong hoạt động với tất cả thông tin.

Câu hỏi của tôi là:

Làm thế nào tôi có thể biết khi xem danh sách được thực hiện Populating hoặc tải, vì vậy mà tôi có thể gọi phương thức đó đảm bảo các mục đã được kiểm để hiển thị các điểm ảnh?

Tôi đã sử dụng hàm isfocused(), onfocuschanged(), onWindowChangeState() và tất cả các loại phương pháp đó, nhưng không có phương thức nào hoạt động để kích hoạt phương thức của tôi.

Có cách nào để có thể biết khi nào chế độ xem danh sách được điền để kiểm tra xuất hiện trên các mục được hiển thị mà không có bất kỳ tương tác người dùng nào không?

Cảm ơn bạn đã dành thời gian và trợ giúp.

PD: Tôi đã có một phần nơi người dùng cuộn danh sách, phần đó sẽ được xử lý.

Tôi đang sử dụng SimpleCursorAdapter để điền vào chế độ xem danh sách.

Đây là nơi tôi vào chế độ xem danh sách:

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

      }); 

    } 

Đây là phương pháp mà tôi đã để di chuyển các mục mà có thể nhìn thấy và xem họ đã được kiểm tra hay không

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

này là phương pháp tôi sử dụng để sắp xếp danh sách:

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

và bố cục của mục trong danh sách i 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

quá dài giữ cho nó sắp xếp để bạn muốn một cái gì đó ở cuối danh sách – Trikaldarshi

+0

Một điều nó không bao giờ kết thúc tải chỉ những mục được tải hiện đang được hiển thị khi bạn cuộn sau đó các mục khác đang được tải – Trikaldarshi

+0

Xin chào :) và cách thế nào để tôi biết khi nào các mục hiện đang được hiển thị, được tải xong? Đó là những gì tôi cần để tôi có thể gọi phương thức của mình và đặt dấu kiểm vào các mục mà người dùng đã chọn trước đó. – user2549221

Trả lời

2

Ok, tôi quản lý để giải quyết vấn đề.

Tất cả những gì tôi phải làm, đã ghi đè phương thức getView như đã nói.

Nhưng, vì Im sử dụng một SimpleCursorAdapter mở rộng Class, tôi đã phải làm một cái gì đó như thế này:

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

Vì vậy, điều đó đã làm công việc, và bây giờ mọi listview được sắp xếp lại hoặc kéo hoặc cuộn các quan điểm làm mới chính xác.

Thanks guys cho sự giúp đỡ

3

Bạn không nên dựa vào các điều kiện của việc "tải dữ liệu kết thúc", thay vào đó, bạn nên thiết lập khả năng hiển thị xem hình ảnh một cách nhanh chóng.

Bạn nên làm điều gì đó như thế này trong phương thức getView của bộ điều hợp chế độ xem danh sách.

@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

Bạn có thể sử dụng một Handler để hoàn thành nhiệm vụ này, như thế này:

Trong hoạt động của bạn thêm Handler như bất kỳ tài sản khác.

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

Và bên trong phương pháp getView của listview của bạn, bạn làm việc so sánh để xem vị trí hiện tại là người cuối cùng, vì vậy, nó sẽ kết thúc (chỉ cần đặt nó trước khi trở về):

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

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

     return convertView; 
    } 
+3

Số lượng mục được hiển thị trong một listview không tương quan với tổng số trong tập dữ liệu (mObjects).Danh sách sẽ hoàn thành hiển thị khi mục "hiển thị" cuối cùng được hiển thị và KHÔNG khi mục cuối cùng trong tập dữ liệu được hiển thị. – AndroidDev

9
  1. Thiết lập addOnLayoutChangeListener trên danh sách xem
  2. Gọi .notifyDataSetChanged();
  3. này sẽ bắn ra các OnLayoutChangeListener khi hoàn thành
  4. Tháo nghe

    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

Bạn dường như đã sao chép [this] (https://stackoverflow.com/a/29173680/3808178) trả lời mà không cần thêm liên kết. –

4

Giải pháp của tôi:

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

Nó làm việc cho tôi: mc.android.developer mã

listview.getViewTreeObserver().addOnPreDrawListener(onPreDrawListener); 

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

    //do changes 
     return true; 
    } 
};