2016-08-06 7 views
0

Так что в настоящее время у меня есть список, который показывает изображения и текст рядом с ним, но с проблемой показов изображений. Я думал, что лучший подход - разобрать с помощью JSOUP, а затем загрузить изображение и декодировать его с помощью bitmapsFactory, но не удалось, потому что требуется слишком много памяти, все еще отображающей изображения. Есть ли способ отображать изображение в Интернете, чтобы оно не занимало места? я подумал об использовании Webview, а затем вставьте ссылку и покажу картинку, но это сработает? Я включил в список мои MainActivity, ListClass, ImageHandler и XML.Как эффективно показывать изображения в списке?

Основная деятельность;

import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.view.View; 
import android.support.design.widget.NavigationView; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.app.FragmentManager; 
import android.widget.FrameLayout; 
import android.widget.Button; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.app.Activity; 
import android.graphics.BitmapFactory; 
import android.graphics.drawable.Drawable; 




public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    ListView list; 
    imageHandler imagess = new imageHandler(); 

    String[] web = {"Egypt "}; 
    Drawable[] imageId = { imagess.LoadImageFromWebOperations("http://egyptianstreets.com/wp-content/uploads/2016/08/satelliteegypt-400x240.jpg")}; 

    Handler handler; 
    Button button; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 
     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 
     listClass adapter = new 
       listClass(MainActivity.this, web, imageId); 
     list=(ListView)findViewById(R.id.list); 
     list.setAdapter(adapter); 

     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 
       Toast.makeText(MainActivity.this, "You Clicked at " +web[+ position], Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    } 

ListClass;

import android.app.Activity; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class listClass extends ArrayAdapter<String>{ 



    //Next three lines introduces Variables to use in the class 
    private final Activity context; 
    private final String[] web; 
    private final Drawable[] imageId; 

    //Constructor to get Web, Image and context to set adapter 
    public listClass(Activity context, String[] web, Drawable[] imageId) { 

      super(context, R.layout.list, web); 
      this.context = context; 
      this.web = web; 
      this.imageId = imageId; 

    } 

    //Public method to ... 
    @Override 
    public View getView(int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView= inflater.inflate(R.layout.list, null, true); 

     TextView txtTitle = (TextView) rowView.findViewById(R.id.txt); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.img); 
     txtTitle.setText(web[position]); 
     imageView.setImageDrawable(imageId[position]); 
     return rowView; 
    } 
} 

ImageHandler использует InputStream, но не работает;

import android.media.Image; 
import java.net.URL; 
import android.graphics.BitmapFactory; 
import java.io.InputStream; 
import android.graphics.drawable.Drawable; 




public class imageHandler { 

    Image picture; 


    public static Drawable LoadImageFromWebOperations(String url) { 
     try { 
      InputStream is = (InputStream) new URL(url).getContent(); 
      Drawable d = Drawable.createFromStream(is, "earthdownload"); 
      return d; 
     } catch (Exception e) { 
      return null; 
     } 
    } 
} 

XML для списка ;;

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ImageView 
     android:id="@+id/img" 
     android:layout_width="150dp" 
     android:layout_height="100dp" /> 

    <TextView 
     android:id="@+id/txt" 
     android:paddingRight="16dp" 
     android:textSize="15dp" 
     android:layout_alignLeft="@+id/img" 
     android:layout_marginLeft="150dp" 
     android:layout_width="wrap_content" 
     android:layout_height="100dp" 
     android:layout_weight="1" 
     android:ellipsize="none" 
     android:maxLines="100" 
     android:scrollHorizontally="false"/> 

</RelativeLayout> 
+1

Попробуйте библиотеку андроида picasso. – Razgriz

+0

@Razgriz Я думал об этом или с помощью Glide Library, но кто-то сказал мне, что эти библиотеки загружают изображения на телефон, которые будут неэффективными. –

+0

glide или picasso не загружают изображения, которые они кэшируют them.it - ​​очень эффективный способ. Вы также можете отключить кеширование. [Скольжение] (https://github.com/bumptech/glide) – skydroid

ответ

3

Если вы используете Изображения, текстовая комбинация, я предлагаю вам взглянуть на виды переработчиков. Они намного эффективнее с изображениями. Однако вреда при использовании списка.

Для загрузки изображений используйте библиотеку Picasso. http://square.github.io/picasso/

Вы можете загружать изображения в изображение только с одной строкой кода. Надеюсь это поможет.

0

Используйте библиотеку Volley для загрузки изображения и используйте этот Класс чтобы загрузить изображение.

public class LruBitmapCache extends LruCache<String, Bitmap> implements 
    ImageCache { 
public static int getDefaultLruCacheSize() { 
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024); 
    final int cacheSize = maxMemory/8; 

    return cacheSize; 
} 

public LruBitmapCache() { 
    this(getDefaultLruCacheSize()); 
} 

public LruBitmapCache(int sizeInKiloBytes) { 
    super(sizeInKiloBytes); 
} 

@Override 
protected int sizeOf(String key, Bitmap value) { 
    return value.getRowBytes() * value.getHeight()/1024; 
} 

@Override 
public Bitmap getBitmap(String url) { 
    return get(url); 
} 

@Override 
public void putBitmap(String url, Bitmap bitmap) { 
    put(url, bitmap); 
} 

}

добавить XML для ImageView

<!-- Thumbnail Image --> 
<com.android.volley.toolbox.NetworkImageView 
    android:id="@+id/thumbnail" 
    android:layout_width="80dp" 
    android:layout_height="80dp" 
    android:layout_alignParentLeft="true" 
    android:layout_marginRight="8dp" /> 

комплект адаптер

if (imageLoader == null) 
     imageLoader = AppController.getInstance().getImageLoader(); 
    NetworkImageView thumbNail = (NetworkImageView) convertView 
      .findViewById(R.id.thumbnail); 

Для получения дополнительной информации и может пойти here

1

Как Нихилу имеет sugg попробуйте использовать библиотеку Пикассо. Его легко реализовать и эффективно.

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

Picasso.with(context).load(imageURI/path/file).fit().error(R.id.error_img) //an image that gets displayed in case of error 
.into(R.id.img_container, new Callback() { 
    void onSuccess() {} 
    void onError() {} 
}) 

Надеюсь, это поможет!