另一个ListView的适配器中的ListView为每个视图调用getView

时间:2016-03-18 00:16:47

标签: android listview

我有以下课程:

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?

1 个答案:

答案 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开发的新手,但我很高兴我能想到这一点。

希望有一天能帮到别人。