如何在 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
。不要试图滥用Adapter
s 来获取它们不是为它们设计的东西。当getView()
被调用时,做你想做的事确实为时已晚。调用getView()
是因为ListView
需要View
用于提供位置的项目。没有办法说你不想显示这个项目,因为它已经需要显示了。任何变通方法都只是试图让Adapter
s 做他们不应该做的事情的脆弱黑客。
【参考方案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
中显示此项目为时已晚,它已经必须显示。您要做的根本不是ListView
s 和Adapter
s 应该如何工作。
只需在将List
传递给Adapter
之前对其进行过滤,您可以在List
显示时对其进行修改,方法是通过Adapter
上的getter 方法将其公开,然后立即调用notifyDataSetChanged()
。任何其他与此不同或试图使Adapter
s 像您期望的那样工作的解决方案都只是一个脆弱的黑客,永远不应该使用。
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中仅更改第二个单元格的背景颜色