修改Android中的自定义BaseAdaptor位置属性

修改Android中的自定义BaseAdaptor位置属性,android,android-listview,Android,Android Listview,我有一个包含30个项目的数组,需要在listview中显示。但是,根据我的布局,我将在listview的一行中并排显示两个项目 因为现在只有15行要显示(30/2),所以如何修改适配器的position属性,以便只看到15行 我尝试在getView中执行position++,并将getCount()修改为返回15,但这也不起作用。与其这样做,不如简单地将两个项目计为一行。getView()方法返回一个视图,该视图表示getItem()返回的每个项目。在您的例子中,每个项目包含两个元素。所以只要把

我有一个包含30个项目的数组,需要在listview中显示。但是,根据我的布局,我将在listview的一行中并排显示两个项目

因为现在只有15行要显示(30/2),所以如何修改适配器的position属性,以便只看到15行


我尝试在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);
      }
   }
}