2015-12-28 6 views
0

В настоящее время я работаю над онлайн-проектом по изучению андроидов и сталкиваюсь с проблемой с обновлением сетки.Как обновить GridView для пользовательского адаптера изображения?

Мое приложение сначала отображает сетку с несколькими изображениями. По щелчку кнопки Refresh из меню, GridView должен быть заполнен новыми изображениями. Также при нажатии любого изображения приложение переходит к Detail Activity, в котором отображается текущий URL изображения.

В настоящее время я сначала заполняю GridView образцами изображений, используя мой пользовательский адаптер & Picasso. Затем выполняется AsyncTask, который получает новые URL-адреса изображений из JSON. Этот новый список изображенийURL должен быть подан на мой адаптер, чтобы сетка отображала новые изображения.

Однако я не могу этого сделать. Моя начальная сетка показывает изображения и по щелчку, я получаю их URL на экране подробных действий, как и ожидалось. Однако, когда я нажимаю на Обновить в меню, я не вижу новых изображений. Я пытаюсь установить адаптер с обновленным массивом URL в onPostExecute().

При щелчке по старому изображению я вижу новый URL-адрес в подробном действии, однако после того, как я нажму обратно, изображение все еще не обновляется, а URL-адрес снова возвращается к старой. Иногда, когда я просматриваю новое изображение, появляется сообщение, а затем происходит сбой приложения.

Итак, основная проблема заключается в том, что даже после получения новых URL-адресов я не могу заполнить GridView новыми изображениями. Любая помощь по этому поводу будет оценена по достоинству. Спасибо,

Код сниппета:

public class MovieListFragment extends Fragment { 
public CustomAdapter customAdapter; 
public GridView gv; 
public List<String> allImages=new ArrayList<String>(); 
public List<String> newImages=new ArrayList<String>(); 
public String LOG_TAG=MovieListFragment.class.getSimpleName(); 
public int abc=0; 
public MovieListFragment() { 
} 

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


    //Fake Data Creation for 1st time GridView load. 
    allImages.add("http://www.pnas.org/site/misc/images/15-01065.500.jpg"); 
    allImages.add("http://41.media.tumblr.com/78335e84b3b353ad60c335b24a5f267e/tumblr_nz2bke3fJ51rldeoho1_500.jpg"); 
    allImages.add("http://41.media.tumblr.com/78335e84b3b353ad60c335b24a5f267e/tumblr_nz2bke3fJ51rldeoho1_500.jpg"); 
    allImages.add("http://41.media.tumblr.com/78335e84b3b353ad60c335b24a5f267e/tumblr_nz2bke3fJ51rldeoho1_500.jpg"); 
    allImages.add("http://41.media.tumblr.com/78335e84b3b353ad60c335b24a5f267e/tumblr_nz2bke3fJ51rldeoho1_500.jpg"); 
    allImages.add("http://www.pnas.org/site/misc/images/15-01065.500.jpg"); 
    allImages.add("http://www.pnas.org/site/misc/images/15-01065.500.jpg"); 
    allImages.add("http://www.pnas.org/site/misc/images/15-01065.500.jpg"); 
    allImages.add("http://www.pnas.org/site/misc/images/15-01065.500.jpg"); 

    //Set Adapter 
    gv = (GridView) rootview.findViewById(R.id.gridview); 
    customAdapter=new CustomAdapter(getActivity(),allImages); 
    gv.setAdapter(customAdapter); 

    //On Click Listener 
    gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent intent = new Intent(getActivity(), DetailActivity.class); 
      intent.putExtra("imageURL", allImages.get(position).toString()); 
      startActivity(intent); 
     } 
    }); 

    return rootview; 
} 

//My Custom Adapter 
public class CustomAdapter extends BaseAdapter{ 

    private Context mContext; 
    private List<String> myImageList; 

