0

У меня данный момент Список реализован с Header и Footer.

Код:

//Header objects
    bookDetailsObjects.setDate("16-янв-2105, 15:50");
    bookDetailsObjects.setFromTo("TSE - IST");
    bookDetailsObjects.setPNR("284TZ8");
    bookDetailsObjects.setValidUntil("03-Мар 2016 23:59");
    bookDetailsObjects.setRoute("Москва - Станбул");
    bookDetailsObjects.setDepartDate("25-Мар 2016 12:30");
    bookDetailsObjects.setFlightClass("Econom");
    bookDetailsObjects.setStatus(2);
View header = getLayoutInflater().inflate(R.layout.book_details_layout_item, listView, false);

TextView mFromTo = (TextView) header.findViewById(R.id.tvFromTo);
TextView mBookDate = (TextView) header.findViewById(R.id.tvBookDate);
TextView mPNR = (TextView) header.findViewById(R.id.tvPNR);
TextView mValidUntil = (TextView)header.findViewById(R.id.tvValidUntil);
TextView mRoute = (TextView)header.findViewById(R.id.tvRoute);
TextView mDepartDate = (TextView)header.findViewById(R.id.tvDepartDate);
TextView mClass = (TextView)header.findViewById(R.id.tvClass);
TextView mStatus = (TextView)header.findViewById(R.id.tvStatus);

mFromTo.setText(bookDetailsObjects.getFromTo());
mBookDate.setText(bookDetailsObjects.getDate());
mPNR.setText(bookDetailsObjects.getPNR());
mValidUntil.setText(bookDetailsObjects.getValidUntil());
mRoute.setText(bookDetailsObjects.getRoute());
mDepartDate.setText(bookDetailsObjects.getDepartDate());
mClass.setText(bookDetailsObjects.getFlightClass());

switch(bookDetailsObjects.getStatus())
{
    case 2:
        mStatus.setText(getString(R.string.status_canceled));
        break;
    case 0:
        mStatus.setText(getString(R.string.status_booked));
        break;
    case 1:
        mStatus.setText(getString(R.string.status_buyed));

        break;
    default:
        break;
}

//End of Header Objects

//Passengers objects

passengersObjects.setPassGroup(0);
passengersObjects.setName("Иванов Иван");
passengersObjects.setBirthDate("14.01.1992");
passengersObjects.setGender("Мужской");

passengersObjects.setAdultTickPrice(15000);
passengersObjects.setChildTickPrice(15000);
passengersObjects.setInfTickPrice(15000);

for (int i = 0; i < 5; i++){
    passItems.add(passengersObjects);
}

//End Passengers objects //Footer objects

bookDetailsObjects.setTotalPrice(45000);

View footer = getLayoutInflater().inflate(R.layout.book_layout_price_buttons, listView, false);

TextView mTotalPrice = (TextView) footer.findViewById(R.id.tvTotalPrice);
Button mCancel = (Button) footer.findViewById(R.id.btnDetCancel);
mCancel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ToastUtils.ToastShort(getApplicationContext(), "Отменено");
    }
});
Button mBuy = (Button) footer.findViewById(R.id.btnDetBuy);
mBuy.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ToastUtils.ToastShort(getApplicationContext(), "Выкуплено");
    }
});

mTotalPrice.setText(bookDetailsObjects.getTotalPrice() + "РУБ");

listView.addHeaderView(header);
listView.addFooterView(footer);
listView.setAdapter(new PassengersDetailAdapter(getApplicationContext(), R.layout.book_layout_pass_items, passItems));

}

Адаптер:

