2016-12-28 70 views
0

我想使用畢加索在自定義ArrayAdapter中將圖像上傳到GridView。可以請任何人幫我找到我的代碼中的問題?現在我正在使用刷新按鈕撥打FetchWeatherTask將使用Picasso的URL加載到GridView中的圖像

我的主要活動:

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(); 
    } 
} 
} 

片段:

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]; 
     } 

    }; 
} 

定製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; 
    } 
} 

片段主要佈局:

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

GridView的項目佈局:

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

感謝您的幫助!

回答

0

其實,我是Xamarin的android開發者,所以我對Android有一點了解。我想你應該通過電影列表適配器如..

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

,然後應加載畢加索每個圖像。 Picasso.with(getContext()).load(MovieItems[position]).into(imagePoster);

希望它可以幫助你。 謝謝。

+0

我修改它就像「movies = movieItems;」那是你的意思?因爲我不明白部分「MovieItems = movieItems;」 ?不幸的是,它不想工作:(我不知道我是否正確地調用它。謝謝你的努力和幫助!!! –

+0

是的,我的意思是相同的。只需在影片中加載imageposter(其中你在Picasso.load方法分配) 例如:。 'Picasso.with(的getContext())的負載(movies.ImagePoster [位置])代入(imagePoster);' 希望它有助於你這個時間:) – Veswanth

+0

我修改了這一點,我也把onPostExecute方法 - 可能也失蹤了:)再次感謝! –

相關問題