在ListView中添加图像显示内存不足

时间:2016-06-22 05:51:29

标签: android listview

我正在创建包含图像和文本的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>

6 个答案:

答案 0 :(得分:2)

这里的问题是,您尝试在列表视图中添加的图像很大,并且在一定时间后它们超过了android提供的默认内存。
要完成此操作,您必须将图像缩小到您实际想要的尺寸
如果使用fit()

,您可以使用自己进行缩放工作的Piccaso

你所要做的就是这个。

在您的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(),而是使用像GlidePicasso这样的库,它可以非常流畅地加载图像并进行图像缓存以快速加载。

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中打开图像,将其缩小并将其导出并降低质量,以便占用更少的空间,这对我有用。

应该是一些更好的解决方案,因为我的图像首先只有几兆字节。