2016-04-20 5 views
0

Я получаю данные от JSON с волейболом. В данных, отображаемых в bookContent, есть теги <img> в разных положениях.Универсальный загрузчик изображений: почему загружаются изображения, ограничивающие вертикальный размер текстового поля

Я использую универсальный загрузчик изображений для загрузки изображений в тегах <img>.

Это - моя деятельность.

BookDetails

public class BookDetails extends AppCompatActivity{ 

    private final String TAG = "BookDetails"; 

    private JSONObject bookData; 

    protected com.nostra13.universalimageloader.core.ImageLoader mImageLoader; 


    TextView bookTitle, bookAuthorDate, bookContent; 
    View firstView, secView; 
    CircularNetworkImageView authorImg; 
    ImageLoader AuthImgLoader; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_book_details); 

     showDialog(); 

     bookTitle = (TextView) findViewById(R.id.dbook_title); 
     bookAuthorDate = (TextView) findViewById(R.id.author_date); 
     bookContent = (TextView) findViewById(R.id.dbook_content); 
     authorImg = (CircularNetworkImageView) findViewById(R.id.author_img); 
     firstView = findViewById(R.id.dviewtop); 
     secView = findViewById(R.id.dviewbottom); 

     DisplayImageOptions defaultoptions = new DisplayImageOptions.Builder() 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .build(); 
     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
       .defaultDisplayImageOptions(defaultoptions) 
       .writeDebugLogs() 
       .build(); 


     mImageLoader = com.nostra13.universalimageloader.core.ImageLoader.getInstance(); 
     mImageLoader.init(config); 

     ActionBar actionBar = getSupportActionBar(); 
     if (actionBar != null) { 
      actionBar.setDisplayHomeAsUpEnabled(true); 
     } 



     if (savedInstanceState != null) { 

      try { 
       String bookDataStr = savedInstanceState.getString("bookData"); 
       bookData = new JSONObject(bookDataStr); 

       parseBook(bookData); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 


     } else { 
      if (NetworkCheck.isAvailableAndConnected(this)) { 
       //Calling method to load books 
       loadBook(); 
      } else { 
       internetDialog.show(); 
      } 
     } 
    } 


    private void loadBook() { 
     Log.d(TAG, "loadBook called"); 

     final ProgressBar progressBar; 
     progressBar = (ProgressBar) findViewById(R.id.progress_circle); 
     progressBar.setVisibility(View.VISIBLE); 


     int news_id = getIntent().getIntExtra("BookId", -1); 
     Log.d(TAG, "You clicked book id " + book_id); 

     final JsonObjectRequest jsonObjReq = new JsonObjectRequest(DetailConfig.GET_DURL + book_id, null, 


       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         Log.d("Debug", response.toString()); 

         //Dismissing progressbar; 
         if (progressBar != null) { 
          progressBar.setVisibility(View.GONE); 
         } 

         bookData = response; 

         //Calling method to parse json array 
         parseBook(response); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d("", "Error: " + error.getMessage()); 

         if (progressBar != null) { 
          progressBar.setVisibility(View.GONE); 
         } 


        } 
       }); 

     //Creating request queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

     //Adding request to queue 
     requestQueue.add(jsonObjReq); 
    } 

    //This method will parse json data of book 
    private void parseBook(JSONObject jsonObject) { 

     Log.d(TAG, "Parsing book array"); 


      try { 
       String title = jsonObject.getString(DetailConfig.TAG_DPOST_TITLE); 
       bookTitle.setText(Html.fromHtml(title)); 

       JSONObject pAuthor = jsonObject.getJSONObject("author"); 
       String author = pAuthor.getString("name"); 
       String authorimg = pAuthor.getString("avatar"); 

       AuthImgLoader = VolleyRequest.getInstance(getApplicationContext()).getImageLoader(); 
       AuthImgLoader.get(authorimg, ImageLoader.getImageListener(authorImg, R.drawable.ic_author, R.drawable.ic_author)); 
       authorImg.setImageUrl(authorimg, AuthImgLoader); 

       String content = jsonObject.getString(DetailConfig.TAG_DPOST_CONTENT); 
       Spanned spanned = Html.fromHtml(content, new UILImageGetter(bookContent, this), null); 
       bookContent.setText(spanned); 

      } catch (JSONException w) { 
       w.printStackTrace(); 
      } 

     //Unhiding views 
     bookTitle.setVisibility(View.VISIBLE); 
     bookAuthorDate.setVisibility(View.VISIBLE); 
     bookContent.setVisibility(View.VISIBLE); 
     authorImg.setVisibility(View.VISIBLE); 
     firstView.setVisibility(View.VISIBLE); 
     secView.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("bookData", bookData.toString()); 
    } 


} 

