0

カスタムアレイアダプタの参照に問題があります。いくつかのフィールド(現在気になっている2つのボタンとプログレスバーを含む)を定義したレイアウトで配列アダプターを使用するアクティビティがあります。一方のボタンを押すとプログレスバーが表示され、もう一方のボタンを押すと非表示になります。

対応するボタンを押すと、進行状況バーがその行とともに表示されますが、リストをスクロールすると、リストを再利用するために表示されます。

押した行の進行状況を表示する以外の作り方を教えてください。(別の行を表示せずに)

これは私のxmlアダプターです(customadapterRutinalineadia)

これは私のxmlです:

        <Button
            android:id="@+id/btnLineasRutinaDiaEjercicioNoCompletado"
            android:layout_width="33sp"
            android:layout_height="27sp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="NoK"
            android:textSize="6sp" />

        <Button
            android:id="@+id/btnLineasRutinaDiaOk"
            android:layout_width="33sp"
            android:layout_height="27sp"
            android:layout_alignParentBottom="true"
            android:layout_toLeftOf="@+id/btnLineasRutinaDiaEjercicioNoCompletado"
            android:text="Ok"
            android:textSize="8sp" />



        <ProgressBar
            android:id="@+id/pgrLineasRutinaDiaProgreso"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_above="@+id/textView13"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_alignRight="@+id/chkLineasRutinaDiaHecho"
            android:visibility="invisible" />

ボタンbtnLineasRutinaDiaOkはプログレスバーを表示するために使用されます。ボタンbtnLineasRutinaDiaEjercicioNoCompletadoは、プログレスバーを非表示にするために使用されます。

これは私のArrayAdapter

public class CustomAdapterRutinaDiaLineas extends ArrayAdapter<Rutina>{

 ArrayList<Rutina> lstRutinaDia;
 ArrayList<Rutina> arrayDatos;
 Rutina objRutina;
 static Context context;


    public CustomAdapterRutinaDiaLineas(Context contexto, ArrayList<Rutina> arrayDatos) {
       super(contexto, R.layout.ll_lineas_rutina_dia, arrayDatos);
       this.arrayDatos = arrayDatos;
       this.context = contexto;
    }

      @Override
    public View getView( int position,  View convertView, ViewGroup parent){
        View vistaFila =null;

        final int ifila= position;
        //final View auxVistaFila=null;



        if (convertView == null) {
             //  LayoutInflater inflator = context.getLayoutInflater();


            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vistaFila = vi.inflate(R.layout.ll_lineas_rutina_dia, null);

            final View auxVistaFila = vistaFila;
          final ElementosLinea objelementos = new ElementosLinea();
           AsignarElementos(vistaFila,objelementos);


           objelementos.btnOk.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View re) {
                    // TODO Auto-generated method stub

            Rutina objru = (Rutina) objelementos.pgrProgresoCierre.getTag();


                AccesoBd objAcceso = new AccesoBd();
                objru._pgrProgress.setVisibility(View.VISIBLE);

                //new CerrarEjercicio().execute("http://"+objAcceso.IpPc+"/CerrarEjercicioUnico.php");                  
                }
            });


         objelementos.btncerrar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Rutina objru = (Rutina) objelementos.pgrProgresoCierre.getTag();

                    AccesoBd objAcceso = new AccesoBd();
                    objru._pgrProgress.setVisibility(View.INVISIBLE);


            }
        });

         vistaFila.setTag(objelementos);
         objelementos.pgrProgresoCierre.setTag(arrayDatos.get(position));


       }else{
           vistaFila=convertView;
           ((ElementosLinea) vistaFila.getTag()).pgrProgresoCierre.setTag(arrayDatos.get(position));
       }


      Rutina datossss = arrayDatos.get(position);
      ElementosLinea objetos = (ElementosLinea)vistaFila.getTag();

           if (datossss.getProgreso()==null){

               datossss.setProgreso(objetos.pgrProgresoCierre);

            }

    return vistaFila;

    }

    private void AsignarElementos(View v,ElementosLinea Objetos){

         //cabeceras

          Objetos.btnOk=(Button)v.findViewById(R.id.btnLineasRutinaDiaOk);

          Objetos.btncerrar=(Button)v.findViewById(R.id.btnLineasRutinaDiaEjercicioNoCompletado);


          Objetos.pgrProgresoCierre=(ProgressBar)v.findViewById(R.id.pgrLineasRutinaDiaProgreso);

    }

