11

現在、やらなければならないことの情報を表示するリスト ビューがあります。

ユーザーがリストビューの項目をクリックすると、アプリはクリックされた項目を確認し、完了として設定します。

アイテムが完了として設定されている場合、チェック付きのイメージ ビューが表示されます。このイメージビューは、リストビューのアイテムの一部です。

すべてがうまくいっています。スクロールしてアクティビティを終了して再度開くと、アイテムのチェックを外すと、すべてが正常に機能し、対応するリストビューアイテムのイメージビューを表示または非表示にします。

しかし、私の問題はこれです:

リスト ビューの項目をアルファベット順と日付順に並べ替えるための 2 つのボタンがあります。それらをクリックすると、うまく機能します。しかし、アプリはチェックされたアイテムのイメージビューを表示しません。

これは、チェックを表示するには、リストビューを完全にロードする必要があるためです。つまり、すべての情報をアクティビティに表示します。

私の質問は:

どのアイテムがチェックされて画像ビューを表示するかを確認するメソッドを呼び出すことができるように、リスト ビューの作成または読み込みがいつ完了したかを知るにはどうすればよいですか?

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"

    />

4

5 に答える 5

4

「データの読み込みを終了する」という条件に依存するのではなく、その場で画像ビューの可視性を設定する必要があります。

リスト ビュー アダプターの 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;
}
于 2013-09-05T05:14:01.633 に答える
2

次のように、ハンドラーを使用してこのタスクを実行できます。

アクティビティで、ハンドラーを他のプロパティとして追加します。

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;
     }
于 2014-10-05T12:49:28.150 に答える