public class PassengersDetailAdapter extends ArrayAdapter<PassengersObjects> {

private int resource; private LayoutInflater inflater; private Context context; static Resources r;

public PassengersDetailAdapter(Context ctx, int rsc, List<PassengersObjects> objects) { super(ctx, rsc, objects);

resource = rsc;
inflater = LayoutInflater.from(ctx);
context = ctx;

}

@Override public View getView(int position, View convertView, ViewGroup parent) { convertView = inflater.inflate(resource, null); PassengersObjects passengersObjects = getItem(position);

TextView mName = (TextView)convertView.findViewById(R.id.tvFullName);
TextView mGender = (TextView)convertView.findViewById(R.id.tvGender);
TextView mBirthDate = (TextView)convertView.findViewById(R.id.tvBirthDate);
TextView mTickPrice = (TextView)convertView.findViewById(R.id.tvTickPrice);

mName.setText(passengersObjects.getName());
mGender.setText(passengersObjects.getGender());
mBirthDate.setText(passengersObjects.getBirthDate());

switch(passengersObjects.getPassGroup())
{
    case 0:
        mTickPrice.setText(passengersObjects.getAdultTickPrice() + &quot;KZT&quot;);
        break;
    case 1:
        mTickPrice.setText(passengersObjects.getChildTickPrice() + &quot;KZT&quot;);
        break;
    case 2:
        mTickPrice.setText(passengersObjects.getInfTickPrice() + &quot;KZT&quot;);
        break;
    default:
        break;
}

return convertView;

} }

Выглядет так:

введите сюда описание изображения

То есть, так как мне нужно. Но мне нужно, чтобы они все были в одном адаптере PassengersDetailAdapter, и никак не могу понять как это реализовать, каша в голове. Подскажите, пожалуйста!

DevOma
  • 4,134
  • 1
    Это делается через переопределение метода getItemViewType() адаптера. Пример – pavlofff May 11 '16 at 14:01
  • В вашем случае, когда в этот метод передается, что позиция на первом элементе, выводить хэдер, когда на последнем футер, для всех остальных - промежуточные айтемы. – pavlofff May 11 '16 at 14:26

1 Answers1

1

Не мучайтесь с ListView. Переделайте всё на RecyclerView. Там это делается так:

По позиции элемента определяем его тип и в зависимости от этого загружаем определённую разметку и отображаем её:

//метод, в коем вы должны в зависимости от позиции элемента возвращать
//её тип в виде числа, кое потом используется в onCreateViewHolder для загрузки разметки
//и в onBindViewHolder для наполнения её данными
@Override
public int getItemViewType(int position)
{
    if (position == 0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
 }

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    RecyclerView.ViewHolder vh;
    View itemLayoutView;

    //загружаем разметку в зависимости от типа и возвращаем
    //нужный холдер
    switch (viewType)
    {
        case 0:
            itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.zero_type_layout, parent, false);
            vh = new HolderZeroType(itemLayoutView);
            break;
        case 1:
            itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.first_type_layout, parent, false);
            vh = new HolderFirstType(itemLayoutView);
            break;
    }

    return vh;
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position)
{
    switch (this.getItemViewType(position))
    {
        case 0:
           HolderZeroType zero = (HolderZeroType) holder;
           //наполняем данными разметку для нулевого типа
           break;
        case 1:
           HolderFirstType first = (HolderFirstType) holder;
           //наполняем данными разметку для нулевого типа
           break;
     }
 }

public static class HolderFirstType extends RecyclerView.ViewHolder
{
    ...

    public ViewHolderText(View v)
    {
        super(v);
        ...
    }
}

public static class HolderZeroType extends RecyclerView.ViewHolder
{
    ...

    public ViewHolderText(View v)
    {
        super(v);
        ...
    }
}
  • В ListView это делается практически так же – pavlofff May 11 '16 at 13:59
  • @pavlofff, ИМХО в RecyclerView всё это удобнее) Ну и нет всяких плющек типа хедеров и не возникает ситуаций как в вопросе о том как их в адаптер перенести) И слушатели нажатий извне адаптера не назначить на элементы, что тоже избавляет от множества возможных проблем. Ну и без ViewHolder адаптер к RecyclerView не написать, что также избавляет от необходимости выяснять как это делается для ListVeiw. =) – ЮрийСПб May 11 '16 at 14:03
  • @ЮрийСПб, Извините, а как проверить последнюю позицию? – DevOma May 13 '16 at 12:37
  • @Omuradil, длина списка с данными минус один... – ЮрийСПб May 13 '16 at 13:01
  • давно тоже сталкивался с такими проблемами, реализовывал через RecyclerView, со временем "слепилась" обертка https://github.com/vivchar/RendererRecyclerViewAdapter – Vitaly Mar 20 '17 at 14:56