【问题标题】:Android distribute data in a ListViewAndroid 在 ListView 中分发数据
【发布时间】:2014-07-26 08:39:38
【问题描述】:

我在传播我在 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 方法显然对每个位置运行一次。这导致它在第一次尝试每个类别时将 v 作为类别而不是作为项目返回。我该如何解决这个问题?

这是输出

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

【问题讨论】:

  • 你能发布整个适配器,以及你定义列表和适配器的方法吗??
  • 当然可以。我将编辑帖子。
  • 您在列表中总共获得了多少行?总的来说,我的意思是项目+部分
  • 这真的取决于我拉的数据。现在大约有 4 行,每行有(类别、名称、详细信息、isSection)

标签: android listview android-listview


【解决方案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 中获得的视图,而是总是创建一个新的视图,这对性能和内存都不利。

【讨论】:

  • 嗯,这似乎没有做任何事情。还有什么我应该补充的吗?谢谢
【解决方案2】:

Eii 朋友,

我看到您正在尝试创建一个包含部分的列表。我的页面上有一个blogpost,说明如何实现这一点。在那里,您还可以从 github 访问该项目。

但是你正在做的事情可能有一些问题。

  • 数组适配器将根据数组中的项目扩展视图。这意味着例如,如果数组未排序,它将以随机顺序打印。 (不知道大家有没有想过这个问题)

【讨论】:

  • 他们打印得很好。唯一的问题是我丢失了一个项目,因为它被视为一个类别。它是,但也是一个项目。
【解决方案3】:

想通了,不可能同时返回两个视图。所以,我只是重新排列了我的列表并让它发挥作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多