如何在ListView中只显示偶数位置的项目?

How to display only even position items in ListView?

我正在从数据库获取数据并在 ListView 中使用自定义 list adapter 显示。我只需要在 ListView 中显示偶数位置项。

我可以通过两种方式解决这个问题。

1. 在附加到适配器之前对数据进行排序,但我想在 adapter/by 的 getView() 方法中使用适配器中的其他可用方法来完成这些任务。

2.

@Override
public View getView(int position, View convertView, ViewGroup parent)  
{
   if( position%2 == 0 ) {
      // display
   } else {
      // not display
   }
return view;

在此我得到的备用视图是空视图。我想避免这些空视图。

我想在 getView() 方法中进行所有计算,ListView 中没有空视图。我该怎么做?

如果您给 ListView 适配器一组要显示的数据,它将在需要时尝试对所有数据调用 getView() - 它不会区分。关于如何显示它的决定是在 getView() 函数中做出的。

这两个选项要么修改数据集,要么只为偶数索引值提供完整的视图。不幸的是,没有其他方法可以解决这个问题。

创建另一个仅包含偶数位置项的列表,并将其传递给适配器。适配器将为列表中存在的所有项目调用 getView 方法。

在适配器中创建另一个函数

public int getItemViewType(int position) {
        // return a value between 0 and (getViewTypeCount - 1)
        return position % 2;
    }

之后在 GetView() 方法中

int viewType = getItemViewType(position);
    switch (viewType) {
    case 0:
        layoutResource = ;//Even Item
        break;

    case 1:
        layoutResource = ;//Odd Item
        break;
    }

我会建议您使用过滤后的数据创建新的 List 并在您的适配器中使用它。不过,如果您想要替代解决方案,可以尝试以下代码:

@Override
public int getCount() {
     int halfCountOfList = itemList.size()/2;
     // Add +1 in halfCountOfList if itemList size is odd.
     int finalCount = halfCountOfList + itemList.size()%2;
     return finalCount;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)  {

    Item item = getItem(position*2);
    //No need to to check for even item

    return view;
}

IF 您的数据将是某种对象类型,数据库将 return

ArrayList<Object>,

那么你可以这样做

例如:-

ListView lv;                   // assign this view to some ListView
final List<Object> listResult; //sorted list returned by database
int len = listResult.size();
for (int i = 1; i <= len; i++) {
    if (i % 2 == 0){
        Object x = listResult.get(i);
        //extract the data you need from the object returned
        lv.add(x);
    }
}

没有,没有。这是一个非常糟糕的主意。

不要这样做。这没有道理。想一想:调用 getView() 是因为需要一个项目的 ViewListView 中是否需要显示此项目已经来不及做出任何决定,它已经必须显示了。您要做的根本不是 ListViews 和 Adapters 应该如何工作。

只需在将 List 传递给 Adapter 之前过滤它,您可以在 List 显示时通过 getter 方法公开它来修改它Adapter 然后立即调用 notifyDataSetChanged()。偏离此或试图使 Adapters 像您期望的那样工作的任何其他解决方案都只是一个脆弱的 hack,永远不应使用。


PS:使用 RecyclerView 而不是 ListView。好多了。