Невозможно получить значок из URL, если на мобильном телефоне нет интернета или его можно сохранить во внутреннем хранилище, а затем прочитать с него - PullRequest
0 голосов
/ 05 февраля 2019
  1. У меня есть парсинг XML, который я прочитал оттуда.Я вручную объявил некоторые данные, и другие данные будут сохранены пользователем.
  2. Я объявил с помощью glide, но он не получает нужную иконку или когда нет интернета, иконки скрыты.
  3. В объявленном xml у них есть значки на чертеже, и когда я анализирую их, они читаются, и я могу показать.

Что я хочу, есть ли возможность взять значок и сохранить в рисованном видеили во внутреннюю память или кэш, чтобы я мог читать, даже если у меня нет Интернета.Элементы, которые были объявлены вручную и проанализированы для них, берут значок из списка, а для остальных - значок из URL.

Вот то, что я пробовал до сих пор.

Pojo.class

public class Bookmark implements Parcelable, Comparable  {
    String name, id, nativeUrl, searchUrl;
    long db_id;
    int icon;
    int viewType;

    // Constructor, getters, setters & other default functions are omitted for simplicity.
}

Adapter.class

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    ArrayList<Bookmark> arrayList;
    BookmarkDB bookmarkDB;
    public static final int ITEM_TYPE_ONE = 0;
    public static final int ITEM_TYPE_TWO = 1;
    boolean connected = false;
    String BASE_URL = "https://besticon-demo.herokuapp.com/icon?url=";
    public MyAdapter(Context context, ArrayList<Bookmark> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
    }

    private boolean switchOnOff;

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = null;
        if (viewType == ITEM_TYPE_ONE) {
            view = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false);
            return new ViewHolder(view);
        } else if (viewType == ITEM_TYPE_TWO) {
            view = LayoutInflater.from(context).inflate(R.layout.add_bookmark, parent, false);
            return new ButtonViewHolder(view);
        } else {
            return  null;
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        final int itemType = getItemViewType(position);
        if (itemType == ITEM_TYPE_ONE) {
            final ViewHolder viewHolder = (ViewHolder) holder;
            viewHolder.tvName.setText(arrayList.get(position).getName());
            RequestOptions requestOptions = new RequestOptions();
            bookmarkDB = new BookmarkDB(context);
                viewHolder.tvIcon.setImageResource(arrayList.get(position).getIcon());         

            Glide.with(context)
                    .load(BASE_URL+arrayList.get(position).getSearchUrl() + "&size=32;")
                    .apply(requestOptions)
                    .into(viewHolder.tvIcon);

            viewHolder.tvIcon.setImageResource(arrayList.get(position).getIcon());
            viewHolder.tvId.setText(arrayList.get(position).getId());
            viewHolder.tvSearchUrl.setText(arrayList.get(position).getSearchUrl()); 
        } else if (itemType == ITEM_TYPE_TWO) {
            ButtonViewHolder buttonViewHolder = (ButtonViewHolder) holder;
            buttonViewHolder.imgButton.setImageResource(arrayList.get(position).getIcon());
        }
    }

    @Override
    public int getItemViewType(int position) {
        // Based on you list you will return the ViewType 
        if (arrayList.get(position).getViewType() == 0) return ITEM_TYPE_ONE;
        else return ITEM_TYPE_TWO;
    }
}

Задница, которую вы можете увидеть на Adapter.class

// This get the icon from drawable and it sets to parsed array.
viewHolder.tvIcon.setImageResource(arrayList.get(position).getIcon());

// This gets the icon from URL and sets it to the parsed array but only when the user has internet.
Glide.with(context)
    .load(BASE_URL+arrayList.get(position).getSearchUrl() + &size=32;")
    .apply(requestOptions)
    .into(viewHolder.tvIcon);

Это заявленная XML, которая у меня естьпроанализировал, файл объявлен под res/xml/bookmarks.xml

<Bookmarks>
    <Bookmark name="Bing" hidden="" icon="bing" id="0" nativeUrl="" searchUrl="https://www.bing.com" />
    <Bookmark name="Google"  hidden="" icon="google" id="1" nativeUrl="" searchUrl="https://www.google.com" />
    <Bookmark name="Youtube" hidden="" icon="youtube" id="2" nativeUrl="" searchUrl="http://m.youtube.com" />
</Bookmarks>

1 Ответ

0 голосов
/ 06 февраля 2019

Так что, если я правильно понял, у вас две проблемы.

  1. Значок по умолчанию не отображается (то есть скрыт), когда нет интернета.
  2. Вы хотите показать загруженные изображения, даже если нет интернета.

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

String imageUrl = BASE_URL + arrayList.get(position).getSearchUrl() + "&size=32";
Glide.with(context)
    .load(imageUrl)
    .diskCacheStrategy(DiskCacheStrategy.ALL) 
    .placeholder(R.drawable.placeholder)
    .into(viewHolder.tvIcon);

DiskCacheStrategy.ALL управляет кэшированием ваших изображений и должно загружать изображения, даже если устройство находится в автономном режиме.Установка заполнителя с помощью .placeholder(R.drawable.placeholder) может использоваться, когда изображения не загружены из-за проблем с Интернетом, и, следовательно, вы хотите вместо этого показать изображение по умолчанию.

Если вы хотите узнать больше о стратегиях кэширования, эта ссылка также может помочь.

Обновление 1

Исходя из вашего комментария, я думаю, что вы должны иметь здесь if заявление.Когда отрисовка доступна локально, вы будете использовать функцию setImageResource, else использовать Glide для загрузки изображения.

Обновление 2

У вас нетнеобходимо сохранить изображения локально, если вы используете Glide с DiskStrategy.ALL.Он будет кэшировать изображения и будет отображаться автоматически, когда интернет-соединение недоступно.Я хотел бы предложить вам удалить ручную настройку.

Обновление 3

Если вы хотите использовать некоторые значки из вашего собственного рисунка, то вы можете подумать над тем, чтобы сделать что-то подобное.

if (theIconIsAvailableInDrawable) showThatFromDrawable();
else useGlideToShowTheIconFromUrlUsingDiskCacheStrategy();

Надеюсь, вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...