修改Android中的自定义BaseAdaptor位置属性
我有一个包含30个项目的数组,需要在listview中显示。但是,根据我的布局,我将在listview的一行中并排显示两个项目 因为现在只有15行要显示(30/2),所以如何修改适配器的position属性,以便只看到15行修改Android中的自定义BaseAdaptor位置属性,android,android-listview,Android,Android Listview,我有一个包含30个项目的数组,需要在listview中显示。但是,根据我的布局,我将在listview的一行中并排显示两个项目 因为现在只有15行要显示(30/2),所以如何修改适配器的position属性,以便只看到15行 我尝试在getView中执行position++,并将getCount()修改为返回15,但这也不起作用。与其这样做,不如简单地将两个项目计为一行。getView()方法返回一个视图,该视图表示getItem()返回的每个项目。在您的例子中,每个项目包含两个元素。所以只要把
我尝试在getView中执行position++,并将getCount()修改为返回15,但这也不起作用。与其这样做,不如简单地将两个项目计为一行。
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);
}
因此,基本上,您可以通过覆盖“areAllItemsEnabled()”和“isEnabled()”以返回“false”来禁用单击。然后,适配器中的click listener将在用户每次单击一行时激活。由于您将该行的
对象
放在视图
的标记中,因此您可以单击检索它。它将被交换到一个新的对象
,即使列表视图
循环使用,因为它每次都调用getView()
。然后创建一个从单击界面继承的对象,以检索该对象并执行任何需要的操作。这听起来比使用具有两列的对象复杂得多。因此,我这样做了,并使所有操作都正常工作。您能否提供一些关于如何处理每个项目的单击事件的输入。这增加了难度,但您不能使用ListView的onItem…
方法。您必须禁用该功能并自行实现单击。我会编辑一个可能的建议,虽然它真的取决于你的应用程序。
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);
}
}
}