我的自定义数组适配器中的引用存在问题。 我有一个活动,我在一个布局中使用我的数组适配器,我已经定义了几个字段(包括我现在关心的那些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);
}
我只想显示我点击的项目的进度条,而不显示其他任何项目。原因是重新利用列表但无法找到解决方案
答案 0 :(得分:0)
我没有仔细评估你的代码,但我想我知道发生了什么。这是我的想法:
这是因为您的视图正在被回收,因此当该行再次膨胀时,您在getView()中执行的任何操作都可以撤消。
因此,你应该在CustomAdapter中使用某种类型的ArrayList
或Array
,它可以包含一个布尔值列表(当你想获得更多东西时,这将变得更加复杂保存)。
然后,当您单击按钮时,只需将数组中的相应值设置为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;
}
}