当前位置: 首页 > 面试题库 >

在Android Listview中以2种不同的布局重用视图

梅安平
2023-03-14
问题内容

我了解到,要最大程度地提高Android列表视图的效率,您应该只拥有尽可能多的膨胀“行”视图以适合屏幕显示。视图移出屏幕后,应在您的getView方法中重用它,检查是否convertView为null。

但是,当列表需要2种不同的布局时,如何实现此想法?可以说它的订单列表,其中一个布局用于已完成的订单,另一个布局用于在处理中的订单。

这是我的代码正在使用的想法的示例教程。就我而言,我将有2行布局:R.layout.listview_item_product_completeR.layout.listview_item_product_inprocess

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

if (convertView == null) {
    holder = new ViewHolder();
    if(getItemViewType(position) == COMPLETE_TYPE_INDEX) {
        convertView = mInflator.inflate(R.layout.listview_item_product_complete, null);
        holder.mNameTextView = (TextView) convertView.findViewById(R.list.text_complete);
        holder.mImgImageView = (ImageView) convertView.findViewById(R.list.img_complete);
    }
    else { // must be INPROCESS_TYPE_INDEX
        convertView = mInflator.inflate(R.layout.listview_item_product_inprocess, null);
        holder.mNameTextView = (TextView) convertView.findViewById(R.list.text_inprocess);
        holder.mImgImageView = (ImageView) convertView.findViewById(R.list.img_inprocess);
    }
    convertView.setTag(holder);
} else {
    holder = (ViewHolder) convertView.getTag();
}
    thisOrder = (Order) myOrders.getOrderList().get(position);
    // If using different views for each type, use an if statement to test for type, like above
    holder.mNameTextView.setText(thisOrder.getNameValue());
    holder.mImgImageView.setImageResource(thisOrder.getIconValue());
    return convertView;
}

public static class ViewHolder {
    public TextView mNameTextView;
    public ImageView mImgImageView;
}

问题答案:

您需要让适配器的视图回收器知道不止一种布局,以及如何区分每一行的两种布局。只需覆盖以下方法:

@Override
public int getItemViewType(int position) {
    // Define a way to determine which layout to use, here it's just evens and odds.
    return position % 2;
}

@Override
public int getViewTypeCount() {
    return 2; // Count of different layouts
}

合并getItemViewType()进来getView(),像这样:

if (convertView == null) {
    // You can move this line into your constructor, the inflater service won't change.
    mInflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
    if(getItemViewType(position) == 0)
        convertView = mInflater.inflate(R.layout.listview_item_product_complete, parent, false);
    else
        convertView = mInflater.inflate(R.layout.listview_item_product_inprocess, parent, false);
    // etc, etc...

观看Android的Romain Guy 在Google
Talks上讨论视图回收器。



 类似资料:
  • 在Xamarin中,我目前有两个不同的活动,我想将它们组合在一起并使用一个视页。 一个活动使用以下内容视图: 第二个活动使用以下内容视图: 提前致谢

  • 我想停止我的几个页面显示在搜索结果中。我的理解是,我将以下内容添加到页面的部分: 问题是我的页面使用了一个通用的布局页面。类似于: 布局页面内部是head部分,包含大量链接、脚本和元标记。我不想为可索引和不可索引的页面重复这一点。 从我的研究中我发现:- 有多个节是错误的。 将robot meta标记放在head之外是不好的。 使用robots.txt超出了我的需要,而且是错误的。 试图将模型传递

  • 问题内容: 我有2个要用于修改相同数据的不同布局文件,我将切换到“编辑视图”的布局,该布局允许用户修改图形数据,然后允许他们切换回“详细视图” ”显示详细的图表(使用androidplot库)。 我的问题是,当切换回我的“编辑视图”时,我的图形线不见了,只绘制了轴(因此布局切换,而我的图形视图被调用了onDraw())。一切都存储在同一个活动中,所以我不明白为什么这不起作用? 这些行存储在Grap

  • 问题内容: 我有称为的布局,并且将方向设置为纵向。我也为Honeycomb设计了这种布局,并将其放置在文件夹中,但是我只想在横向使用 in 。 现在,该怎么办? 谢谢 问题答案: 您可以将其放置在中,然后仅以横向使用。 请参阅支持多屏幕(使用配置限定符) Android支持多个配置限定符,可让您控制系统如何根据当前设备屏幕的特征选择备用资源。配置限定符是一个字符串,您可以将其附加到Android项

  • 我使用列表中的子元素实现了一个可扩展的recyclerview。我遵循了这个准则。这就是它的工作原理, 下面简要描述使用RecyclerView实现ExpandableListView。列表模型有一个附加参数“type”,用于标识项目是标题还是子项。通过检查此参数,适配器将根据类型为view和viewholder充气。如果类型为HEADER,它将扩展HEADER项的布局,其中包含一个TextVie

  • 问题内容: 为TextView和ImageView设置相同的ID是否正确?由于它们属于一个实体,因此我给了他们两个相同的ID。如果是..那我怎么能分别通过id找到这些视图呢? 问题答案: 为TextView和ImageView设置相同的ID是否正确? 简短答案: 否 长答案:使用相同的ID 是 不 正确的,因为这样做可能会导致运行时错误。考虑下面的例子 layout.xml LocationAct