Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 521
Записей в блоге: 1
#1

Как победить подтормаживание при листании ViewPager со списками listview? - Программирование Android

30.06.2015, 21:29. Просмотров 691. Ответов 8
Метки нет (Все метки)

Как победить подтормаживание при листании ViewPager со списками listview?

если быстро листать (ну или даже не очень быстро), то тормозит, видимо из-за пересоздания фрагмента, есть ли какое-то решение на эту тему подскажите кто сталкивался?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,724
01.07.2015, 11:54     Как победить подтормаживание при листании ViewPager со списками listview? #2
disx, товарищ, вы чего-то нечётко сформулировали. Что листаем - ListView или ViewPager?
Предположу, что ViewPager. Значит, долго создаётся ListView. Естественно, надо его создание загнать в AsyncTask, использовать ViewHolder. Кроме того, если быстро листать вправо, то список в любом случае не будет успевать создаваться, а значит, надо внутри AsyncTask делать проверку на то, находимся ли мы во фрагменте или пользователь его листнул дальше.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 521
Записей в блоге: 1
01.07.2015, 14:12  [ТС]     Как победить подтормаживание при листании ViewPager со списками listview? #3
CoolMind, да листаем страницы ViewPagera, на каждой из них свой список...

AsyncTask и ViewHolder ?!, ни разу с ними дел не имел..., пошел читать


P.S. эээх,...вот бы примерчик...
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 521
Записей в блоге: 1
07.10.2015, 10:47  [ТС]     Как победить подтормаживание при листании ViewPager со списками listview? #4
CoolMind, посмотрите правильно ли я понял как загнать создание листа в асинктаск?:

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
public class FirstFragment extends Fragment implements LoaderCallbacks<Cursor> {
    
    private Context context;
    public DB db;
    public SimpleCursorAdapter scAdapter;
    private Cursor cursor;
    ListView lvData1;
    static String arg = "";
    private static final int CM_DELETE_ID = 1;
    DBHelper dbHelper;
    Button btn;
    TextView tv;
    final String TAG = "MyLog";
    int id_col;
    /** Handle the results from the voice recognition activity. */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
 
        return inflater.inflate(R.layout.first, container, false);
                
    }
 
    @SuppressWarnings("deprecation")
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
 
        lvData1 = (ListView) getView().findViewById(R.id.listView1);
 
 
        class MyTask extends AsyncTask<Void, Void, Void> {
 
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                //tvInfo.setText("Begin");
            }
 
            @Override
            protected Void doInBackground(Void... params) {
//              try {
//                  TimeUnit.SECONDS.sleep(2);
//              } catch (InterruptedException e) {
//                  e.printStackTrace();
//              }
 
                db = new DB(getActivity());
                db.open();
 
 
                cursor = db.getAllData(arg);
                MyCursorLoader cursorLoader = new MyCursorLoader(getActivity(), db);
                cursor = cursorLoader.loadInBackground();
                String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
                int[] to = new int[] { R.id.ivImg, R.id.tvText };
                scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item,
                        cursor, from, to, 0);
 
                db.close();
                return null;
            }
 
            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                //tvInfo.setText("End");
            }
        }
 
 
        lvData1.setBackgroundColor(Color.LTGRAY);
        lvData1.setAdapter(scAdapter);
 
 
 
 
        
    //  setListAdapter(scAdapter);
 
 
 
        registerForContextMenu(lvData1);
 
        lvData1.setOnItemClickListener(new OnItemClickListener() {
            private int getSelectedItemPosition() {
                // TODO Auto-generated method stub
 
                return 0;
            }
        @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                
                 id_col= cursor.getInt(0);
                 String link= cursor.getString(3);
                                      String st=String.valueOf(arg3);
                                 Intent intent = new Intent(getActivity(), ImageV.class);
                    intent.putExtra("ключ", cursor.getString(3)); // ередаем в интент значение курсора (Среда), где 0 - первый столбец
                    startActivity(intent);
 
            
                            }
        });
         
                
    }
 
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, CM_DELETE_ID, 0, R.string.delete_record);
    }
 
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем из пункта контекстного меню данные по пункту списка
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            // извлекаем id записи и удаляем соответствующую запись в БД
            db.delRec(acmi.id);
            // получаем новый курсор с данными
            cursor.requery();
        //  getSupportLoaderManager().getLoader(0).forceLoad();
            scAdapter.notifyDataSetChanged();
            Log.d(TAG, "Удалено");
            return true;
        }
        return super.onContextItemSelected(item);
    }
 
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
        
        return new MyCursorLoader(getActivity(), db);
         
    }
 
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        scAdapter.swapCursor(cursor);
    }
 
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        // TODO Auto-generated method stub
 
    }
 
    static class MyCursorLoader extends CursorLoader {
 
        DB db;
 
        public MyCursorLoader(Context context, DB db) {
            super(context);
            this.db = db;
        }
 
        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.getAllData(arg);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return cursor;
        }
 
    }
 
    public void onDestroy() {
        super.onDestroy();
        // close connection
 
    }
}


