如何在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()
是因为需要一个项目的 View
。 ListView
中是否需要显示此项目已经来不及做出任何决定,它已经必须显示了。您要做的根本不是 ListView
s 和 Adapter
s 应该如何工作。
只需在将 List
传递给 Adapter
之前过滤它,您可以在 List
显示时通过 getter 方法公开它来修改它Adapter
然后立即调用 notifyDataSetChanged()
。偏离此或试图使 Adapter
s 像您期望的那样工作的任何其他解决方案都只是一个脆弱的 hack,永远不应使用。
PS:使用 RecyclerView
而不是 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()
是因为需要一个项目的 View
。 ListView
中是否需要显示此项目已经来不及做出任何决定,它已经必须显示了。您要做的根本不是 ListView
s 和 Adapter
s 应该如何工作。
只需在将 List
传递给 Adapter
之前过滤它,您可以在 List
显示时通过 getter 方法公开它来修改它Adapter
然后立即调用 notifyDataSetChanged()
。偏离此或试图使 Adapter
s 像您期望的那样工作的任何其他解决方案都只是一个脆弱的 hack,永远不应使用。
PS:使用 RecyclerView
而不是 ListView
。好多了。