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

时间:2013-11-26 22:50:51

标签: android android-listview

我有30个项目的数组,我需要在列表视图中显示。但是,根据我的布局,我将在列表视图的一行中并排显示2个项目。

由于现在只有15行要显示(30/2),我如何修改Adapter的position属性,这样我才能看到15行。

我尝试在getView中执行position ++,并修改getCount()以返回15,但这也不起作用。

1 个答案:

答案 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界面继承的对象,以检索对象并执行您需要的任何操作。