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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
#1

Кэширование изображений - Программирование Android

11.09.2014, 16:13. Просмотров 1723. Ответов 5
Метки нет (Все метки)

Добрый День Ув. Программисты.

Приложение нуждается в Кэшировании изображений, загруженных с сервера.

Вопрос: Как осуществить?

Что уже имеется:

MainActivity
Кликните здесь для просмотра всего текста
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
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
 
public class MainActivity extends Activity  {
    private static final String TAG = MainActivity.class.getSimpleName();
    CustomListAdapter aAdpt;
    private EditText editTxt;
    private View footer;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(TAG, "Стартанули");
        ArrayList<NewsItem> image_details = getListData();
        final ListView lv1 = (ListView) findViewById(R.id.listView);
 
        aAdpt = new CustomListAdapter(this, image_details);
        lv1.setAdapter(aAdpt);
        lv1.setTextFilterEnabled(true);
        editTxt = (EditText) findViewById(R.id.inputSearch);
        lv1.setAdapter(aAdpt);
 
        editTxt.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.d(TAG, "onTextChanged [" + s + "] - Start [" + start + "] - Before [" + before + "] - Count [" + count + "]");
                if (count < before) {          
                aAdpt.resetData();
                }
                aAdpt.getFilter().filter(s.toString());
            }
 
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.d(TAG, "beforeTextChanged [" + s + "] - Start [" + start + "] - After [" + after + "] - Count [" + count + "]");
            }
 
            @Override
            public void afterTextChanged(Editable s) {
                Log.d(TAG, "afterTextChanged [" + s + "] - Editable ");
            }
        });
        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                Object o = lv1.getItemAtPosition(position);
                NewsItem newsData = (NewsItem) o;
                Toast.makeText(MainActivity.this, "Selected :" + " " + newsData,
                        Toast.LENGTH_LONG).show();
            }
        });
 
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) { 
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
        }
 
    private ArrayList<NewsItem> getListData() {
        ArrayList<NewsItem> results = new ArrayList<NewsItem>();
        results.add(new NewsItem("Текст1", "Текст2", "http://musite.ru/1.jpg"));
        results.add(new NewsItem("Текст1", "Текст2", "http://musite.ru/2.jpg"));
        results.add(new NewsItem("Текст1", "Текст2", "http://musite.ru/3.jpg"));
        results.add(new NewsItem("Текст1", "Текст2", "http://musite.ru/4.jpg"));
        results.add(new NewsItem("Текст1", "Текст2", "http://musite.ru/5.jpg"));
 
        //B ещё +100500
        return results;
    }
    }



CustomListAdapter
Кликните здесь для просмотра всего текста
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
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
 
public class CustomListAdapter extends BaseAdapter implements Filterable {
    private List<NewsItem> listData;
        private ArrayList<NewsItem> origlistData;
    private LayoutInflater layoutInflater;
        private Filter ADRFilter;
 
    public CustomListAdapter(Context context, ArrayList<NewsItem> listData) {
        this.listData = listData;
        layoutInflater = LayoutInflater.from(context);
                this.origlistData = listData;
    }
 
    @Override
    public Filter getFilter() {
        if (ADRFilter == null)
            ADRFilter = new adrFilter();
        return ADRFilter;
    }
 
    @Override
    public int getCount() {
        return listData.size();
    }
 
    @Override
    public Object getItem(int position) {
        return listData.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.list_row_layout, null);
            holder = new ViewHolder();
            holder.headlineView = (TextView) convertView.findViewById(R.id.Title);
            holder.reportedDateView = (TextView) convertView.findViewById(R.id.Date);
                        holder.imageView = (ImageView) convertView.findViewById(R.id.thumbImage);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
 
