Динамически создаваемая таблица Android - плохая производительность - PullRequest
3 голосов
/ 22 марта 2012

Я бы хотел, чтобы вы мне помогли.Я хочу динамически создать таблицу (скриншот).Я создал его с помощью кода ниже:

    TableLayout tl = (TableLayout) findViewById(R.id.main_table);

    FOR. 1-300.........
    TableRow tr_head = new TableRow(this);
    tr_head.setId(10);
    tr_head.setBackgroundColor(Color.CYAN);
    tr_head.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
    RelativeLayout rl = new RelativeLayout(this);
    rl.setId(20);


    ImageButton xyz = new ImageButton(this);
    xyz.setId(21);
    xyz.setPadding(5, 5, 5, 5);
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT );
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 20 );
    rl.addView(xyz,params); 

    tr_head.addView(rl);
    tl.addView(tr_head, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
    END OF FOR.......  

С помощью аналогичного кода я красиво создаю 2 типа элементов, один для категории (3 дочерних представления) и один для элемента категории (10 дочерних просмотров).Затем я использую код ниже, чтобы назначить слушателя onclick для кнопок и целых элементов.:

int count = tl.getChildCount();
    for(int i = 0; i < count; i++){
        TableRow v = (TableRow)tl.getChildAt(i);

        if(v.getChildAt(0) instanceof RelativeLayout){
            RelativeLayout relativ = (RelativeLayout)v.getChildAt(0);

        if(relativ.getChildCount()>5)
            relativ.setOnClickListener(new MyClickListener());
                     ...........

Но когда я хочу создать таблицу, которая содержит 300 элементов, это займет 30 секунд.сделать это представление на эмуляторе.Это действительно очень медленно.Поэтому я хотел бы спросить вас, как сделать это представление.Некоторые примеры или учебники будут очень полезны.

Большое спасибо заранее.

I want to create this

Ответы [ 2 ]

7 голосов
/ 22 марта 2012

Android очень медленный из-за большого количества просмотров в памяти.Чтобы обойти это, я бы рекомендовал использовать Andoird ListView по умолчанию с пользовательским ListAdapter.

Представления создаются на лету, когда пользователь прокручивает список, поэтому в памяти должны находиться только видимые в настоящее время представления.1003 *

В этом примере используется CursorAdapter, но вы также можете использовать ArrayAdapter.

private class ExtendCursorAdapter extends CursorAdapter {

    public ExtendCursorAdapter(Context context, Cursor c) {
        super(context, c);
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) { //Determine if it's a category or an item
            return 0; // category
        } else {
            return 1; // item
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (getItemViewType(position) == 0) {
            View v;
            if (convertView != null)
                v = convertView;
            else
                v = inflater.inflate(R.id.listcategory);
            // Set title, ...
            return v;
        } else{
            // the same for the item
        }
    }
}

Дополнительное увеличение производительности связано с использованием convertView.Во время прокрутки вам не нужно создавать никаких дополнительных видов, потому что Android использует те, которые не видны.Вам просто нужно сбросить все данные convertView.

1 голос
/ 07 апреля 2013

Я столкнулся с похожими проблемами с производительностью, за исключением того, что я хотел только отобразить текст в отформатированной форме таблицы (столбцы с авторазмером и т. Д.). В этом случае вы можете отказаться от TableLayout полностью и использовать что-то вроде java.util.Formatter для преобразования текста в форму таблицы и передачи его в один TextView. Для меня это привело к значительному приросту производительности (~ 2 секунды, чтобы нагрузка была почти мгновенной).

Подробнее см. здесь .

...