Ниже, я использую этот кусок кода, который я получил от the accepted answer in this question для загрузки изображений в bookContent.

Этот класс использует универсальный загрузчик изображений.

UILImageGetter

public class UILImageGetter implements Html.ImageGetter{ 
    Context c; 
    TextView conatiner; 
    UrlImageDownloader urlDrawable; 

    public UILImageGetter(View textView, Context context) { 
     this.c = context; 
     this.conatiner = (TextView) textView; 
    } 

    @Override 
    public Drawable getDrawable(String source) { 
     urlDrawable = new UrlImageDownloader(c.getResources(), source); 
     if (Build.VERSION.SDK_INT >= 21) { 
     urlDrawable.mDrawable = c.getResources().getDrawable(R.drawable.default_thumb,null); 
     } else { 
      urlDrawable.mDrawable = c.getResources().getDrawable(R.drawable.default_thumb); 
     } 
     ImageLoader.getInstance().loadImage(source, new SimpleListener(urlDrawable)); 
     return urlDrawable; 
    } 

    private class SimpleListener extends SimpleImageLoadingListener { 
     UrlImageDownloader mUrlImageDownloader; 

     public SimpleListener(UrlImageDownloader downloader) { 
      super(); 
      mUrlImageDownloader= downloader; 
     } 

     @Override 
     public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
      int width = loadedImage.getWidth(); 
      int height = loadedImage.getHeight(); 

      int newWidth = width; 
      int newHeight = height; 

      if (width > conatiner.getWidth()) { 
       newWidth = conatiner.getWidth(); 
       newHeight = (newWidth * height)/width; 
      } 

      if (view != null) { 
       view.getLayoutParams().width = newWidth; 
       view.getLayoutParams().height = newHeight; 
      } 

      Drawable result = new BitmapDrawable(c.getResources(), loadedImage); 
      result.setBounds(0, 0, newWidth, newHeight); 

      mUrlImageDownloader.setBounds(0, 0, newWidth, newHeight); 
      mUrlImageDownloader.mDrawable = result; 

      conatiner.setHeight((conatiner.getHeight() + result.getIntrinsicHeight())); 
      conatiner.invalidate(); 
     } 

    } 

    private class UrlImageDownloader extends BitmapDrawable { 
     public Drawable mDrawable; 

     public UrlImageDownloader(Resources resources, String filepath) { 
      super(resources, filepath); 
      mDrawable = new BitmapDrawable(resources, filepath); 
     } 

     @Override 
     public void draw(Canvas canvas) { 
      if (mDrawable != null) { 
       mDrawable.draw(canvas); 
      } 
     } 
    } 
} 

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

Загруженные изображения влияют на вертикальные линии, которые отображаются в bookContent. Если есть много вертикальных линий, часть его обрезается. И если у bookContent очень мало вертикальных линий, в нижней части TextView остается большое пустое пространство. Однако, если я не загружаю изображения, bookContent выглядит прекрасно, без отсечек, без дополнительного места.

Пожалуйста, как это исправить?

ответ

0

Я пробую ответ на эту проблему с комментария dcow в this question. То, что я сделал, что я удалил

conatiner.setHeight((conatiner.getHeight() + result.getIntrinsicHeight()));

и написал

container.setText(container.getText()); под

container.setText(container.getText());.