我有以下课程:
public class AssociadosSituacaoVO implements Comparable<AssociadosSituacaoVO>{
private String situacao;
private ArrayList<AssociadoVO> associados;
public String getSituacao() {return situacao;}
public void setSituacao(String situacao) {this.situacao = situacao;}
public ArrayList<AssociadoVO> getAssociados() {return associados;}
public void addAssociado(AssociadoVO associado){associados.add(associado);}
public void setAssociados(ArrayList<AssociadoVO> associados) {this.associados = associados;}
@Override
public int compareTo(AssociadosSituacaoVO another) {return Utilidades.compareToLongLower(getOrder(), another.getOrder());}
}
并且此类具有以下适配器:
public class AdapterListViewListaAssociados extends BaseAdapter {
private LayoutInflater mInflater;
private List<AssociadosSituacaoVO> itens;
private Context context;
private ArrayList<AdapterListViewAssociados> adapters;
public AdapterListViewListaAssociados(Context context, List<AssociadosSituacaoVO> itens) {
this.context = context;
this.itens = itens;
mInflater = LayoutInflater.from(context);
adapters = new ArrayList<>();
Collections.sort(itens);
}
public void setItens(List<AssociadosSituacaoVO> itens) {
this.itens = itens;
Collections.sort(itens);
notifyDataSetChanged();
}
public void clearData() {
itens.clear();
notifyDataSetChanged();
}
public int getCount() {
return itens.size();
}
public AssociadosSituacaoVO getItem(int position) {
return itens.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup parent) {
Log.i("MyInfo", "AdapterListViewListaAssociados.getView(" + position + ");");
final AssociadosSituacaoVO item = itens.get(position);
view = mInflater.inflate(R.layout.listviewitem_associados_lista, null);
final TextView tvListaNome = (TextView) view.findViewById(R.id.tvListaNome);
final ListView listViewLista = (ListView) view.findViewById(R.id.listViewListaAssociados);
tvListaNome.setText(item.getSituacao());
if (adapters.size() - 1 < position) {
Log.i("MyInfo", "if (" + (adapters.size() - 1) + " < " + position + ")");
adapters.add(new AdapterListViewAssociados(context, item.getAssociados(), true));
listViewLista.setAdapter(adapters.get(position));
listViewLista.setOnItemClickListener(click);
Utilidades.setListViewHeightBasedOnChildren(listViewLista);
} else {
Log.i("MyInfo", "else (" + (adapters.size() - 1) + " < " + position + ")");
listViewLista.setAdapter(adapters.get(position));
listViewLista.setOnItemClickListener(click);
Utilidades.setListViewHeightBasedOnChildren(listViewLista);
}
return view;
}
ListView.OnItemClickListener click = new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (AppUserAtualVO.iduser == 0) {
Toast.makeText(context, "Você precisa estar logado para acessar informações desse associado.", Toast.LENGTH_SHORT).show();
} else if (AppUserAtualVO.pverdadosassociados == 0) {
Toast.makeText(context, "Você não tem permissão para acessar essas informações.", Toast.LENGTH_SHORT).show();
} else {
AssociadoVO item = adapters.get(position).getItem(position);
Intent intent = new Intent(context, AssociadoActivity.class);
intent.putExtra("associado", item);
context.startActivity(intent);
}
}
};
}
方法Utilidades.setListViewHeightBasedOnChildren(ListView):
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
return;
int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, view, listView);
if (i == 0)
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, ViewGroup.LayoutParams.WRAP_CONTENT));
view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
listviewitem_associado_lista.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" //(also tried wrap)
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tvListaNome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="New Text"
android:gravity="center"
android:textStyle="bold"
android:textColor="@color/colorPrimarySoft"
android:background="@color/colorPrimary" />
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listViewListaAssociados" />
</LinearLayout>
结果: 一旦AdapterListViewListaAssociados调用方法getView(),它就会在子列表视图(listViewListaAssociados)中为itens创建适配器(如果它不存在),然后,当它从子列表视图调用视图时,它会调用每个视图,而不是那些出现在屏幕上的但都是。
日志:
I/MyInfo: AdapterListViewListaAssociados.getView(0);
I/MyInfo: if (-1 < 0)
I/MyInfo: AdapterListViewAssociados.getView(0);
I/MyInfo: AdapterListViewAssociados.getView(1);
I/MyInfo: AdapterListViewAssociados.getView(2);
I/MyInfo: AdapterListViewAssociados.getView(3);
I/MyInfo: AdapterListViewAssociados.getView(4);
I/MyInfo: AdapterListViewAssociados.getView(5);
I/MyInfo: AdapterListViewAssociados.getView(6);
I/MyInfo: AdapterListViewAssociados.getView(7);
I/MyInfo: AdapterListViewAssociados.getView(8);
I/MyInfo: AdapterListViewAssociados.getView(9);
I/MyInfo: AdapterListViewAssociados.getView(10);
I/MyInfo: AdapterListViewAssociados.getView(11);
I/MyInfo: AdapterListViewAssociados.getView(12);
I/MyInfo: AdapterListViewAssociados.getView(13);
I/MyInfo: AdapterListViewAssociados.getView(14);
I/MyInfo: AdapterListViewAssociados.getView(15);
I/MyInfo: AdapterListViewAssociados.getView(16);
I/MyInfo: AdapterListViewAssociados.getView(17);
I/MyInfo: AdapterListViewAssociados.getView(0);
I/MyInfo: AdapterListViewAssociados.getView(1);
I/MyInfo: AdapterListViewAssociados.getView(2);
I/MyInfo: AdapterListViewAssociados.getView(3);
I/MyInfo: AdapterListViewAssociados.getView(4);
I/MyInfo: AdapterListViewAssociados.getView(5);
I/MyInfo: AdapterListViewAssociados.getView(6);
I/MyInfo: AdapterListViewAssociados.getView(7);
I/MyInfo: AdapterListViewAssociados.getView(8);
I/MyInfo: AdapterListViewAssociados.getView(9);
I/MyInfo: AdapterListViewAssociados.getView(10);
I/MyInfo: AdapterListViewAssociados.getView(11);
I/MyInfo: AdapterListViewAssociados.getView(12);
I/MyInfo: AdapterListViewAssociados.getView(13);
I/MyInfo: AdapterListViewAssociados.getView(14);
I/MyInfo: AdapterListViewAssociados.getView(15);
I/MyInfo: AdapterListViewAssociados.getView(16);
I/MyInfo: AdapterListViewAssociados.getView(17);
然后我滚动到底部:
I/MyInfo: AdapterListViewListaAssociados.getView(2);
I/MyInfo: if (1 < 2)
I/MyInfo: AdapterListViewAssociados.getView(0);
I/MyInfo: AdapterListViewAssociados.getView(1);
I/MyInfo: AdapterListViewAssociados.getView(2);
I/MyInfo: AdapterListViewAssociados.getView(3);
I/MyInfo: AdapterListViewAssociados.getView(4);
I/MyInfo: AdapterListViewAssociados.getView(0);
I/MyInfo: AdapterListViewAssociados.getView(1);
I/MyInfo: AdapterListViewAssociados.getView(2);
I/MyInfo: AdapterListViewAssociados.getView(3);
I/MyInfo: AdapterListViewAssociados.getView(4);
I/MyInfo: AdapterListViewListaAssociados.getView(3);
I/MyInfo: if (2 < 3)
I/MyInfo: AdapterListViewAssociados.getView(0);
I/MyInfo: AdapterListViewAssociados.getView(0);
问题:
一旦子列表视图出现时获取所有视图,则需要一点点加载。 是由于使用Utilidades.setListViewHeightBasedOnChildren(ListView)引起的:?我尝试没有它,但它只显示1-2个视图...
如何在子视图中使用getView仅在使用过的视图中使用getView?
答案 0 :(得分:0)
我没有解决它,但我意识到方法Utilidades.setListViewHeightBasedOnChildren(ListView)正在调用子列表视图中的每个视图......
所以我创建了一个扩展了具有标题/节名称的AssociadoVO的类(这就是重点,我试图创建一个标题,所以每个AssociadosSituacaoVO都有一个标题,然后我只使用了1个列表使用AdapterListViewAssociados的视图,在这里我在getView方法中有这个代码:
public View getView(final int position, View view, ViewGroup parent) {
Log.i("MyInfo", "AdapterListViewAssociados.getView(" + position + ");");
final AssociadoVO item = itens.get(position);
if (item instanceof SituacaoVO) {
SituacaoVO situacao = (SituacaoVO) item;
view = mInflater.inflate(R.layout.listviewitem_associados_header, null);
TextView tvListaNome = (TextView) view.findViewById(R.id.tvListaNome);
tvListaNome.setText(situacao.getNomeSituacao());
}else{
view = mInflater.inflate(R.layout.listviewitem_associado, null);
// deal with the normal layout of AssociadoVO...
}
return view;
}
我是android开发的新手,但我很高兴我能想到这一点。
希望有一天能帮到别人。