如何在 ListView 中仅显示偶数位置项?

Posted

技术标签:

【中文标题】如何在 ListView 中仅显示偶数位置项?【英文标题】:How to display only even position items in ListView? 【发布时间】:2016-03-22 04:19:01 【问题描述】:

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

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

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

2.

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

   if( position%2 == 0 ) 
      // display
    else 
      // not display
   
return view;

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

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

【问题讨论】:

不,只是不。过滤List,然后将其传递给Adapter。不要试图滥用Adapters 来获取它们不是为它们设计的东西。当getView() 被调用时,做你想做的事确实为时已晚。调用getView() 是因为ListView 需要View 用于提供位置的项目。没有办法说你不想显示这个项目,因为它已经需要显示了。任何变通方法都只是试图让Adapters 做他们不应该做的事情的脆弱黑客。 【参考方案1】:

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

@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;

【讨论】:

这是工作..谢谢。你能告诉我这是如何工作的return mScreenList.size()/2 + mScreenList.size()%2; 如果我尝试增加大小 * 2 .. 不工作.. 你能解释一下.. 为什么吗? @RajaReddyPolamReddy 它的工作原理是始终返回 getCount()List 的一半大小。 + mScreenList.size()%2 导致 List 中的项目数量不均 - 换句话说,基本上修复了 size() 显然不是基于零的,这与 getView() 中的位置索引不同。在 getView() 中,位置乘以 2 以随后从 List 中检索每隔一个项目。但正如我在回答中所说:不要这样做。 @RajaReddyPolamReddy list.size()/2 将是列表大小的一半,但如果您的列表大小是奇数(比如说 5),那么 list.size()/2 将返回 2 但在您的情况下它应该是 3,因为索引从 0 开始。所以如果列表大小是奇数,额外的 list.size()%2 将增加 1 个计数。【参考方案2】:

不,只是不。这是一个非常糟糕的主意。

不要这样做。这没有道理。想一想:getView() 之所以被调用,是因为需要一个项目的View。现在决定是否需要在ListView 中显示此项目为时已晚,它已经必须显示。您要做的根本不是ListViews 和Adapters 应该如何工作。

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


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

【讨论】:

是否可以使用 RecyclerView 实现? @RajaReddyPolamReddy 不是您希望的工作方式。在将List 传递给RecyclerView.Adapter 之前,您再次需要过滤它,或者修改RecyclerView.Adapter 中的List 并伴随适当的notify...() 调用。 @RajaReddyPolamReddy 我的意思是:你想做的不是它应该如何工作。试图让它以这种方式工作只会产生不好的后果。 是否可以这样做,如果我在适配器中使用任何其他回调方法.. 像 getItme() 。 为什么要实现这个?这没有道理。 Adapter 应该显示它给出的项目。 Adapter 有需要显示的项目和其他不需要的项目,这很奇怪。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

我已经说过同样的问题。我想使用适配器回调方法对适配器类中的数据进行排序。【参考方案5】:

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

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;
    

【讨论】:

我不想更改布局..我只想显示偶数位置项。 这不会改变你的布局。如果您只想显示偶数位置项,请管理您的代码以防万一。 那么情况 1.. 它会返回空视图吗?【参考方案6】:

如果您的数据将属于某个objectType,并且数据库将返回

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);
    

【讨论】:

我已经说过同样的问题。我想使用适配器回调方法对适配器类中的数据进行排序。 您可以在适配器类中应用相同的逻辑来显示偶数行。

以上是关于如何在 ListView 中仅显示偶数位置项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在listview android中仅更改第二个单元格的背景颜色

Android NestedScrollView 在 ListView 中仅显示一项

Flutter 在 ListView 中仅重建一行

在 ListView 中仅将标题设为粗体

如何检测ListView项的位置?

如何从QML中的GridView或ListView获取实例化的委托组件