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() 可以在 Adapter 本身中使用。否则,您不需要从外部访问它的上下文。

更新:哦,我明白了,您还想跟踪适配器项目的位置。无需将其存储在 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 中有一个ArrayListArray某种类型的,它可以有一个布尔值列表(这将变得更加复杂,因为您想要保存更多的东西)。

然后,当您单击按钮时,只需将数组中的相应值设置为true.

例如,假设您有 10 行,但尚不应该显示任何进度条。您的数组如下所示:

[假,假,假,假,假,假,假,假,假,假]

假设在第 2 行(数组位置 1)上单击了按钮。然后,显示条形并将数组值设置为 true:

【假、真、假、假、假、假、假、假、假、假】

现在,在 中getView(),每当您扩充行布局时,您都可以检查数组,观察它是真还是假,并hidden/not hidden相应地设置进度条。

如果我对此不满意,我深表歉意,但我希望这会有所帮助。

于 2012-10-19T17:04:39.093 回答