クリックしたアイテムのみのプログレスバーを表示し、他のアイテムは表示したくない。理由はリストを再利用することですが、解決策を見つけることができないということです

4

2 に答える 2

0

私はあなたの問題を理解したと思います。カスタムアダプタがあります。アダプタ内の各アイテムには、2つのボタンと進行状況バーが含まれています。ボタンは、それぞれのプログレスバーの表示を制御します。

私のスペイン語は弱いですが、私はあなたのコードを理解したと思います。これはテストしていませんが、近づけるはずです。削除したプログレスバーのタグ内に何かを保存していました。そこで何をしているのか理解できませんでしたが、簡単に追加できます。ViewHolderパラダイムに従おうとしていたようですが、少し混乱しています。うまくいけば、以下のコードがあなたを軌道に乗せるでしょう。

また、ArrayAdaptersコンテキストを静的グローバルフィールドに格納することはお勧めできません。ArrayAdapterには、アダプタ自体の中で使用するメソッドgetContext()がすでにあります。それ以外の場合は、外部からそのコンテキストにアクセスする必要はありません。

更新:ああ、そうですね、アダプターのアイテムの位置も追跡したいと思います。ProgressBarのタグ内にそれを保存する必要はありません。それを説明するためにサンプルコードを変更しました。

更新:正しく機能するようにコードを修正しました。

public class CustomAdapterRutinaDiaLineas extends ArrayAdapter<Rutina> {

ArrayList<Rutina> lstRutinaDia;
ArrayList<Rutina> arrayDatos;
Rutina            objRutina;

public CustomAdapterRutinaDiaLineas(Context contexto, ArrayList<Rutina> arrayDatos) {
    super(contexto, R.layout.ll_lineas_rutina_dia, arrayDatos);
    this.arrayDatos = arrayDatos;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vistaFila = null;
    ViewHolder vh;

    if (convertView == null) {
        LayoutInflater vi = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vistaFila = vi.inflate(R.layout.ll_lineas_rutina_dia, null);
        vh = new ViewHolder();

        vh.position = position;
        vh.btnOk = (Button) v.findViewById(R.id.btnLineasRutinaDiaOk);
        vh.btncerrar = (Button) v.findViewById(R.id.btnLineasRutinaDiaEjercicioNoCompletado);
        vh.pgrProgresoCierre = (ProgressBar) v.findViewById(R.id.pgrLineasRutinaDiaProgreso);
        vh.btnOk.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ProgressBar)v.getTag()).setVisibility(View.VISIBLE);
            }
        });
        vh.btncerrar.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ProgressBar)v.getTag()).setVisibility(View.INVISIBLE);
            }
        });
        vh.btncerrar.setTag(vh.pgrProgresoCierre);
        vh.btnOk.setTag(vh.pgrProgresoCierre);

        vistaFila.setTag(vh);
    } else {
        vistaFila = convertView;
        vh = (ViewHolder) vistaFila.getTag();
        vh.position = position;
    }

    Rutina datossss = arrayDatos.get(position);
    if (datossss.getProgreso() == null) {
        datossss.setProgreso(vh.pgrProgresoCierre);
    }

    return vistaFila;
}

private static class ViewHolder {
    int position;
    Button btnOk;
    Button btnCerrar;
    ProgressBar pgrProgresoCierre;
}
}
于 2012-10-19T17:24:33.210 に答える
0

私はあなたのコードを綿密に評価していませんが、何が起こっているのかはわかっていると思います。これが私の考えです:

これは、ビューがリサイクルされているためです。そのため、getView()で行ったすべての操作は、その行が再び膨らんだときに元に戻すことができます。

このため、 CustomAdapterには、ブール値のリストを含めることができるArrayListorArrayを含める必要があります(保存するものを増やしたい場合は、より複雑になります)。

次に、ボタンをクリックするときに、配列内の対応する値をに設定するだけですtrue

たとえば、10行あり、進行状況バーはまだ表示されていないとします。配列は次のようになります。

[false、false、false、false、false、false、false、false、false、false]

ボタンが行2(配列位置1)でクリックされたとしましょう。次に、バーを表示し、配列値をtrueに設定します。

[false、true、false、false、false、false、false、false、false、false]

これで、で、getView()行レイアウトを拡張するたびに、配列をチェックし、それがtrueかfalseかを観察し、それにhidden/not hidden応じてプログレスバーを設定できます。

申し訳ありませんが、お役に立てば幸いです。

于 2012-10-19T17:04:39.093 に答える