gpt4 book ai didi

android - 使用数组适配器在 ListView 中插入分隔符

转载 作者:行者123 更新时间:2023-11-29 18:04:41 25 4
gpt4 key购买 nike

场景:我有 n 个选项卡,每个选项卡都有自己的 ListView 。我正在使用数组适配器生成 ListView 。传递给 arrayadaper 的数组具有对象数组。每个对象都有 和 。现在基于菜单类型,如果菜单类型是“菜单组”,我需要使用不同的布局进行绘制并将背景设置为红色。

问题很简单。每当我向下/向上滚动时, ListView 中菜单组行的属性就会传递到 ListView 中的其他行。换句话说,滚动会干扰分隔符。

Adapter 的代码如下。你能指导我到需要更正的地步吗?提前致谢。

public class MyCustomAdapter  extends ArrayAdapter<Menu> {
private ArrayList<Menu> menuItemList;
Context context;
LayoutInflater vi;

public MyCustomAdapter(Context context ,ArrayList<Menu> menu) {
super(context, 0, menu );
this.menuItemList = new ArrayList<Menu>();
this.menuItemList.addAll(menu);
this.context =context;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

private class ViewHolder {
TextView menuItem;
TextView menuGroup;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
int type =0;
String menuType = menuItemList.get(position).getMenuType();
if (menuType.equals("menugroup"))
type=1;
if (menuType.equals("menuitem"))
type=2;

if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case 1:
convertView = vi.inflate(R.layout.group, null);
holder.menuItem = (TextView) convertView.findViewById(R.id.tvGroup);
convertView.setBackgroundColor(Color.RED);
break;

case 2:
convertView = vi.inflate(R.layout.item, null);
holder.menuItem = (TextView) convertView.findViewById(R.id.tvItem);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

switch (type) {
case 1:
holder.menuItem.setText(menuItemList.get(position).getItemName()) ;
convertView.setBackgroundColor(Color.RED);
break;
case 2:
holder.menuItem.setText(menuItemList.get(position).getItemName()) ;
break;
}
return convertView;
}
}

最佳答案

Now based on the menu type, if the menu type is "menugroup" i need to draw using a different layout and set the background to RED colour.

您需要重写getItemViewType()getViewTypeCount() 以显示不止一种类型的布局,否则您将与Adapter 的回收商发生冲突...


看起来您已经完成了大部分工作,但让我们更改一些代码:

public int getItemViewType(int position) {
if (menuItemList.get(position).getMenuType().equals("menugroup"))
return 0;
return 1;
}

public int getViewTypeCount() {
return 2;
}

然后像这样使用 getView():

public View getView(final int position, View convertView, ViewGroup parent) {      
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
switch (getItemViewType(position)) {
case 0:
convertView = vi.inflate(R.layout.group, null);
holder.menuItem = (TextView) convertView.findViewById(R.id.tvGroup);
convertView.setBackgroundColor(Color.RED);
break;
case 1:
convertView = vi.inflate(R.layout.item, null);
holder.menuItem = (TextView) convertView.findViewById(R.id.tvItem);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.menuItem.setText(menuItemList.get(position).getItemName());

return convertView;
}

how can i ignore clicks on the menuGroups row?

以非常相似的方式,您需要覆盖另外两个方法 areAllItemsEnabled()isEnabled(int)。由于启用的项目只是上面代码中的特定项目类型,因此代码看起来也相同。

public boolean areAllItemsEnabled() {
return false;
}

public boolean isEnabled(int position) {
return menuItemList.get(position).getMenuType().equals("menugroup");
}

关于android - 使用数组适配器在 ListView 中插入分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14017160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com