【问题标题】:Listview: Only one list item with multiple textviewsListview:只有一个具有多个文本视图的列表项
【发布时间】:2013-12-15 15:26:19
【问题描述】:

我只需要在一个列表项中显示多个文本视图,其余的列表视图项将只有一个文本视图。

我如何实现这一目标?您可以指出我的任何示例或教程吗?

谢谢。

【问题讨论】:

    标签: android android-layout listview android-listview


    【解决方案1】:

    制作你自己的适配器:

    BaseAdapter 已经提供了处理不同视图类型(列表项单元格的不同布局)和有效回收视图的方法:

    • getViewTypeCount():存在多少不同视图(布局)的计数。
    • getItemViewType():返回一个整数来标识单元格中项目的视图类型。请注意,内部 BaseAdapter 实现使用数组。因此,您在此处返回的值必须是从 0 到 n。您不能跳过索引。

      公共类 MyAdapter 扩展 BaseAdapter {

      private final int VIEW_TYPE_NORMAL = 0;
      private final int VIEW_TYPE_4_TEXTS = 1;
      
      /**
       * The inflater for
       */
      protected LayoutInflater inflater;
      protected Context context;
      
      public MyAdapter(Context context) {
          this.context = context;
          this.inflater = (LayoutInflater) context
                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      }
      
      @Override
      public int getViewTypeCount() {
          // There are two view types
          return 2;
      }
      
      @Override
      public int getItemViewType(int position) {
          if (position == 0)
              return VIEW_TYPE_4_TEXTS;
          else
              return VIEW_TYPE_NORMAL;
      }
      
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          int type = getItemViewType(position);
          if (convertView == null) {
              convertView = newView(type, parent);
          }
          bindView(position, type, convertView);
          return convertView;
      }
      
      @Override
      public long getItemId(int position) {
          return 0; // replace it with your id, if you have stable ids in your
                      // adapter
      }
      
      /** Inflates the correct view accorind the view type **/
      public View newView(int type, ViewGroup parent) {
      
          if (VIEW_TYPE_4_TEXTS == type) {
              View view = inflater.inflate(R.layout.your_layout_with_4_textviews,
                      parent, false);
              view.setTag(new ViewHolder4TextViews(view)); // ViewHolder pattern
      
              return view;
          }
      
          // Otherwise its a normal item with VIEW_TYPE_NORMAL
          View view = inflater
                  .inflate(R.layout.your_normal_layout, parent, false);
          view.setTag(new NormalViewHolder(view)); // ViewHolder pattern
      
          return view;
      
      }
      
      /** Bind the data for the specified {@code position} to the {@code view}. */
      public void bindView(int position, int type, View view) {
      
          if (VIEW_TYPE_4_TEXTS == type) {
              // set the 4 text view values
              ViewHolder4TextViews holder = (ViewHolder4TextViews) view.getTag();
      
              holder.textview1.setText("...");
              holder.textview2.setText("...");
              holder.textview3.setText("...");
              holder.textview4.setText("...");
      
          } else {
              // VIEW_TYPE_NORMAL
              NormalViewHolder holder = (NormalViewHolder) view.getTag();
      
              holder.textview.setText("...");
          }
      
      }
      

      }

    【讨论】:

      【解决方案2】:

      使用自定义适配器为您列出并编辑 getView 函数:

      public class MyListAdapter extends BaseAdapter {
      
          [...]
      
          @Override
          public View getView(int position, View view, ViewGroup parentView) {
                  LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      
                  if(position < 1) {
                      /* Inflate a layout with 4 textview */
                      view = inflater.inflate(R.layout.your_4_textview_layout, parentView, false);
      
                  } else {
                      /* Inflate a layout with 1 textview */
                      view = inflater.inflate(R.layout.your_1_textview_layout, parentView, false);
      
                  }
      
                  return view;
      
          }
      
          [...]
      
      }
      

      注意在构造函数中将 Context 上下文传递给 MyListAdapter,例如 answer

      【讨论】:

      • 您的代码将始终为每个列表视图项重新创建,它不是高效的。查看我的答案
      【解决方案3】:

      您可以在适配器中进行更改...类似这样的事情。 @position 1:将显示“空白”视图 @rest 位置:“triplistrow”将 bw 显示

         @Override
        public View getView(final int position, View convertView, final ViewGroup parent) 
        {         
            View rowView = convertView;
            if(position !=1)
            {
            if (rowView == null) 
            {
                LayoutInflater inflater = context.getLayoutInflater();
                rowView = inflater.inflate(R.layout.triplistrow, null);
                ViewHolder viewHolder = new ViewHolder();
      
                viewHolder.no = (TextView) rowView.findViewById(R.id.TVTripNo);
                viewHolder.name = (TextView) rowView.findViewById(R.id.TVTripName);
                viewHolder.date = (TextView) rowView.findViewById(R.id.TVTripDate);
      
                rowView.setTag(viewHolder);
             }
            }
            else
            {
                LayoutInflater inflater = context.getLayoutInflater();
                rowView = inflater.inflate(R.layout.triplistrow, null);
                ViewHolder viewHolder = new ViewHolder();
      
                rowView.setTag(viewHolder);
            }
      
            if(position!=1)
            {
            final ViewHolder holder = (ViewHolder) rowView.getTag();  
      
            holder.no.setText(String.valueOf(position+1));
            holder.name.setText(values.get(position).name);
            holder.date.setText(values.get(position).fromdate + " to " + values.get(position).tilldate);
      
            }else
            {
      
      
      
            }
      
      
          return rowView;
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        相关资源
        最近更新 更多