Android: ListView с уникальными строками - PullRequest
0 голосов
/ 09 августа 2011

Можно ли создать ListView, в котором каждая строка в списке представляет собой уникальный макет (вы не знаете структуру макета, поскольку он динамически генерируется во время выполнения)?

edit:

Так что мои строки могут выглядеть примерно так:

  1. [---] [-------] [-] [----------------]
  2. [-------] [----------][-------------]
  3. [-] [-------] [----------] [----------]

и т. Д. (Предположим, что правая сторона выровнена).Каждый из них, скорее всего, будет уникальным.Я знаю, что ListView предполагает, что структура переработанного представления такая же, как у каждого элемента строки, но есть ли способ использовать ListView для динамически создаваемых строк?

public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder = null;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.guide_program_row, null);
            holder = new ViewHolder();
            holder.programRow = (LinearLayout)convertView.findViewById(R.id.program_row);

            Log.i(TAG, "New Row; position = " + position);
        }
        else {
            Log.i(TAG, "Cached Row; position = " + position);
            holder = (ViewHolder)convertView.getTag();
        }

        holder.programRow.addView(buildRow(programLengths));

        return convertView;
    }       

static class ViewHolder {
    LinearLayout programRow;
}

public LinearLayout buildRow(int [] programLengthRow) {
    Display display = getWindowManager().getDefaultDisplay();
    int screenWidth = display.getWidth();
    int screenHeight = display.getHeight();

    int programCellWidth = screenWidth / 5;
    int programCellHeight = (int)(screenHeight * 0.6 / 9);
    int timeLeft = maxTimes;

    LinearLayout programRow = new LinearLayout(getApplicationContext());

    for (int j = 0; j < maxTimes; j++) {
        if (timeLeft <= 0)
            break;       

        Movie movie = movieList.get(j);
        LinearLayout programCell = (LinearLayout)mInflater.inflate(R.layout.guide_program_cell, null);
        TextView programText = (TextView)programCell.findViewById(R.id.program_cell_text);

        if (programLengthRow[j] > timeLeft) {
            programCell.setLayoutParams(new LinearLayout.LayoutParams(programCellWidth * timeLeft, programCellHeight));
            programText.setText(movie.title + " >>");
        }
        else {
            programCell.setLayoutParams(new LinearLayout.LayoutParams(programCellWidth * programLengthRow[j], programCellHeight));
            programText.setText(movie.title);
        }


        timeLeft = timeLeft - programLengthRow[j];
        programRow.addView(programCell);
    }

    return programRow;
}

1 Ответ

1 голос
/ 09 августа 2011

Да. Пожалуйста, смотрите этот вопрос, как он связан. В основном это говорит:

getViewTypeCount () - этот метод возвращает информацию о том, сколько типов строк в вашем списке

getItemViewType (int position) - возвращает информацию о том, какой тип макета вы должны использовать на основе позиции

И у него есть ссылка на учебник для получения дополнительной помощи.

...