带有选项卡的片段中带有自定义适配器的列表视图不显示正确的数据
Listview with custom adapter in fragment with tabs doesnt show the correct data
我有一个带有 3 个选项卡的 ViewPager。这些选项卡是相同的片段。它有一个带有两个文本视图和一个图像按钮的自定义列表视图。所以,我有一个适配器和一个 class 用于每个项目。当我加载列表时,我想根据项目 class 中的值显示或不显示按钮。好吧,当 Activity 加载时,该图像只是忽略该值并随机显示或不显示。
这是适配器(我尝试用 d.getEnlace()
中的值填充 holder.descripcion
并正确显示,但按钮做了他想要的):
public class documentoAdapter extends ArrayAdapter<Documento> {
private final ArrayList<Documento> lista;
LayoutInflater inflater;
private String nombre, foto;
public documentoAdapter(Context context, ArrayList<Documento> lista) {
super(context, 0, lista);
this.lista = lista;
inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView,ViewGroup parent) {
final ViewHolder holder;
final Documento d = getItem(position);
if(convertView == null){
convertView = inflater.inflate(R.layout.documento, null);
}
holder = new ViewHolder();
holder.nombre = (TextView)convertView.findViewById(R.id.textNombre);
holder.descripcion = (TextView)convertView.findViewById(R.id.textDescripcion);
holder.enlace = (ImageButton)convertView.findViewById(R.id.imagenDescargar);
holder.nombre.setText(d.getNombre());
holder.descripcion.setText(Html.fromHtml(d.getDescripcion()));
holder.descripcion.setMovementMethod(LinkMovementMethod.getInstance());
if(!(d.getEnlace().equals("null"))){
holder.enlace.setVisibility(View.VISIBLE);
}
return convertView;
}
class ViewHolder {
TextView nombre;
TextView descripcion;
ImageButton enlace;
}
public int getCount() {
return lista.size();
}
//public boolean isEnabled(int position) {
// return false;
//}
public Documento getItem(int arg0) {
return lista.get(arg0);
}
public long getItemId(int position) {
return position;
}
}
第class项:
public class Documento {
private String nombre, descripcion, enlace;
private documentoAdapter adapter;
public Documento(String nombre, String descripcion, String enlace) {
this.nombre = nombre;
this.descripcion = descripcion;
this.enlace = enlace;
}
public String getNombre() {
return nombre;
}
public String getDescripcion() {
return descripcion;
}
public String getEnlace() {
return enlace;
}
public documentoAdapter getAdapter() {
return adapter;
}
public void setAdapter(documentoAdapter adapter) {
this.adapter = adapter;
}
}
在片段的 onCreate 中,我这样设置适配器:
documentoAdapter adapter = new documentoAdapter(getActivity(), datos);
ListView document_list = (ListView)rootView.findViewById(R.id.documentListView);
document_list.setAdapter(adapter);
两件事:
1. 你的 ViewHolder
现在的样子很没用。这个想法是你只为每个 View
实例化一个,然后在 View
被回收时重用它。
2. 请记住,列表行的 View
会被回收。所以 Button 可能已经设置为可见。如果不想显示,需要设置为不可见。
我有一个带有 3 个选项卡的 ViewPager。这些选项卡是相同的片段。它有一个带有两个文本视图和一个图像按钮的自定义列表视图。所以,我有一个适配器和一个 class 用于每个项目。当我加载列表时,我想根据项目 class 中的值显示或不显示按钮。好吧,当 Activity 加载时,该图像只是忽略该值并随机显示或不显示。
这是适配器(我尝试用 d.getEnlace()
中的值填充 holder.descripcion
并正确显示,但按钮做了他想要的):
public class documentoAdapter extends ArrayAdapter<Documento> {
private final ArrayList<Documento> lista;
LayoutInflater inflater;
private String nombre, foto;
public documentoAdapter(Context context, ArrayList<Documento> lista) {
super(context, 0, lista);
this.lista = lista;
inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView,ViewGroup parent) {
final ViewHolder holder;
final Documento d = getItem(position);
if(convertView == null){
convertView = inflater.inflate(R.layout.documento, null);
}
holder = new ViewHolder();
holder.nombre = (TextView)convertView.findViewById(R.id.textNombre);
holder.descripcion = (TextView)convertView.findViewById(R.id.textDescripcion);
holder.enlace = (ImageButton)convertView.findViewById(R.id.imagenDescargar);
holder.nombre.setText(d.getNombre());
holder.descripcion.setText(Html.fromHtml(d.getDescripcion()));
holder.descripcion.setMovementMethod(LinkMovementMethod.getInstance());
if(!(d.getEnlace().equals("null"))){
holder.enlace.setVisibility(View.VISIBLE);
}
return convertView;
}
class ViewHolder {
TextView nombre;
TextView descripcion;
ImageButton enlace;
}
public int getCount() {
return lista.size();
}
//public boolean isEnabled(int position) {
// return false;
//}
public Documento getItem(int arg0) {
return lista.get(arg0);
}
public long getItemId(int position) {
return position;
}
}
第class项:
public class Documento {
private String nombre, descripcion, enlace;
private documentoAdapter adapter;
public Documento(String nombre, String descripcion, String enlace) {
this.nombre = nombre;
this.descripcion = descripcion;
this.enlace = enlace;
}
public String getNombre() {
return nombre;
}
public String getDescripcion() {
return descripcion;
}
public String getEnlace() {
return enlace;
}
public documentoAdapter getAdapter() {
return adapter;
}
public void setAdapter(documentoAdapter adapter) {
this.adapter = adapter;
}
}
在片段的 onCreate 中,我这样设置适配器:
documentoAdapter adapter = new documentoAdapter(getActivity(), datos);
ListView document_list = (ListView)rootView.findViewById(R.id.documentListView);
document_list.setAdapter(adapter);
两件事:
1. 你的 ViewHolder
现在的样子很没用。这个想法是你只为每个 View
实例化一个,然后在 View
被回收时重用它。
2. 请记住,列表行的 View
会被回收。所以 Button 可能已经设置为可见。如果不想显示,需要设置为不可见。