Android在ListView中分发数据

Android在ListView中分发数据,android,listview,android-listview,Android,Listview,Android Listview,我在传播ListView上收到的数据时遇到困难 假设我收到如下列表: 列表(字符串类别、字符串名称、字符串详细信息、字符串isSection) 我有 list.add("Drink", "Water", "Fresh Water", false) list.add("Drink", "Cola", "8oZ", false) list.add("Food", "Burger", "Homemade", false) 等等 现在,当我调用适配器时,会调用GetView方法。我将其实施为: pub

我在传播ListView上收到的数据时遇到困难

假设我收到如下列表: 列表(字符串类别、字符串名称、字符串详细信息、字符串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;
    }
这是可行的,但它省略了每个类别中的第一个。我认为这是因为getView方法显然对每个位置运行一次。这会导致它在第一次尝试每个类别时将v作为类别而不是项目返回。我怎样才能解决这个问题

这是输出

类别:饮品 项目可乐(省略了水的项目视图)
类别:食物(它省略了汉堡的项目视图)

您需要在适配器中覆盖这两种方法:

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中的视图,而是总是创建一个对性能和内存都有害的新视图。

Eii Amigo

我看到您正在尝试创建一个包含节的列表。我在我的网页上有一个关于如何实现这一点的建议。在那里,您还可以从github访问该项目

但是你所做的可能有一些问题

  • 阵列适配器将根据阵列上的项目对视图进行充气。这意味着,例如,如果数组未排序,它将以随机顺序打印。(我不知道你是否已经考虑过这个问题)

我明白了,不可能同时返回两个视图。所以,我只是重新排列了我的列表,并使其正常工作。

你能发布整个适配器,以及定义列表和适配器的方法吗?当然可以。我将编辑帖子。你在列表中总共有多少行?总的来说,我的意思是,对于items+section,这实际上取决于我提取的数据。现在大约有4行,每行都有(类别、名称、详细信息、isSection)Hm,这似乎没什么作用。还有什么我要补充的吗?谢谢他们印刷得很好。唯一的问题是,我失去了一个项目,因为它被视为一个类别。它是,但也是一个项目。
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;
}