Java 如何个性化一个arrayAdapter?
我的项目我需要在两个不同的活动中显示相同的arrayList。在MainActivity中,我只需要显示isConsumido atribute=false的项目。在TelaCadastrados活动中,我需要显示整个arrayList。我怎么做到的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
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);