        NewsItem newsItem = (NewsItem) listData.get(position);
        holder.headlineView.setText(newsItem.getHeadline());
        holder.reportedDateView.setText(newsItem.getDate());
        if (holder.imageView != null) {
            new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl());
        }
        return convertView;
    }
 
    public void resetData() {
           listData  = origlistData;
    }
 
    public void add(Collection<String> listdata) {
        this.listData.addAll(listData);
    }
 
    static class ViewHolder {
        TextView headlineView;
        //TextView reporterNameView;
        TextView reportedDateView;
        ImageView imageView;
    }
 
    private class adrFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            if (constraint == null || constraint.length() == 0) {
                results.values = origlistData;
                results.count = origlistData.size();
            }
            else {
                List<NewsItem> nListData = new ArrayList<NewsItem>();
 
                for (NewsItem p : listData) {
                    if (p.getHeadline().toUpperCase().contains(constraint.toString().toUpperCase()))
                        nListData.add(p);
                }
 
                results.values = nListData;
                results.count = nListData.size();
 
            }
            return results;
        }
 
        @Override
        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {
            if (results.count == 0)
                notifyDataSetInvalidated();
            else {
                listData = (List<NewsItem>) results.values;
                notifyDataSetChanged();
            }
        }
    }
}



NewsItem
Кликните здесь для просмотра всего текста
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
public class NewsItem {
    private String headline;
    private String reporterName;
    private String date;
    private String url;
 
    public NewsItem(String s, String s1, String s2) {
        this.headline = s;
        this.reporterName = reporterName;
        this.date = s1;
        this.url = s2;
    }
 
    public String getUrl() {
        return url;
    }
 
    public void setUrl(String url) {
        this.url = url;
    }
 
    public String getHeadline() {
        return headline;
    }
 
    public void setHeadline(String headline) {
        this.headline = headline;
    }
 
    public String getReporterName() {
        return reporterName;
    }
 
    public void setReporterName(String reporterName) {
        this.reporterName = reporterName;
    }
 
    public String getDate() {
        return date;
    }
 
    public void setDate(String date) {
        this.date = date;
    }
 
    @Override
    public String toString() {
        return "[ headline=" + headline + ", reporter Name=" + reporterName + " , date=" + date + "]";
    }
}


Что пробовал делать:

1) Пробовал использовать с ГитХаба:
ImageLoader.java
FileCache.java
MemoryCache.java

Так и не удалось мне их прикрутить.
2) Пробовал проверять перед загрузкой и сохранять если не имеется в памяти - не получилось
3) Пробовал брать за пример вообще другой исходник с реализацией Lazyload но не смог туда прикрутить Поиск по ListView точнее прикрутил но при поиске ничего не происходит.

Нуждаюсь в помощи профессионалов. Help me!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2014, 16:13     Кэширование изображений
Посмотрите здесь:

Кэширование списка - Программирование Android
Здравствуйте! Есть список ArrayList, который содержит объекты моего класса, куда входят как обычные String и int, так и Bitmap и...

Кэширование в андроид - Программирование Android
Не подскажете как можно сохранить целое именно в КЭШ память устройства а не, например, в SharedPreferences? Можете привести фрагмент кода

Хранение и кэширование новостей - Программирование Android
Доброе утро, сабж: В какой контейнер следует подгружать новости ( обычного string не хватит ) и кэшировать ли их в preferences или есть...

Просмотр изображений - Программирование Android
Пытаюсь сделать просмотр изображений, но не знаю с чего начать) Суть такая: на флешке есть папки с изображениями (sdcard/images1,...

Наложение изображений - Программирование Android
Подскажите пожалуйста, как наложить изображение на изображение. Пробую вот так: но последующая картинка стирает предыдущую. ImageView...

Загрузка изображений - Программирование Android
Здравствуйте. Есть база изображений, например на web сервере, хостинге или соц сети. Задумка проста. Ни каких меню и кнопок, только...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
11.09.2014, 16:14  [ТС]     Кэширование изображений #2
Это не поместилось((

ImageDownloaderTask
Кликните здесь для просмотра всего текста
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
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import java.io.InputStream;
import java.lang.ref.WeakReference;
 
class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
    //@SuppressWarnings("unchecked")
    private final WeakReference<ImageView> imageViewReference;
 
    public ImageDownloaderTask(ImageView imageView) {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }
 
    @Override
    protected Bitmap doInBackground(String... params) {
        return downloadBitmap(params[0]);
    }
    
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }
        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            if (imageView != null) {
 
                if (bitmap != null) {
                    imageView.setImageBitmap(bitmap);
                } else {
                    imageView.setImageDrawable(imageView.getContext().getResources()
                            .getDrawable(R.drawable.list_placeholder));
                }
            }
        }
    }
 
    static Bitmap downloadBitmap(String url) {
        final AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
        final HttpGet getRequest = new HttpGet(url);
        try {
            HttpResponse response = client.execute(getRequest);
            final int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK) {
                Log.w("ImageDownloader", "Error " + statusCode
                        + " while retrieving bitmap from " + url);
                return null;
            }
 
            final HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream inputStream = null;
                try {
                    inputStream = entity.getContent();
                    final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                    return bitmap;
                } finally {
                    if (inputStream != null) {
                        inputStream.close();
                    }
                    entity.consumeContent();
                }
            }
        } catch (Exception e) {
            getRequest.abort();
            Log.w("ImageDownloader", "Error while retrieving bitmap from " + url);
        } finally {
            if (client != null) {
                client.close();
            }
        }
        return null;
    }
 
}
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
11.09.2014, 16:42     Кэширование изображений #3
Обязательно писать самому?

