我有30个项目的数组,我需要在列表视图中显示。但是,根据我的布局,我将在列表视图的一行中并排显示2个项目。
由于现在只有15行要显示(30/2),我如何修改Adapter的position属性,这样我才能看到15行。
我尝试在getView中执行position ++,并修改getCount()以返回15,但这也不起作用。
答案 0 :(得分:0)
不是这样做,更好的方法可能是简单地将两个项目统计为一行。 getView()
方法返回一个视图,该视图表示getItem()
返回的每个项目。在您的情况下,每个项目包含两个元素。所以只需将逻辑放入其中就可以一次检索两个元素。可能更容易将它们封装在类中,例如:
ArrayList<Row> mItems = new ArrayList<Row>();
private class Row {
Object obj1;
Object obj2;
}
public void addItem(Object obj) {
Row useRow;
if(mItems.isEmpty()) {
useRow = new Row();
} else {
useRow = mItems.get(mItems.size() - 1);
if(useRow.obj2 != null) {
useRow = new Row();
}
}
if(useRow.obj1 == null) {
useRow.obj1 = obj;
} else {
useRow.obj2 = obj;
}
mItems.add(useRow);
}
在这种情况下,BaseAdapter由Row
个对象列表支持。每个Row
对象包含两个元素。每次添加元素时,都会将其添加到第一个元素,然后添加到第二个元素,否则您将创建一个新的Row
对象并添加它。
编辑:
为了具有可点击性,您必须为每个项目的View实现OnClickListener。这样的事情可能有用:
public interface ItemClickListener {
public void onItemClick(Object obj);
}
private ItemClickListener mClickListener;
public void setItemClickListener(ItemClickListener listener) {
mClickListener = listener;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled() {
return false;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewGroup root;
if(convertView == null) {
root = buildRootView();
View item1View = buildFirstView();
View item2View = buildSecondView();
...
item1View.setOnClickListener(mItemListener);
item2View.setOnClickListener(mItemListener);
...
// Put both Views in your top level root view if they are not there already
}
Row row = getItem(position);
item1View.setTag(row.obj1);
item2View.setTag(row.obj2);
}
private View.OnClickListener mItemListener = new View.OnClickListener {
@Override
public void onClick(View v) {
Object obj = (Object) v.getTag();
if(mClickListener != null) {
mClickListener.onItemClick(obj);
}
}
}
基本上,你通过覆盖“areAllItemsEnabled()”和“isEnabled()”来禁用单击以返回“false”。然后,每次用户单击一行时,适配器中的单击侦听器都将激活。由于您将行的Object
放在View
的标记中,因此您可以在点击时检索它。即使Object
回收,它也会被换成新的ListView
,因为它每次都会调用getView()
。然后创建一个从click界面继承的对象,以检索对象并执行您需要的任何操作。