具有多种布局的Android ListView

时间:2015-04-06 07:52:40

标签: android listview baseadapter layout-inflater getview

我必须显示具有不同类型视图的列表。所以我必须使用适配器定义ListView,我必须在其中扩充多个视图。我已经通过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,但之前使用的项类型不同,则布局将不相同。这段代码将如何处理这个问题?

3 个答案:

答案 0 :(得分:3)

您可以查看此示例适配器。 getViewTypeCount方法返回不同类型的行。 getItemViewType方法,如果position等于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;
       }
    }

答案 1 :(得分:0)

您可以通过覆盖方法getViewCount()getItemViewType(int position)

来实现

在第一个中,您只需返回您拥有的不同视图的数量。

在第二个中,您将为每个不同的视图返回唯一的标识符。

getView()方法中,然后检查“视图类型”并为其填充正确的布局。

有关该主题的更多信息:Android ListView with different layouts for each row

Android ListView with different layouts for each row

答案 2 :(得分:0)

当您在ListView或RecyclerView中使用不同类型的视图时,需要使用以下内容: -

getItemViewType() and getViewTypeCount()

首先,您需要使用getViewTypeCount()并返回List中所需的唯一视图数。然后重写getItemViewType()并根据您希望在ListView内更改视图的条件返回View类型。

希望它会有所帮助。