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

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

Восстановить пароль Регистрация
 
disx
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
30.06.2015, 21:29     Как победить подтормаживание при листании ViewPager со списками listview? #1
Как победить подтормаживание при листании ViewPager со списками listview?

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

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


P.S. эээх,...вот бы примерчик...
disx
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
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
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
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
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
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
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
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
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
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?
Еще ссылки по теме:

Android Задать позицию ListView в ViewPager
Android Рисование на canvas - подтормаживание
Android Как победить окирпичивание?
Как листать фрагменты в ViewPager по кнопке? Android
Как заставить работать ViewPager + TabLayout в ScrollView? Android

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

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

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