#android
#Android
Вопрос:
Я создаю приложение для просмотра фильмов, в котором есть два фрагмента для показа, сейчас воспроизводятся фильмы, и предстоящие фильмы, сейчас я создаю сейчас воспроизводимый фрагмент, и я использую макет item_movie, который имеет cardview в качестве root и relativelayout, и внутри этих двух textview и imageview, и я использую Picasso для загрузки изображений, моя проблема в том, что изображения не отображаются, но отображаются текстовые представления, я пытался найти ответ в течение нескольких часов, но у меня не получилось, это сводит меня с ума, вот код для текущего воспроизведения фрагмента
package com.example.moviemanager.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerViewAccessibilityDelegate;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.moviemanager.R;
import com.example.moviemanager.adapters.MovieRecyclerViewAdapter;
import com.example.moviemanager.models.Movie;
import java.util.ArrayList;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*/
public class NowPlayingFragment extends Fragment {
RecyclerView rcmovies;
private List<Movie> movies;
public NowPlayingFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view =inflater.inflate(R.layout.fragment_now_playing, container, false);
initializeData();
rcmovies= view.findViewById(R.id.rvMovies);
LinearLayoutManager llm=new LinearLayoutManager(this.getContext());
rcmovies.setHasFixedSize(true);
rcmovies.setLayoutManager(llm);
MovieRecyclerViewAdapter adapter=new MovieRecyclerViewAdapter(this.getContext(),movies);
rcmovies.setAdapter(adapter);
return view;
}
private void initializeData() {
movies = new ArrayList<>();
movies.add(new Movie("277834", "Moana", "In Ancient Polynesia, when a terrible curse incurred by Maui reaches an impetuous Chieftain's daughter's island, she answers the Ocean's call to seek out the demigod to set things right.", 6.5f, 854, "/z4x0Bp48ar3Mda8KiPD1vwSY3D8.jpg", "/1qGzqGUd1pa05aqYXGSbLkiBlLB.jpg"));
movies.add(new Movie("121856", "Passengers", "A spacecraft traveling to a distant colony planet and transporting thousands of people has a malfunction in its sleep chambers. As a result, two passengers are awakened 90 years early.", 6.2f, 745, "/5gJkVIVU7FDp7AfRAbPSvvdbre2.jpg", "/5EW4TR3fWEqpKsWysNcBMtz9Sgp.jpg"));
movies.add(new Movie("330459", "Assassin's Creed", "Lynch discovers he is a descendant of the secret Assassins society through unlocked genetic memories that allow him to relive the adventures of his ancestor, Aguilar, in 15th Century Spain. After gaining incredible knowledge and skills he’s poised to take on the oppressive Knights Templar in the present day.", 5.3f, 691, "/tIKFBxBZhSXpIITiiB5Ws8VGXjt.jpg", "/5EW4TR3fWEqpKsWysNcBMtz9Sgp.jpg"));
movies.add(new Movie("283366", "Rogue One: A Star Wars Story", "A rogue band of resistance fighters unite for a mission to steal the Death Star plans and bring a new hope to the galaxy.", 7.2f, 1802, "/qjiskwlV1qQzRCjpV0cL9pEMF9a.jpg", "/tZjVVIYXACV4IIIhXeIM59ytqwS.jpg"));
movies.add(new Movie("313369", "La La Land", "Mia, an aspiring actress, serves lattes to movie stars in between auditions and Sebastian, a jazz musician, scrapes by playing cocktail party gigs in dingy bars, but as success mounts they are faced with decisions that begin to fray the fragile fabric of their love affair, and the dreams they worked so hard to maintain in each other threaten to rip them apart.", 8, 396, "/ylXCdC106IKiarftHkcacasaAcb.jpg", "/nadTlnTE6DdgmYsN4iWc2a2wiaI.jpg"));
}
}
и адаптер
public class MovieRecyclerViewAdapter extends RecyclerView.Adapter<MovieRecyclerViewAdapter.viewholder> {
Context context;
List<Movie> movies;
public MovieRecyclerViewAdapter (Context context,List<Movie>movies){
this.context=context;
this.movies=movies;
}
private Context getContext(){
return context;
}
@Override
public viewholder onCreateViewHolder( ViewGroup parent, int i) {
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_movie,parent,false);
return new viewholder(v);
}
@Override
public void onBindViewHolder( viewholder holder, int pos) {
Movie movie=movies.get(pos);
holder.tvTitle.setText(movie.getTitle());
holder.tvoverview.setText(movie.getOverview());
Picasso.with(getContext()).load(movie.getPosterPath()).into(holder.ivmovieimage);
//Glide.with(getContext()).load(movie.getPosterPath()).into(holder.ivmovieimage);
}
@Override
public int getItemCount() {
return movies.size();
}
public class viewholder extends RecyclerView.ViewHolder{
TextView tvTitle;
TextView tvoverview;
ImageView ivmovieimage;
public viewholder( View view) {
super(view);
tvTitle=view.findViewById(R.id.tvTitle);
tvoverview=view.findViewById(R.id.tvOverView);
ivmovieimage=view.findViewById(R.id.ivMovieImage);
}
}
}
затем создайте модель для хранения всех данных, вот
package com.example.moviemanager.models;
public class Movie {
String id;
String title;
String overview;
float voteAverage;
float voteCount;
String posterPath;
String backdropPath;
public Movie(String id, String title, String overview, float voteAverage, float voteCount, String posterPath, String backdropPath) {
this.id = id;
this.title = title;
this.overview = overview;
this.voteAverage = voteAverage;
this.voteCount = voteCount;
this.posterPath = posterPath;
this.backdropPath = backdropPath;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getOverview() {
return overview;
}
public void setOverview(String overview) {
this.overview = overview;
}
public float getVoteAverage() {
return voteAverage;
}
public void setVoteAverage(float voteAverage) {
this.voteAverage = voteAverage;
}
public float getVoteCount() {
return voteCount;
}
public void setVoteCount(float voteCount) {
this.voteCount = voteCount;
}
public String getPosterPath() {
return String.format( "https://image.tmdb.org/t/p/w342",posterPath);
}
public void setPosterPath(String posterPath) {
this.posterPath =posterPath;
}
public String getBackdropPath() {
return backdropPath;
}
public void setBackdropPath(String backdropPath) {
this.backdropPath = backdropPath;
}
}
и XML-файл item movie
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tool="http://schemas.android.com/tools"
android:id="@ id/cvMovie"
android:clickable="true"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:foreground="?android:attr/selectableItemBackground">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@ id/ivMovieImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
/>
<TextView
android:id="@ id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toEndOf="@ id/ivMovieImage"
android:layout_toRightOf="@ id/ivMovieImage"
android:layout_marginLeft="@dimen/activity_small_margin"
android:layout_marginTop="@dimen/activity_small_margin"
android:maxLength="20"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/black"
tool:text="Captain America" />
<TextView
android:id="@ id/tvOverView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/activity_small_margin"
android:layout_marginTop="@dimen/activity_small_margin"
android:layout_toEndOf="@ id/ivMovieImage"
android:layout_toRightOf="@ id/ivMovieImage"
android:layout_below="@ id/tvTitle"
android:maxLength="200"
android:text="Captain America OverView"
/>
</RelativeLayout>
</android.support.v7.widget.CardView>
и для фрагмента
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
tools:context=".fragment.NowPlayingFragment">
<android.support.v7.widget.RecyclerView
android:id="@ id/rvMovies"
android:layout_height="match_parent"
android:layout_width="match_parent">
</android.support.v7.widget.RecyclerView>
</FrameLayout>
и для content_main
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".activities.MainActivity"
tools:showIn="@layout/app_bar_main">
<FrameLayout
android:id="@ id/flContent"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</RelativeLayout>
и я использую разрешение Интернета в манифесте
это касается всего приложения
Комментарии:
1. Добавить
android:layout_width="match_parent"
иandroid:adjustViewBounds="true"
вImageView
Ответ №1:
Просто добавьте это в свой url %s
String.format( "https://image.tmdb.org/t/p/w342%s",posterPath)
потому что вы не определили, каким образом вы хотите форматировать строку
Комментарии:
1. да, это работает, но что такое аргументы String.format () и что он делает?
2. Метод java string format() возвращает форматированную строку с использованием заданной локали, указанной строки формата и аргументов. Мы можем объединить строки, используя этот метод, и в то же время мы можем отформатировать выходную объединенную строку. Вы даже можете попробовать эту ссылку