2016-12-28 2 views
0

Ich versuche, Bilder in GridView mit Picasso in Custom ArrayAdapter hochladen. Könnte mir bitte jemand helfen, das Problem in meinem Code zu finden? Momentan verwende ich die Refresh-Taste, um FetchWeatherTask anzurufen.Laden von Bildern aus URLs mit Picasso in GridView

Meine Haupttätigkeit:

public class MainActivity extends AppCompatActivity { 

private static final String MAINFRAGMENT_TAG = "MainFrgament"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ActionBar menu = getSupportActionBar(); 
    menu.setIcon(R.mipmap.ic_launcher); 
    menu.setDisplayShowHomeEnabled(true); 

    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new MainFragment(), MAINFRAGMENT_TAG) 
       .commit(); 
    } 
} 
} 

Fragment:

public class MainFragment extends Fragment { 


static public PosterArrayAdapter adapter; 
static public GridView movieGrid; 
static public ArrayList<String> imagesPosters; 
static public List<MovieClass> movies; 

public MainFragment() { 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.refresh_menu, menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    int iD = item.getItemId(); 
    if (iD == R.id.refresh) { 

     FetchMovieDataTask downloadTask = new FetchMovieDataTask(); 
     downloadTask.execute("popularity.desc"); //second option is "rating.desc" 
     movieGrid.setAdapter(adapter); 

     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

// onCreateView - main task UI happens here 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View rootview = inflater.inflate(R.layout.fragment_main, container, false); 

    movieGrid = (GridView) rootview.findViewById(R.id.movies_grid); 

    return rootview; 
    } 
} 

FetchMovieDataTask:

public class FetchMovieDataTask extends AsyncTask<String, Void, String> { /* last String refers to String beofre DoInBackground */ 

    private final String MOVIEDATA_TAG = FetchMovieDataTask.class.getSimpleName(); 

    String movieJSONStr = null; 

    @Override 
    protected String doInBackground(String... params) { 

     if (params.length == 0) { 
      return null; 
     } 

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 

     try { 

      final String FORECAST_BASE_URL = "http://api.themoviedb.org/3/discover/movie"; 
      final String SORTBY_PARAM = "sort_by"; 
      final String APPKEY_PARAM = "api_key"; 

      Uri builtUri = Uri.parse(FORECAST_BASE_URL).buildUpon() 
        .appendQueryParameter(SORTBY_PARAM, params[0]) 
        .appendQueryParameter(APPKEY_PARAM, BuildConfig.OPEN_MOVIES_API_KEY) 
        .build(); 

      URL url = new URL(builtUri.toString()); 

      Log.v(MOVIEDATA_TAG, "URL: " + builtUri.toString()); 

      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      StringBuffer buffer = new StringBuffer(); 

      if (inputStream == null) { 
       return null; 
      } 

      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 
      while ((line = reader.readLine()) != null) { 

       buffer.append(line + "\n"); 
      } 

      if (buffer.length() == 0) { 

       return null; 
      } 

      movieJSONStr = buffer.toString(); 
      Log.v(MOVIEDATA_TAG, "Data: " + movieJSONStr); 

     } catch (
       IOException e 
       ) { 
      Log.e("PlaceholderFragment", "Error ", e); 
      return null; 
     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (final IOException e) { 
        Log.e("PlaceholderFragment", "Error closing stream", e); 
       } 
      } try { 
       return String.valueOf(getMovieDataFromJson(movieJSONStr)); 
      } catch (JSONException e) { 
       Log.e(MOVIEDATA_TAG, e.getMessage(), e); 
       e.printStackTrace(); 
      } 
      return movieJSONStr; 
     } 
    } 

    /* JSON Parsing */ 

