无法从URL得到图标,当移动没有任何互联网或是否有可能在节省内部存储,然后从那里读

问题描述 投票:1回答:1
  1. 我有我已经从那里读取数据的解析XML。我已经手动宣布了一些数据和其他数据将由用户自行保存。
  2. 我已经声明了下滑,但它没有得到正确的图标,或者在没有互联网的图标被隐藏。
  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;
    }
}

ASS你可以在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>
java android android-fragments xml-parsing
1个回答
1
投票

所以,如果我理解正确的,你有两个问题。

  1. 默认的图标不显示(即隐藏)当没有互联网。
  2. 要显示图像一旦加载,即使没有互联网。

二者皆可以利用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)占位符可以使用,当不加载互联网问题的图像,因此你要显示的默认图像来代替。

如果您想了解更多关于缓存策略,this link可以很好的帮助。

更新1

基于您的评论,我想你应该在这里有一个if声明。当绘制在本地可用,那么你将使用setImageResource功能,else使用滑翔加载图像。

更新2

您不必如果您正在使用滑翔与DiskStrategy.ALL保存到本地的图像。这将缓存图像,当互联网连接不可用,会自动显示。我想建议你删除的手动设置。

更新3

如果你想使用一些图标从自己绘制的,那么你可以考虑把这样的事情。

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

希望你的想法。

© www.soinside.com 2019 - 2024. All rights reserved.