如何个性化一个arrayAdapter?

How to personalize one arrayAdapter?

在我的项目中,我需要在两个不同的活动中显示相同的 arrayList。在 MainActivity 中,我只需要显示具有 isConsumido 属性 = false 的项目。在 TelaCadastrados activity 中,我需要显示整个 arrayList。我该怎么做?

package com.example.breno.seenme;

public class CustomAdapter extends ArrayAdapter<ItemCultural> {

public CustomAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
}

public CustomAdapter(Context context, int resource, List<ItemCultural> items) {
    super(context, resource, items);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if(this.getItem(position).isConsumido()){
        // I Think the code to hide elements with isConsumido = true
    }else{

    }
    return v;
}
}

在我的 MainActivity 适配器实例中。

        CustomAdapter myAdapter = new CustomAdapter(this, android.R.layout.simple_list_item_1, CustomAdapter.VIEW_TYPE_MAINACTIVITY);

这个 customAdapter 如何识别我的列表?

我的自定义适配器:

package com.example.breno.seenme;

public class CustomAdapter extends ArrayAdapter<ItemCultural> {

public static final int VIEW_TYPE_MAINACTIVITY = 124; // or some random int.
public static final int VIEW_TYPE_TELACADAS = 125; // or some random int.

private int viewType;
List<ItemCultural> lista;

public CustomAdapter(Context context, int textViewResourceId, int viewType) {
    super(context, textViewResourceId);
    this.viewType = viewType;
}

public CustomAdapter(Context context, int resource, List<ItemCultural> items, int viewType) {
    super(context, resource, items);
    this.viewType = viewType;
    this.lista = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (viewType == VIEW_TYPE_MAINACTIVITY) {
        // DO your logic for mainActivity version of the list.
        // I Think the code to hide elements with isConsumido = true
        if (!lista.get(position).isConsumido()) {
            //showThisView(v);
            v.setVisibility(View.GONE);
        } else {
            v.setVisibility(View.VISIBLE);
        }
    } else if (viewType == VIEW_TYPE_TELACADAS) {
        // DO your logic for Telacadas version of the list
    } else {
        // UNSUPPORTED VIEW TYPE.
    }
    return v;
}

}

你有2个选项。在您的 MainActivity 中,您可以将您的数据的副本传递给您的适配器,其中只有 isConsumido == false 条目。或者,您可以向适配器添加一些逻辑以跳过 isConsumido == true 的项目。您必须更新 getCount() 和 getView() 方法以考虑要跳过的项目。

这是内存(第一个解决方案中的更多内存)与复杂性(第二个解决方案更复杂,但内存效率更高,因为它使用单个列表)之间的通常权衡。

在构造适配器时,传递要渲染的视图类型,列表的 MainActivity 版本或列表的 TelaCadastradosActivity 版本。

所以你把你的适配器修改成这个

package com.example.breno.seenme;

public class CustomAdapter extends ArrayAdapter<ItemCultural> {

    public static final int VIEW_TYPE_MAINACTIVITY = 124; // or some random int.
    public static final int VIEW_TYPE_TELACADAS = 125; // or some random int.

    private int viewType;
    List<ItemCultural> lista;
    private final LayoutInflater mInflater;
    private int resource;

    public CustomAdapter(Context context, int textViewResourceId, int viewType) {
        super(context, textViewResourceId);
        this.viewType = viewType;
        mInflater = LayoutInflater.from(context);
    }

    public CustomAdapter(Context context, int resource, List<ItemCultural> items, int viewType) {
        super(context, resource, items);
        this.viewType = viewType;
        this.lista = items;
        mInflater = LayoutInflater.from(context);
        this.resource = resource;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v;
        if (convertView == null) {
            v = mInflater.inflate(resource, parent, false);
        } else {
            v = convertView;
        }
        if (viewType == VIEW_TYPE_MAINACTIVITY) {
            // DO your logic for mainActivity version of the list.
            // I Think the code to hide elements with isConsumido = true
            if (!lista.get(position).isConsumido()) {
                //showThisView(v);
                v.setVisibility(View.GONE);
            } else {
                v.setVisibility(View.VISIBLE);
                ((TextView)v).setText(lista.get(position).toString());
            }
        } else if (viewType == VIEW_TYPE_TELACADAS) {
            // DO your logic for Telacadas version of the list
        } else {
            // UNSUPPORTED VIEW TYPE.
        }
        return v;
    }
}

并且在你的 MainActivity 中你像这样实例化你的适配器

final CustomAdapter arrayAdapterOrdenado = new CustomAdapter(this, android.R.layout.simple_list_item_1, regraDeNegocioSingleton.getListaDeItensSingleton().getListaDeItensCulturais(). CustomAdapter.VIEW_TYPE_MAINACTIVITY);

对于您传入 TelaCadas 视图类型的 TelaCadasActivity

final CustomAdapter arrayAdapterOrdenado = new CustomAdapter(this, android.R.layout.simple_list_item_1, regraDeNegocioSingleton.getListaDeItensSingleton().getListaDeItensCulturais(). CustomAdapter.VIEW_TYPE_TELACADAS);