    private ArrayList<String> getMovieDataFromJson(String movieJSONStr) 
      throws JSONException { 

     final String ORIGINAL_TITLE = "original_title"; 
     final String POSTER_PATH = "poster_path"; 
     final String PLOT_SYNOPSIS = "overview"; 
     final String USER_RATING = "vote_average"; 
     final String RELEASE_DATE = "release_date"; 

     String BASIC_URL = "http://image.tmdb.org/t/p/w185/"; 

     JSONObject movieJson = new JSONObject(movieJSONStr); 
     String movieInfo = movieJson.getString("results"); 
     JSONArray movieArray = new JSONArray(movieInfo); 

     imagesPosters = new ArrayList<>(movieArray.length()); 
     MovieClass movieClassItem = new MovieClass(); 
     movies = new ArrayList<MovieClass>(); 

     for (int i = 0; i < movieArray.length(); i++) { 

      JSONObject detail = movieArray.getJSONObject(i); 

      String original_title = detail.getString(ORIGINAL_TITLE); 
      String poster_path = detail.getString(POSTER_PATH); 
      String plot_synopsis = detail.getString(PLOT_SYNOPSIS); 
      String user_rating = detail.getString(USER_RATING); 
      String release_date = detail.getString(RELEASE_DATE); 
      movieClassItem.setPoster_path(poster_path); 

      imagesPosters.add("http://image.tmdb.org/t/p/w185/" + poster_path); 
      movies.add(movieClassItem); 
     } 
     for (String s : imagesPosters) { 
      Log.v(MOVIEDATA_TAG, "Path: " + s); 
     } 
     Log.v(MOVIEDATA_TAG, "Array"+ imagesPosters.toString()); 
     return imagesPosters; 
    } 
} 

MovieClass:

public class MovieClass implements Parcelable { 

    String poster_path; 

    public MovieClass() { 
    } 

    private MovieClass(Parcel parcel){ 
     poster_path = parcel.readString(); 
    } 


    public String getPoster_path() { 
     return poster_path; 
    } 


    public void setPoster_path(String poster_path) { 
     this.poster_path = poster_path; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeString(this.poster_path); 
    } 

    public final Parcelable.Creator<MovieClass> CREATOR = new Parcelable.Creator<MovieClass>() { 
     @Override 
     public MovieClass createFromParcel(Parcel parcel) { 
      return new MovieClass(parcel); 
     } 

     @Override 
     public MovieClass[] newArray(int i) { 
      return new MovieClass[i]; 
     } 

    }; 
} 

Individuelle ArrayAdapter:

public class PosterArrayAdapter extends ArrayAdapter<MovieClass> { 

    private final String LOG_TAG = PosterArrayAdapter.class.getSimpleName(); 

    public PosterArrayAdapter(Activity context, List<MovieClass> movieItems) { 
     super(context, 0, movieItems); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     MovieClass movie = getItem(position); 

     convertView = LayoutInflater.from(getContext()).inflate(R.layout.grid_view_item, parent, false); 

     ImageView imagePoster = (ImageView) convertView.findViewById(imageView); 
     Picasso.with(getContext()).load(imagesPosters.get(position)).into(imagePoster); 

     return convertView; 
    } 
} 

Fragment Haupt Layout:

<?xml version="1.0" encoding="utf-8"?> 
<GridView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.example.martyna.popularmovies.MainFragment" 
    android:id="@+id/movies_grid" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:numColumns="2" 
    android:verticalSpacing="0dp" 
    android:horizontalSpacing="0dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center_horizontal" /> 

Grid Artikel Layout:

<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"> 

    <ImageView 
     android:orientation="vertical" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:id="@+id/imageView" 
     android:scaleType="centerCrop" 
     tools:ignore="ContentDescription" /> 
</FrameLayout> 

Dank für die Hilfe!

Antwort

0

Eigentlich bin ich ein Xamarin Android Entwickler, also habe ich wenig Wissen über Android. Ich denke, dass Sie Filme Liste an den Adapter passieren sollte wie ..

public PosterArrayAdapter(Activity context, List<MovieClass> movieItems) { super(context, 0, movieItems); MovieItems=movieItems; }

Und dann sollte jedes Bild in Picasso laden. Picasso.with(getContext()).load(MovieItems[position]).into(imagePoster);

Ich hoffe, es hilft Ihnen. Danke.

+0

Ich änderte es wie "filme = movieItems;" das hast du gemeint? Weil ich den Teil "MovieItems = movieItems" nicht verstehe. ? Und leider will es nicht funktionieren :(Ich bin mir nicht sicher, ob ich es richtig nenne. Vielen Dank für Ihre Mühe und Hilfe !!! –

+0

Ja, ich meinte das Gleiche. Laden Sie einfach das Imageposter in diese Filme (Which Sie haben) in der Picasso.load Methode zugewiesen ZB:... 'Picasso.with (getContext()) Last (movies.ImagePoster [position]) in (imagePoster);' Hoffe, dass es Sie, das hilft Zeit :) – Veswanth

+0

Ich habe dies geändert und ich auch onPostExecute Methode - wahrscheinlich, dass auch fehlte :) Vielen Dank wieder !!! –

Verwandte Themen