2013-12-15 4 views
0

Мне нужно показать несколько текстовых просмотров только в одном элементе списка, а остальные элементы списка будут иметь только одно текстовое представление.Listview: Только один элемент списка с несколькими текстовыми полями

Как это достичь? Любые образцы или учебники, на которые вы можете указать мне?

спасибо.

ответ

1

Сделать свой собственный адаптер:

BaseAdapter уже provieds методы для работы с различными типами View (различная компоновка ячеек элементов списка) и эффективные виды обработки:

  • 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("..."); 
        } 
    
    } 
    

    }

1

Используйте пользовательский адаптер для вас список и редактировать функцию 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; 

    } 

    [...] 

} 

Берегите о контексте передачи контекста в MyListAdapter в конструкторе, как этот answer

+0

ваш код всегда будет заново для каждого элемента, его списка следует не производительное. Оформить мой ответ – sockeqwe

0

Вы можете внести изменения в адаптере .. .что-то вроде этого. @position 1: "пустой" вид будет отображаемая @rest позиции: "triplistrow" будет отображаться в.т.

@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; 
    } 
Смежные вопросы