Java 如何个性化一个arrayAdapter?

Java 如何个性化一个arrayAdapter?,java,android,listview,android-arrayadapter,Java,Android,Listview,Android Arrayadapter,我的项目我需要在两个不同的活动中显示相同的arrayList。在MainActivity中,我只需要显示isConsumido atribute=false的项目。在TelaCadastrados活动中,我需要显示整个arrayList。我怎么做到的 package com.example.breno.seenme; public class CustomAdapter extends ArrayAdapter<ItemCultural> { public CustomAdapt

我的项目我需要在两个不同的活动中显示相同的arrayList。在MainActivity中,我只需要显示isConsumido atribute=false的项目。在TelaCadastrados活动中,我需要显示整个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;
}
}
此customAdapter将如何识别我的列表

我的Custon适配器:

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;
}
package com.example.breno.seenme;
公共类CustomAdapter扩展了ArrayAdapter{
公共静态最终整数视图\u TYPE\u MAINACTIVITY=124;//或一些随机整数。
公共静态最终整数视图\u TYPE\u TELACADAS=125;//或一些随机整数。
私有int视图类型;
清单a;
公共CustomAdapter(上下文上下文、int-textViewResourceId、int-viewType){
super(上下文,textViewResourceId);
this.viewType=viewType;
}
公共CustomAdapter(上下文上下文、int资源、列表项、int视图类型){
超级(上下文、资源、项目);
this.viewType=viewType;
this.lista=项目;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
if(视图类型==视图类型主活动){
//为列表的mainActivity版本执行逻辑。
//我认为使用isConsumido=true隐藏元素的代码
如果(!lista.get(position.isConsumido()){
//显示此视图(v);
v、 设置可见性(View.GONE);
}否则{
v、 设置可见性(View.VISIBLE);
}
}else if(viewType==视图类型TELACADAS){
//您的逻辑是否适用于Telacadas版本的列表
}否则{
//不支持的视图类型。
}
返回v;
}

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


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

在构建适配器时,传递要渲染的视图类型,列表的
main活动
版本或列表的
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;
    }
}
对于TelaCadasActivity,传入TelaCadas视图类型

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

对于要隐藏的项目,可以在getView中返回一个非常小且狭窄的视图,但我不会这样做。如果该属性是动态的且不断变化,那么我将使用CursorAdapter和ContentProvider,以便将排除逻辑放入查询中。否则,我可能只是在将arraylist添加到阵列适配器之前过滤arraylist。您可以通过手动检查for循环中的每个项目来实现这一点,或者通过编辑您的问题而不是作为回答,在问题的底部使用@BrenoHenrique帖子。那么我需要在哪里调用getView方法呢?谢谢您不必调用
getView()
方法,适配器将为您执行此操作,只要将listview的适配器设置为您实例化的适配器
if(!lista.get(position.isConsumido()){//showThisView(v);v.setVisibility(View.GONE);}else{v.setVisibility(View.VISIBLE);}
如果isConsumido==false,我认为您需要显示视图,但您正在反向执行此操作。我已修复此问题,但我不会像您的代码示例那样将我的项目文化列表传递到任何地方。对吗?所以我的适配器是空的。
final CustomAdapter arrayAdapterOrdenado = new CustomAdapter(this, android.R.layout.simple_list_item_1, regraDeNegocioSingleton.getListaDeItensSingleton().getListaDeItensCulturais(). CustomAdapter.VIEW_TYPE_MAINACTIVITY);
final CustomAdapter arrayAdapterOrdenado = new CustomAdapter(this, android.R.layout.simple_list_item_1, regraDeNegocioSingleton.getListaDeItensSingleton().getListaDeItensCulturais(). CustomAdapter.VIEW_TYPE_TELACADAS);