我对Android很新,我遇到了第一个问题,我似乎无法找到答案。这是我的问题:
我的应用程序将使用项目列表,每个列表行都有图像,点击后,相同的图像和项目的更多信息将显示在新活动中。但是,可能需要显示100-500(或更多)图像。到目前为止,我只测试了我的应用程序约有6个项目,因此内存在当前时间不是问题,但是当我与朋友讨论我的应用程序时,他提出了将图像放在图像托管上的建议站点并使用URL来引用它们。
我的问题是:网址引用方法是否是大量图片的最佳解决方案,还是以不同的方式做得更好?
如果这已经得到解答,我在搜索时忽略了它,我道歉并要求你指出我正确的方向。
感谢。
答案 0 :(得分:0)
我认为"网址参考"是一个好主意。不要担心很多图像。它不会使用太多内存因为ListView(或RecyclerView)缓存不同的视图。在List中,你可以显示一些较小的iamges(例如100x100),但是在另一个活动中,你可以显示真实尺寸的图像。它不是同一个图像,有两个图像。
您可以查看这些库:
答案 1 :(得分:0)
我建议使用2件事。第一个是 LruCache 来存储每个位图(参见http://developer.android.com/reference/android/util/LruCache.html)。这将负责管理是否需要从磁盘重新加载位图。 你应该做的第二件事是使用自定义适配器的 ListView 来提供你的观点,以便它可以回收它们(而不是只在中有一个 LinearLayout ScrollView 或其他东西)。适配器通过获取现有视图并仅为特定索引设置内容来工作。例如,如果您有一个项目数组,并且每个项目都有要显示的图像和文本,您将创建一个适配器,其中包含项目列表并将其设置在 ListView < / strong>即可。 ListView会跟踪显示的项目,并为每个项目调用 getView(int position,View convertView,ViewGroup parent)。如果该位置的该类型的项目已存在该视图,则传入的 convertView 将是当前未使用的视图。在这种情况下,只需在其上设置图像和文本。 如果它为null,则表示所有可用视图都在使用中,因此您需要为新视图充气。在这种情况下给它充气,然后在上面设置图像/文字。
例如,您的适配器可能如下所示:
public class MyListAdapter extends BaseAdapter {
public class MyListItem {
String ImagePath;
String Text;
}
ArrayList<MyListItem> mItems;
LayoutInflater mInflater;
Context mContext;
public MyListAdapter(Context context, ArrayList<MyListItem> items) {
mItems = items;
mContext = context;
mInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public MyListItem getItem(int position) {
return mItems.get(position);
}
@Override
public long getItemId(int position) {
// If you have more than 1 type of view, give each an ID
// and return the ID for the view you want to display
// at this position in the array list.
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.SOME_VIEW_ID, null);
// Perhaps set some layout parameters on convertView.
}
// Get the item at this position
MyListItem item = getItem(position);
// Set properties on the convertView here
// For the sake of example, pretend we have a View class
// called "ExampleView" with setImagePath and setText methods.
// setImagePath could lookup the path in an LruCache and load it
// it from disk if it isn't in there.
ExampleView someCustomView = (ExampleView)convertView;
someCustomView.setImagePath(item.ImagePath);
someCustomView.setText(item.Text);
return convertView;
}
}