具有多种布局的Android ListView

标签 android listview baseadapter layout-inflater getview

我必须显示一个包含不同类型 View 的列表。所以我必须定义一个带有适配器的 ListView,我必须在其中扩展多个 View 。我经历了example给出,但问题是我的列表不是对称的,就像每次在 4 个项目之后重复标题的示例。所以我在 getView()

中面临重用项目的问题
 public View getView(int position, View convertView, ViewGroup parent) {   
    int type = getItemViewType(position);
    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {
             case TYPE_1:
             convertView = mInflater.inflate(R.layout.item1, null);
             .......
             break;

             case TYPE_2:
             convertView = mInflater.inflate(R.layout.item2, null);
             .......
             break;
        }
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }
    ............
    ............
}

现在如果 convertView 不为 null,但之前使用它的项目类型不同,则布局将不匹配。这段代码将如何处理这个问题?

最佳答案

你可以看看这个例子适配器。 getViewTypeCount 方法返回不同类型的行。 getItemViewType 方法,如果位置等于 0,则展开第一行布局,否则展开其他行布局。您可以自定义此代码示例。

    import java.util.List;
    import android.app.Activity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;

    /**
     * Created by MustafaS on 9.2.2015.
     */
    public class CustomArrayAdapter extends ArrayAdapter<YourModel> {

       @Override
       public int getItemViewType(int position) {

          if (position == 0) {
             return 0;
          }
          else {
             return 1;
          }
       }

       @Override
       public int getViewTypeCount() {
          return 2;
       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
          int type = getItemViewType(position);
          if (type == 0) {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_first_row, parent, false);
                viewHolderFirst = new ViewHolderFirst();
                convertView.setTag(viewHolderFirst);
             }
             else {
                viewHolderFirst = (ViewHolderFirst) convertView.getTag();
             }

          }
          else {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_other_row, parent, false);
                viewHolder = new ViewHolder();

             }
             else {
                viewHolder = (ViewHolder) convertView.getTag();
             }
          }
          return convertView;
       }

       protected class ViewHolderFirst {
          private RunnableViewPager pager;
          private CircleIndicator   indicator;
       }

       protected class ViewHolder {
          private ImageView imageviewRestaurant;
          private TextView  textviewRestaurantName;
          private TextView  textviewType;
          private TextView  textviewPrice;
          private TextView  textviewDistance;
          private ImageView imageviewCall;
          private ImageView imageviewCalendar;
       }
    }

关于具有多种布局的Android ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29467455/

相关文章:

android - 错误-两个复选框在 ListView 中同时得到检查

android - 我有一个关于 android listView 和 baseAdapter 的奇怪情况?

Android 2.3.3 AsyncTask 调用抛出 NoSuchFieldError

java - Android中如何从ListView中获取当前所选项目的背景颜色

java - Android Studio错误: java. lang.NullPointerException

android - ListView 图像的 onClick 监听器 - Android

android - 如何使用 Facebook android 分享图像

java - 有没有办法将表行保存到 Firebase 中?实时还是 Firestore?

android - 重新启动应用程序以释放堆内存

java - Android 是否具有与 iOS 具有 UINavigationController 的 Activity 流相似的 Activity 流?