我在ListView上传播的数据传播时遇到了困难
假设我收到一份清单: list(String category,String name,String details,String isSection) 我有
list.add("Drink", "Water", "Fresh Water", false)
list.add("Drink", "Cola", "8oZ", false)
list.add("Food", "Burger", "Homemade", false)
等...
现在,当我调用适配器时,会调用GetView方法。我把它实现为:
public class EntryRestaurantAdapter extends ArrayAdapter<RestaurantMenu> {
private Context context;
private ArrayList<RestaurantMenu> items;
private LayoutInflater vi;
private static final int TYPE_SECTION = 1;
private static final int TYPE_ITEM = 2;
public EntryRestaurantAdapter(Context context,ArrayList<RestaurantMenu> items) {
super(context,0, items);
this.context = context;
this.items = items;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getViewTypeCount () {
return 2;
}
@Override
public int getItemViewType(int position) {
return items.get(position).getSection() ? TYPE_SECTION : TYPE_ITEM;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final RestaurantMenu i = items.get(position);
if (!i.getSection()){
RestaurantMenu si = (RestaurantMenu)i;
v = vi.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getCategory());
for (int a=0; a<items.size(); a++){
// if (items.indexOf(i.getCategory()) == items.lastIndexOf(i.getCategory()))
// v = vi.inflate(R.layout.item_view, null);
if (i.getCategory().equals(items.get(a).getCategory())){
Log.d("Dentro del FOr ",""+ items.get(a).getSection());
items.get(a).setSection(true);
Log.d("Dentro del FOr despues del true ",""+ items.get(a).getSection());
}
}
}
else {
v = vi.inflate(R.layout.item_view, null);
TextView sectionView = (TextView) v.findViewById(R.id.restaurant_name);
RestaurantMenu si = (RestaurantMenu) i;
sectionView.setText(si.getFoodName());
}
Log.d("Entry Section: ", "" + i.getSection() + " ID: " + i.getCategory());
return v;
}
我打电话给我的主要活动:
EntryRestaurantAdapter adapter = new EntryRestaurantAdapter(this, restaurantMenuList);
listview.setAdapter(adapter);
这有效,但它省略了每个类别的第一个。我认为这是因为getView方法显然对每个位置运行ONCE。这导致它将v作为类别返回,而不是作为每个类别的第一次尝试的项目。我该如何解决这个问题?
这是输出
类别:饮料 项目可乐(它省略了水的项目视图) 类别:食物(它省略了汉堡的项目视图)
答案 0 :(得分:1)
您需要在适配器中覆盖这两种方法:
public int getViewTypeCount() {...}
public int getItemViewType(int position) {...}
在第一个中你应该返回列表中有多少种类型的视图,而在第二个中你应该返回该位置的视图类型,它可以是任何整数,就像这样。
private static final int TYPE_SECTION = 1;
private static final int TYPE_ITEM = 2;
....
@Override
public int getViewTypeCount {
return 2;
}
@Override
public int getItemViewType(int position) {
return items.get(position).getSection() ? TYPE_SECTION : TYPE_ITEM;
}
顺便说一句,你没有重用convertView中的视图,但总是创建一个对性能和内存都不好的新视图。
答案 1 :(得分:0)
Eii Amigo,
我看到您正在尝试创建包含部分的列表。我的页面上有blogpost如何实现此目的。在那里,您还可以从github访问该项目。
但是你可能会遇到一些问题。
答案 2 :(得分:0)
想通了,它不可能同时返回两个视图。所以,我只是重新安排了我的清单并使其有效。