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

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

Войти
Регистрация
Восстановить пароль
 
HanDi
890 / 337 / 8
Регистрация: 11.02.2012
Сообщений: 1,502
#1

ViewPager, adapter. Вывод картинки из массива ссылок - Программирование Android

28.01.2016, 13:35. Просмотров 351. Ответов 10
Метки нет (Все метки)

Добрый день. Поставил библиотеку Glide, вроде бы все работает с выводом одной картинки.

Пытаюсь сделать viewPager, который будет пролистывать картинки из моего массива ссылок (подгружаются в imageView через Glide).

**Есть адаптер:**

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
package com.handidevelop.myapp;
    
    import android.content.Context;
    import android.support.v4.view.PagerAdapter;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.*;
    import com.bumptech.glide.Glide;
    
    import java.util.ArrayList;
    
    public class CustomSwipeAdapter extends PagerAdapter {
    
        private Context ctx;
        private LayoutInflater layoutInflater;
        ArrayList<String> URLs;
    
        public CustomSwipeAdapter(Context ctx, ArrayList<String> URLs)
        {
            this.URLs = URLs;
            this.ctx = ctx;
        }
    
        @Override
        public int getCount() {
            return URLs.size();
        }
    
        @Override
        public boolean isViewFromObject(View view, Object o) {
            return (view==(LinearLayout)o);
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
    
            layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View item_view = layoutInflater.inflate(R.layout.swipe_layout, container, false);
            ImageView imageView = (ImageView) item_view.findViewById(R.id.image_view);
            TextView textView = (TextView) item_view.findViewById(R.id.image_count);
    
            String url = URLs.get(position);
            textView.setText("Image: " + position);
    
            Glide.with(ctx).load("http://dota2.ru"+url+".jpg").into(imageView);
    
            Toast.makeText(ctx,
                    "Position :"+position+"  ListItem : " +url , Toast.LENGTH_LONG)
                    .show();
    
            container.addView(item_view);
    
            return item_view;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((LinearLayout)object);
        }
    }
**swipe_layout.xml**

XML
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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
 
 
    <TextView
            android:id="@+id/image_count"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:textSize="25dp"
            android:textStyle="bold"
            android:gravity="center"
            android:layout_marginTop="15dp"
            />
 
    <ImageView
            android:id="@+id/image_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="15dp"
    />
 
</LinearLayout>

В основном активити:


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
 public class MyActivity extends Activity {
    
        //private EditText edit_text;
        //private ImageView imageView1;
        private ListView listView1;
        private ViewPager viewPager;
        CustomSwipeAdapter adapter;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            listView1 = (ListView) findViewById(R.id.listView1);
    
            HTMLGet htm = new HTMLGet();
            htm.execute("http://dota2.ru/memes/");
            String all = null;
            try {
                all = htm.get();
            } catch(Exception ie) {}
    
            ArrayList<String> URLs = XMLWork.getURLs(all);
    
            viewPager = (ViewPager) findViewById(R.id.view_pager);
            adapter = new CustomSwipeAdapter(this, URLs);
            viewPager.setAdapter(adapter);
    
        }
В итоге на viewPager главной формы ничего ровным счетом не выводит, не понимаю почему так происходит.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2016, 13:35     ViewPager, adapter. Вывод картинки из массива ссылок
Посмотрите здесь:
ListFragment вывод данных (adapter) Android
Android Вывод картинки из камеры в приложении
Android Вывод картинки при выполнении условия
ViewPager Android
Android ViewPager
ViewPager Android
Android ViewPager и ListView
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
28.01.2016, 13:45     ViewPager, adapter. Вывод картинки из массива ссылок #2
я бы начал с того, что переделал этот стремный кусок
Java
1
2
3
4
5
6
HTMLGet htm = new HTMLGet();
            htm.execute("http://dota2.ru/memes/");
            String all = null;
            try {
                all = htm.get();
            } catch(Exception ie) {}
задача сама должна что-то вызвать у активти когда отработает
и только потом в этом callback-методе делать
Java
1
2
3
ArrayList<String> URLs = XMLWork.getURLs(all);
            adapter = new CustomSwipeAdapter(this, URLs);
            viewPager.setAdapter(adapter);