    public CustomAdapter(Context c, List<String> finalImageList) { 

     mContext = c; 
     myImageList=finalImageList; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return myImageList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return myImageList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

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

     ImageView imageView; 
     if (convertView == null) { 
      // if it's not recycled, initialize some attributes 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(500, 500)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     // imageView.setPadding(2, 2, 2, 2); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     Picasso.with(getActivity()) 
       .load(myImageList.get(position)) 
       .into(imageView); 

     return imageView; 
    } 

}

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id=item.getItemId(); 
    if(id==R.id.action_refresh){ 
     updateMovieList(); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

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

private void updateMovieList() { 
    FetchMovieDetailsTask fetchMovieDetailsTask=new FetchMovieDetailsTask(); 
    fetchMovieDetailsTask.execute("Popularity"); 
} 

public class FetchMovieDetailsTask extends AsyncTask<String, Void, String[]>{ 
    public String LOG_TAG_SECOND=FetchMovieDetailsTask.class.getSimpleName(); 


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

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 

     // Will contain the raw JSON response as a string. 
     String movieDetailJsonStr = ""; 
     String filterType = ""; 
     String api_key = "e77c4d231a4c24ffe0357b694751910c"; 

     if (params[0].equals("Popularity")) { 
      filterType = "vote_average.desc"; 
     } else if (params[0].equals("Rating")) { 
      filterType = "popularity.desc"; 
     } 

     try { 

      final String MOVIEDETAIL_BASE_URL = "https://api.themoviedb.org/3/discover/movie?"; 
      final String FILTER_PARAM = "sort_by"; 
      final String APP_KEY_PARAM = "api_key"; 

      Uri builtUri = Uri.parse(MOVIEDETAIL_BASE_URL).buildUpon() 
        .appendQueryParameter(FILTER_PARAM, filterType) 
        .appendQueryParameter(APP_KEY_PARAM, api_key).build(); 


      URL url = new URL(builtUri.toString()); 
      Log.v(LOG_TAG_SECOND, builtUri.toString()); 

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

      // Read the input stream into a String 
      InputStream inputStream = urlConnection.getInputStream(); 
      StringBuffer buffer = new StringBuffer(); 
      if (inputStream == null) { 
       // Nothing to do. 
       return null; 
      } 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

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

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

      if (buffer.length() == 0) { 
       // Stream was empty. No point in parsing. 
       return null; 
      } 
      movieDetailJsonStr = buffer.toString(); 
      Log.v(LOG_TAG_SECOND, " Movie Details JSON " + movieDetailJsonStr); 

      try { 
       getMovieDetailsFromJSON(movieDetailJsonStr); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 


     } catch (IOException e) { 
      Log.e(LOG_TAG, "Error ", e); 
      return null; 

     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (final IOException e) { 
        Log.e(LOG_TAG, "Error closing stream", e); 
       } 
      } 
     } 
     return null; 
    } 


    private String[] getMovieDetailsFromJSON(String movieDetailsJSON) throws JSONException{ 

     final String MOV_TITLE = "title"; 
     final String MOV_OVERVIEW = "overview"; 
     final String MOV_RATING = "vote_average"; 
     final String MOV_POSTER_PATH = "poster_path"; 

     final String MOV_LIST = "results"; 

     JSONObject movieListJSON = new JSONObject(movieDetailsJSON); 
     JSONArray movieListArray = movieListJSON.getJSONArray(MOV_LIST); 

     int numOfMovies=8; 
     allImages.clear(); 
     String[] resultStrs = new String[numOfMovies]; 
     String[] resultPosters= new String[numOfMovies]; 

     for(int i=0; i<numOfMovies; i++){ 

      String title; 
      String overview; 
      String rating; 
      String poster_path; 

      JSONObject movieDetails=movieListArray.getJSONObject(i); 

      overview=movieDetails.getString(MOV_OVERVIEW); 
      title=movieDetails.getString(MOV_TITLE); 
      rating=movieDetails.getString(MOV_RATING); 
      poster_path=movieDetails.getString(MOV_POSTER_PATH); 

      resultStrs[i]=title + "\n" + overview + "\n" + rating + "\n" + poster_path; 
      resultPosters[i]=poster_path; 
      makePosterURL(resultPosters[i]); 


     } 

     for (String s : resultStrs) { 
      Log.v(LOG_TAG_SECOND, "MOVIE DETAILS: " + s); 
     } 
     return resultStrs; 


    } 

    private void makePosterURL(String resultPoster) { 
     String baseURL="http://image.tmdb.org/t/p/w500"; 
     //resultPoster=resultPoster.replace("\\", ""); 
     String finalURL=""; 
     finalURL=baseURL+resultPoster; 
     Log.v(LOG_TAG_SECOND, "Final Poster URL " + finalURL); 
     allImages.add(finalURL); 
    } 

    @Override 
    protected void onPostExecute(String[] strings) { 
     if(strings!=null){ 
      customAdapter=new CustomAdapter(getActivity(), allImages); 
      gv.invalidateViews(); 
      gv.setAdapter(customAdapter); 
     } 
     // super.onPostExecute(strings); 
    } 
} 

ответ

0

Потому что вы всегда return null в вашем doInBackground() поэтому код не сбрасывает адаптер с обновленной литой. Чтобы обновить программу обновления вам просто нужно позвонить

adapter.notifyDataSetChanged(); 

в вашем onPostExecuted()
Кстати, ваш getMovieDetailsFromJSON() возвращаемого типа String[] бесполезен так же, как doInBackgound() и вы должны сделать его недействительным, как вы не используете значение.

+0

спасибо. Я забыл обновить «return getMovieDetailsFromJSON (movieDetailJsonStr)»; в моем методе doInBackground(). Я обновил то же самое, и теперь изображения обновляются. Однако, когда я нажимаю и перехожу в DetailActivity, а затем возвращаюсь, я вижу старые образы. Я что-то упускаю? –

+0

Кроме того, я буду использовать String [], который я верну в следующих шагах, когда буду заполнять другие детали в моей DetailActivity. Большое спасибо. –

+0

Добро пожаловать :) Что вы имеете в виду, увидев старые образы? только старые изображения или старые и новые? – SaNtoRiaN

Смежные вопросы