我正在创建包含图像和文本的listView,但遗憾的是,它可以用于添加三个图像,而不是它显示的内存。我看到很多类似的问题。但我仍然得到任何明确的想法如何在我的代码中调用Bitmap函数。
我的代码在这里,帮我完成这项任务。
public class MainActivity extends AppCompatActivity {
String[] titles;
ListView list1;
int [] img = {R.drawable.meal11,R.drawable.meal12,R.drawable.mrngs1,R.drawable.mrngs2,R.drawable.lunch1,R.drawable.lunch2};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list1 = (ListView) findViewById(R.id.list);
titles = new String[]{"BANANA & BERRY SMOOTHIE","COTTAGE CHEESE, AVOCADO & TOMATO TOAST","FRITTATA CAKES","CHOC PROTEIN BALLS","CHICKEN & SUNDRIED TOMATO SALAD","TUNA WRAP"};
myAdapter adapter = new myAdapter(getApplicationContext(),titles,img);
list1.setAdapter(adapter);
}
class myAdapter extends ArrayAdapter<String> {
Context context;
int[] imgs;
String[] titles;
myAdapter(Context context,String[] titles,int imgs[]) {
super(context,R.layout.list_item,R.id.text,titles);
this.context= context;
this.imgs = imgs;
this.titles = titles;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.list_item,parent,false);
ImageView myImage = (ImageView) row.findViewById(R.id.image);
TextView myText = (TextView) row.findViewById(R.id.texttitle);
myImage.setImageResource(imgs[position]);
myText.setText(titles[position]);
return row;
}
}}
mainActiviy.xml的xml代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.sa.addimagelistview.MainActivity"
android:padding="0dp">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list">
</ListView>
list_item.xml的xml代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="0.2">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/image"
android:src="@drawable/meal11"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="0.8">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/texttitle"
android:textSize="20sp"
android:text="@string/app_name"/>
</LinearLayout>
</LinearLayout>
答案 0 :(得分:2)
这里的问题是,您尝试在列表视图中添加的图像很大,并且在一定时间后它们超过了android提供的默认内存。
要完成此操作,您必须将图像缩小到您实际想要的尺寸
如果使用fit()
你所要做的就是这个。
在您的gradle compile 'com.squareup.picasso:picasso:2.5.2'
中添加Picasso依赖项
然后尝试这个
Picasso
.with(context)
.load(your_image)
.fit()
// call .centerInside() or .centerCrop() to avoid a stretched image
.into(your_imageview);
答案 1 :(得分:1)
你可以在毕加索的帮助下做到这一点......
Picasso.with(context)
.load(imgs[position])//load images into imageview
.placeholder(R.drawable.image_file)//default image
.into(myImage);
答案 2 :(得分:1)
不要直接使用setImageResource(),而是使用像Glide和Picasso这样的库,它可以非常流畅地加载图像并进行图像缓存以快速加载。
Glide Compile Line - 编译'com.github.bumptech.glide:glide:3.7.0'
Picasso Compile Line - 编译'com.squareup.picasso:picasso:2.5.2'
滑翔示例:
Glide.with(context).load(imgs[position]).into(myImage);
Picasso Exaple:
Picasso.with(context).load(imgs[position]).into(myImage);
如果您不想使用库,请尝试此official Android Link。
答案 3 :(得分:1)
放入Mainfest ---&gt;
<application
android:largeHeap="true"
>
.....
</application>
可能会有所帮助
答案 4 :(得分:1)
这是我对您的适配器的修改,请尝试这个希望它会有所帮助:D
class myAdapter extends ArrayAdapter<String> {
Context context;
int[] imgs;
String[] titles;
myAdapter(Context context,String[] titles,int imgs[]) {
super(context,R.layout.list_item,R.id.text,titles);
this.context= context;
this.imgs = imgs;
this.titles = titles;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView!=null){
holder=(ViewHolder) convertView.getTag();
}else{
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item,parent,false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
holder.myImage = (ImageView) convertView.findViewById(R.id.image);
holder.myText = (TextView) convertView.findViewById(R.id.texttitle);
myImage.setImageResource(imgs[position]);
myText.setText(titles[position]);
return convertView;
}
// somewhere else in your class definition
static class ViewHolder {
ImageView myImage;
TextView myText;
}
}
Here是ViewHolder的参考资料
答案 5 :(得分:0)
我遇到了同样的问题。如果我刚刚在Gimp中打开图像,将其缩小并将其导出并降低质量,以便占用更少的空间,这对我有用。
应该是一些更好的解决方案,因为我的图像首先只有几兆字节。