HanDi
890 / 337 / 8
Регистрация: 11.02.2012
Сообщений: 1,502
28.01.2016, 13:48  [ТС]     ViewPager, adapter. Вывод картинки из массива ссылок #3
Паблито, кусок-то стремный это понятно, я все вынесу и поменяю, главное сейчас разобраться с выводом картинки в этот вьюпейджер
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
28.01.2016, 13:53     ViewPager, adapter. Вывод картинки из массива ссылок #4
я думаю, что в логе вылетает исключение (или не вылетает) но в момент ArrayList<String> URLs = XMLWork.getURLs(all)
all все еще равен null
HanDi
890 / 337 / 8
Регистрация: 11.02.2012
Сообщений: 1,502
28.01.2016, 19:28  [ТС]     ViewPager, adapter. Вывод картинки из массива ссылок #5
Цитата Сообщение от Паблито Посмотреть сообщение
я думаю, что в логе вылетает исключение (или не вылетает) но в момент ArrayList<String> URLs = XMLWork.getURLs(all)
all все еще равен null
сейчас будем проверять, спасибо за наводку, отпишусь

Добавлено через 5 часов 28 минут
Вообщем, ничего не понимаю, в аналогичном проекте (старая версия), все работает и никаких исключений не возникает, массив заполняется.

Старый код:

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
public void btnClick(View view) throws Exception {
        HTMLGet htm = new HTMLGet();
        htm.execute("http://dota2.ru/memes/");
        String all = htm.get();
        ArrayList<String> URLs = XMLWork.getURLs(all);
        URLs.add("kek");
 
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, URLs);
 
        listView1.setAdapter(adapter);
 
        listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
 
                int itemPosition = position;
 
                String  itemValue = (String) listView1.getItemAtPosition(position);
 
                Toast.makeText(getApplicationContext(),
                        "Position :"+itemPosition+"  ListItem : " +itemValue , Toast.LENGTH_LONG)
                        .show();
 
                //new DownloadImageTask((ImageView) findViewById(R.id.imageView1)).execute("http://dota2.ru"+itemValue+".jpg");
 
                Glide.with(MyActivity.this).load("http://dota2.ru"+itemValue+".jpg").into(imageView1);
            }
 
        });
 
    }
Соответственно в новом варианте этот код выглядит так:

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
    public void btnClick(View view) throws Exception {
        HTMLGet htm = new HTMLGet();
        htm.execute("http://dota2.ru/memes/");
        String all = htm.get();
        ArrayList<String> URLs = XMLWork.getURLs(all);
        URLs.add("KEK");
 
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, URLs);
 
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        adapter = new CustomSwipeAdapter(this, URLs);
        viewPager.setAdapter(adapter);
 
 
        listView1.setAdapter(adapter2);
 
        listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
 
                int itemPosition = position;
 
                String  itemValue = (String) listView1.getItemAtPosition(position);
 
                Toast.makeText(getApplicationContext(),
                        "Position :"+itemPosition+"  ListItem : " +itemValue , Toast.LENGTH_LONG)
                        .show();
 
                //new DownloadImageTask((ImageView) findViewById(R.id.imageView1)).execute("http://dota2.ru"+itemValue+".jpg");
 
                //Glide.with(MyActivity.this).load("http://dota2.ru"+itemValue+".jpg").into(imageView1);
            }
 
        });
    }
И тут опять же ничего в listView не выводит, ибо URLs после выполнения XMLWork.getURLs(all); просто пустой.

Что это за магия?)

Даже при вылавливании исключения путем блока try catch ситуация аналогична.
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
28.01.2016, 19:38     ViewPager, adapter. Вывод картинки из массива ссылок #6
я весь код внимательно не читал, но возникает наводящий вопрос по коду
Java
1
2
3
HTMLGet htm = new HTMLGet();
        htm.execute("http://dota2.ru/memes/");
        String all = htm.get();
вот запустили задачу во второй строке, она себе работает, никого не трогает...работает 2 секунды допустим (лаги до сервера)
но строка 3 уже выполнилась, мы уже спросили у задачи - а что там со строкой, а ну-ка дай ее

поэтому я выше и писал, что так делать неправильно
от чего наследован HTMLGet ?
HanDi
890 / 337 / 8
Регистрация: 11.02.2012
Сообщений: 1,502
28.01.2016, 19:47  [ТС]     ViewPager, adapter. Вывод картинки из массива ссылок #7
Паблито,

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
public class HTMLGet extends AsyncTask<String, String, String> {
 