приложение запускается но список, то ли не отображается то ли он пустой.

Добавлено через 23 часа 11 минут
подскажите пожалуйста, кто знает, как же сделать чтоб прокрутка Pager'а со списками - не тормозИИИЛЛЛААА ?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,724
09.10.2015, 12:31     Как победить подтормаживание при листании ViewPager со списками listview? #5
disx, честно говоря, некогда смотреть столько кода. Я так понял, вы уже добились того, чтобы списки выводились (непустыми). По крайней мере, вынесли этот код:
Java
1
2
scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item,
                        cursor, from, to, 0);
в onPostExecute. В чём вопрос-то? Если список грузится, допустим, 15 секунд, как вы его ускорите? Допустим, пользователь хочет пролистать сразу к третьей вкладке. Дайте ему эту возможность. Не грузите список целиком, если пользователь покидает текущую вкладку.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 521
Записей в блоге: 1
24.10.2015, 11:02  [ТС]     Как победить подтормаживание при листании ViewPager со списками listview? #6
CoolMind, чтоб легче смотрелось кинул только Create и AsyncTask:

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
        public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
 
makelist = new MakeList();
        makelist.execute();
    }
 
 
    class MakeList extends AsyncTask<Void, Void, Void> {
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            db = new DB(getActivity());
            db.open();
            lvData1 = (ListView) getView().findViewById(R.id.listView1);
        }
 
        @Override
        protected Void doInBackground(Void... params) {
            try {
 
                cursor = db.getAllData(arg);
                MyCursorLoader cursorLoader = new MyCursorLoader(getActivity(), db);
                cursor = cursorLoader.loadInBackground();
                String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
                int[] to = new int[] { R.id.ivImg, R.id.tvText };
                
 
 
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
 
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item,
                    cursor, from, to, 0);
            lvData1.setBackgroundColor(Color.LTGRAY);
            lvData1.setAdapter(scAdapter);
            registerForContextMenu(lvData1);
            lvData1.setOnItemClickListener(new OnItemClickListener() {
                private int getSelectedItemPosition() {
                    // TODO Auto-generated method stub
 
                    return 0;
                }
 
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                        long arg3) {
 
                    id_col = cursor.getInt(0);
                    String link = cursor.getString(3);
                    String st = String.valueOf(arg3);
                    Intent intent = new Intent(getActivity(), ImageV.class);
                    intent.putExtra("ключ", cursor.getString(3)); 
                    startActivity(intent);
 
 
                }
            });
            Toast ts = Toast.makeText(getActivity(), "Урррааа!!!", Toast.LENGTH_LONG);
            ts.show();
 
        }
    }


scAdapter кинул в onPostExecute, пока этого не сделал список был пустой, а сейчас подчеркнуло from, to и пишет "Cannot result symbol 'from' " и "Cannot result symbol 'to' ", т.е. ему нужен какой-то результат а какой и как его передать?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,724
25.10.2015, 16:26     Как победить подтормаживание при листании ViewPager со списками listview? #7
disx, поскольку вы определили
Java
1
2
String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
int[] to = new int[] { R.id.ivImg, R.id.tvText };
внутри doInBackground, то они неизвестны в onPostExecute. Их надо было бы определить, например, в onPostExecute или в самом классе.

Добавлено через 2 минуты
Вместо AsyncTask можно использовать Thread. Почитайте, там есть свои особенности. В этом случае вы также можете прекратить выполнение потока, но его плюс в том, что он может выводить данные сразу, как только они появляются. В результате, вам не нужно ожидать загрузки всех данных.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 521
Записей в блоге: 1
26.10.2015, 14:55  [ТС]     Как победить подтормаживание при листании ViewPager со списками listview? #8
CoolMind, да определил в onPostExecute, не тормозит теперь и все работает...


а для чего тогда нужен View Holder который Вы упомянули в начале темы ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2015, 10:47     Как победить подтормаживание при листании ViewPager со списками listview?
Еще ссылки по теме:
Обновление фрагмента с ListView в ViewPager Android
ViewPager - не удалять фрагмент при пролистывании Android
Android ListView: сбивается содержимое ImageView элемента при скроллинге + как сделать выделение пункта списка при нажатии?
Android Как победить окирпичивание?
Android Как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,724
30.10.2015, 10:47     Как победить подтормаживание при листании ViewPager со списками listview? #9
disx, рад, что получилось.
ViewHolder в компоненте ListView необходим для быстрого обращения к элементам, минуя долгую операцию findViewById. Т.е. позволяет переиспользовать элементы (поля). В этом случае загружаются только видимые элементы.
Yandex
Объявления
30.10.2015, 10:47     Как победить подтормаживание при листании ViewPager со списками listview?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru