使用ArrayAdapter查看列表中的项目的问题

时间:2012-10-19 16:40:55

标签: android android-listview android-arrayadapter

我的自定义数组适配器中的引用存在问题。 我有一个活动,我在一个布局中使用我的数组适配器,我已经定义了几个字段(包括我现在关心的那些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);

    }

我只想显示我点击的项目的进度条,而不显示其他任何项目。原因是重新利用列表但无法找到解决方案

2 个答案:

答案 0 :(得分:0)

我没有仔细评估你的代码,但我想我知道发生了什么。这是我的想法:

这是因为您的视图正在被回收,因此当该行再次膨胀时,您在getView()中执行的任何操作都可以撤消。

因此,你应该在CustomAdapter中使用某种类型的ArrayListArray,它可以包含一个布尔值列表(当你想获得更多东西时,这将变得更加复杂保存)。

然后,当您单击按钮时,只需将数组中的相应值设置为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()中,每当您对行布局进行充气时,您都可以检查数组,观察它是真还是假,并相应地将进度条设置为hidden/not hidden

如果我对此不以为然,我道歉,但我希望有所帮助。

答案 1 :(得分:0)

我想我理解你的问题。你有一个自定义适配器。适配器中的每个项目包含2个按钮和一个进度条。这些按钮控制着各自进度条的可见性。

我的西班牙语很弱但我想我理解你的代码。没有测试过这个,但它应该让你接近。您在Progressbar的标签中存储了我删除的内容。无法弄清楚你在那里做了什么,但你可以轻松地重新添加。看起来你试图遵循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;
}
}