    @Override
    public String doInBackground(String... url){
        StringBuilder sb = new StringBuilder();
        try {
            URL pageURL = new URL(url[0]);
            String inputLine;
            URLConnection uc = pageURL.openConnection();
 
            BufferedReader buff = new BufferedReader(new InputStreamReader(uc.getInputStream()));
            while ((inputLine = buff.readLine()) != null)
            {
                sb.append(inputLine);
            }
 
            }
             catch (Exception e) {}
             return sb.toString();
        }
 
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }
}
Я понимаю, что неправильно, тем более так работать с async, вот и хочу узнать как правильно и в чем проблемка.

Спасибо!

Добавлено через 6 минут
Паблито, вы, судя по всему, опять в точку попали. Запустил еще разок на эмуляторе не меняя код - работает.
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
28.01.2016, 19:49     ViewPager, adapter. Вывод картинки из массива ссылок #8
как один из вариантов
1. передаем через конструктор в класс HTMLGet ссылку на активити и запоминаем ее
2. когда асинктаск отработает, в onPostExecute вызываем на метод у активити
mainActivity.myAwesomeMethod(сюда передаем строку которая раньше бралась через get из этого таска);

соответственно в активити заводим метод
Java
1
2
3
4
5
6
7
8
public void myAwesomeMethod(String all) {
ArrayList<String> URLs = XMLWork.getURLs(all);
        URLs.add("KEK");
         ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, URLs);
        adapter = new CustomSwipeAdapter(this, URLs);
        viewPager.setAdapter(adapter);
}
HanDi
890 / 337 / 8
Регистрация: 11.02.2012
Сообщений: 1,502
28.01.2016, 20:30  [ТС]     ViewPager, adapter. Вывод картинки из массива ссылок #9
Паблито, как я понял это должно быть что-то в роде того:

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
public void btnClick(View view) throws Exception {
        HTMLGet htm = new HTMLGet(this);  
        htm.execute("http://dota2.ru/memes/");
        String all = htm.get();
    }
 
    public void myAw(String all) {
        ArrayList<String> URLs = XMLWork.getURLs(all);
 
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, URLs);
 
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        adapter = new CustomSwipeAdapter(this, URLs);
        viewPager.setAdapter(adapter);
 
 
        listView1.setAdapter(adapter2);
 
        listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
 
                int itemPosition = position;
 
                String  itemValue = (String) listView1.getItemAtPosition(position);
 
                Toast.makeText(getApplicationContext(),
                        "Position :"+itemPosition+"  ListItem : " +itemValue , Toast.LENGTH_LONG)
                        .show();
 
                //new DownloadImageTask((ImageView) findViewById(R.id.imageView1)).execute("http://dota2.ru"+itemValue+".jpg");
 
                //Glide.with(MyActivity.this).load("http://dota2.ru"+itemValue+".jpg").into(imageView1);
            }
 
        });
    }
в HTMLGet:

Java
1
2
3
4
5
private Context ctx;
 
    public HTMLGet(Context ctx) {
        this.ctx = ctx;
    }
Но вот проблемка, как теперь к методу MyActivity обратиться?

Java
1
2
3
4
5
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        ctx.myAw(s); // error
    }
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 1
28.01.2016, 20:39     ViewPager, adapter. Вывод картинки из массива ссылок #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Java
1
2
3
4
5
private MainActivity ctx;
 
    public HTMLGet(MainActivity ctx) {
        this.ctx = ctx;
    }
Java
1
2
3
4
5
public void btnClick(View view) throws Exception {
        HTMLGet htm = new HTMLGet(this);  
        htm.execute("http://dota2.ru/memes/");
        //String all = htm.get(); // это лишнее
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2016, 20:43     ViewPager, adapter. Вывод картинки из массива ссылок
Еще ссылки по теме:
ViewPager Indicator Android
ViewPager автодаводка Android
ViewPager setText Android
Android Поворот ViewPager
Android Правильный ViewPager

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

Или воспользуйтесь поиском по форуму:
HanDi
890 / 337 / 8
Регистрация: 11.02.2012
Сообщений: 1,502
28.01.2016, 20:43  [ТС]     ViewPager, adapter. Вывод картинки из массива ссылок #11
Паблито, благодарю, очень помогли. Спасибо! Пойду дальше разбираться
Yandex
Объявления
28.01.2016, 20:43     ViewPager, adapter. Вывод картинки из массива ссылок
Ответ Создать тему
Опции темы

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