https://github.com/square/picasso
https://github.com/nostra13/Android-...l-Image-Loader
https://github.com/bumptech/glide
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
11.09.2014, 17:18  [ТС]     Кэширование изображений #4
Все замечательно только к ним нужно будет прикручивать поиск который у меня уже реализован. ((( над которым я долго пыхтел))

Добавлено через 31 минуту
Или если есть у кого исходник или ссылка на тему поделитесь пожалуйста. Интересует следующая реализация: загрузка+кэширование+поиск в листвью. И дозагрузка изображений по OnScrollChange.
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
11.09.2014, 17:25     Кэширование изображений #5
Цитата Сообщение от cezer_ak Посмотреть сообщение
прикручивать поиск который у меня уже реализован.
Что? Не нужно там ничего прикручивать.

например, если использовать Universal Image Loader, в адаптере нужно изменить всего одну строчку:
Java
1
new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl());
на
Java
1
ImageLoader.getInstance().displayImage(newsItem.getUrl(), holder.imageView, displayOptions);
и все.
ну, еще нужно один объект добавить, что бы включить кеширование:
Java
1
2
3
4
final DisplayImageOptions displayOptions = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .build();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2014, 21:29     Кэширование изображений
Еще ссылки по теме:

Создание кэша изображений - Программирование Android
Нужна помощь в создании в приложении кэша для изображений типа DiscLruCache

ScrollView для изображений - Программирование Android
при загрузке картинок в ScrollView возникает следующая ситуация до 12 картинок все нормально а 13 картинку уже недьзя переполняется буфер...

Динамическое отображение изображений - Программирование Android
Помогите, а то я в ступоре. Вообщем какова задача: Сервер возвращает json с урлами изображений. Я их заганяю в arraylist. Есть адаптер...

Вывод изображений и текста из БД - Программирование Android
вопрос знатокам :в приложении из базы данных выводится текст,среди этого текста есть картинки,хранящиеся так же в бд.сам вопрос в том как...

Загрузка изображений на сервер - Программирование Android
Здравствуйте. Пытаюсь загрузить изображение на свой сервер в интернете. Нашел вот такой пример: import java.io.DataInputStream; import...

Вставка изображений в WebView - Программирование Android
Прошу помощи! Нужно вставить изображение в WebView. Последствием каких инструментов это можно сделать. Опишите пожалуйста. Буду очень...


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

Или воспользуйтесь поиском по форуму:
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
11.09.2014, 21:29  [ТС]     Кэширование изображений #6
Ок сейчас попробую отпишусь.

Добавлено через 3 часа 11 минут
Как я и думал, там нет поиска, кэширование есть, а Search in ListView или по другому Filter нету. Вопрос остается открытым. Надеюсь на вашу помощь!!!

Добавлено через 49 минут
Не ужели ни кто не видел подобной реализации кэш+сеарч+onscrollchange (три в одном)???
Yandex
Объявления
11.09.2014, 21:29     Кэширование изображений
Ответ Создать тему
Опции темы

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