【问题标题】:How to pass JSON Object into another activity?如何将 JSON 对象传递给另一个活动?
【发布时间】:2016-03-18 19:29:57
【问题描述】:

我已成功传递字符串,但我也有 int、double、Array 和 Image,但我不知道如何将它们传递给另一个活动。我试图从 CustomAdapter 传递所有这些。如果有人有更简单的方法来做到这一点,请告诉我。任何帮助都会得到帮助。

这是 JSON 所在的代码:

    public class ListaPreporuka extends AppCompatActivity {
    // Log tag
    private static final String TAG = ListaPreporuka.class.getSimpleName();

    // Movies json url
    private static final String url = "https://api.myjson.com/bins/5679m";
    private ProgressDialog pDialog;
    private List<Movie> movieList = new ArrayList<Movie>();
    private ListView listView;
    private CustomListAdapter adapter;

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

        getSupportActionBar().setTitle("Preporuke");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

        listView = (ListView) findViewById(R.id.list);
        adapter = new CustomListAdapter(this, movieList);
        listView.setAdapter(adapter);

        pDialog = new ProgressDialog(this);
        // Showing progress dialog before making http request
        pDialog.setMessage("Učitavanje...");
        pDialog.show();

        // Creating volley request obj
        JsonArrayRequest movieReq = new JsonArrayRequest(url,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString());
                        hidePDialog();

                        // Parsing json
                        for (int i = 0; i < response.length(); i++) {
                            try {

                                JSONObject obj = response.getJSONObject(i);
                                Movie movie = new Movie();
                                movie.setTitle(obj.getString("title"));
                                movie.setThumbnailUrl(obj.getString("image"));
                                movie.setRating(((Number) obj.get("rating"))
                                        .doubleValue());
                                movie.setYear(obj.getInt("releaseYear"));

                                // Genre is json array
                                JSONArray genreArry = obj.getJSONArray("genre");
                                ArrayList<String> genre = new ArrayList<String>();
                                for (int j = 0; j < genreArry.length(); j++) {
                                    genre.add((String) genreArry.get(j));
                                }
                                movie.setGenre(genre);

                                // adding movie to movies array
                                movieList.add(movie);


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

                        }

                        // notifying list adapter about data changes
                        // so that it renders the list view with updated data
                        adapter.notifyDataSetChanged();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        hidePDialog();

                    }
                });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(movieReq);


    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        hidePDialog();
    }

    private void hidePDialog() {
        if (pDialog != null) {
            pDialog.dismiss();
            pDialog = null;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        if (item.getItemId() == android.R.id.home) {
            finish();
            overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
            return true;
        }
        return false;
    }

    @Override
    public void onBackPressed() {

        super.onBackPressed();
        overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    }

}

这是自定义列表适配器的代码:

    import com.dusandimitrijevic.app.AppController;
import com.dusandimitrijevic.hororfilmovi_analizeiocene.MoviesSingleActivity;
import com.dusandimitrijevic.hororfilmovi_analizeiocene.R;
import com.dusandimitrijevic.model.Movie;




import java.util.List;




import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;





import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;

public class CustomListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<Movie> movieItems;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public CustomListAdapter(Activity activity, List<Movie> movieItems) {
        this.activity = activity;
        this.movieItems = movieItems;
    }

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

    @Override
    public Object getItem(int location) {
        return movieItems.get(location);
    }

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

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

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.lista_preporuka_red, null);

        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();
        NetworkImageView thumbNail = (NetworkImageView) convertView
                .findViewById(R.id.thumbnail);
        TextView title = (TextView) convertView.findViewById(R.id.title);
        TextView rating = (TextView) convertView.findViewById(R.id.rating);
        TextView genre = (TextView) convertView.findViewById(R.id.genre);
        TextView year = (TextView) convertView.findViewById(R.id.releaseYear);

        // getting movie data for the row
        Movie m = movieItems.get(position);

        // thumbnail image
        thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader);

        // title
        title.setText(m.getTitle());

        // rating
        rating.setText("Ocena: " + String.valueOf(m.getRating()));

        // genre
        String genreStr = "";
        for (String str : m.getGenre()) {
            genreStr += str + ", ";
        }
        genreStr = genreStr.length() > 0 ? genreStr.substring(0,
                genreStr.length() - 2) : genreStr;
        genre.setText(genreStr);

        // release year
        year.setText(String.valueOf(m.getYear()));

        convertView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(activity, MoviesSingleActivity.class);

                intent.putExtra("Movie", movieItems.get(position).getId());
                activity.startActivity(intent);

            }
        });

        return convertView;
    }

}

这是我传递 JSON 的 Activity 代码:

    public class MoviesSingleActivity extends AppCompatActivity {

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

        Intent i = getIntent();

        i.getExtras().getString("Movie");



    }

}

编辑

电影类:

    public class Movie {
private String id;
private String title, thumbnailUrl;
private int year;
private double rating;
private ArrayList<String> genre;

public Movie() {
}

public Movie(String name, String thumbnailUrl, int year, double rating,
             ArrayList<String> genre) {
    this.title = name;
    this.thumbnailUrl = thumbnailUrl;
    this.year = year;
    this.rating = rating;
    this.genre = genre;
}

public Movie(String id, String name, String thumbnailUrl, int year, double rating,
             ArrayList<String> genre) {
    this.id = id;
    this.title = name;
    this.thumbnailUrl = thumbnailUrl;
    this.year = year;
    this.rating = rating;
    this.genre = genre;
}

public String getTitle() {
    return title;
}

public void setTitle(String name) {
    this.title = name;
}

public String getThumbnailUrl() {
    return thumbnailUrl;
}

public void setThumbnailUrl(String thumbnailUrl) {
    this.thumbnailUrl = thumbnailUrl;
}

public int getYear() {
    return year;
}

public void setYear(int year) {
    this.year = year;
}

public double getRating() {
    return rating;
}

public void setRating(double rating) {
    this.rating = rating;
}

public ArrayList<String> getGenre() {
    return genre;
}

public void setGenre(ArrayList<String> genre) {
    this.genre = genre;
}

public String getId(){
    return id;
}

public void setId(String id){
    this.id = id;
}

}

【问题讨论】:

  • 您是否考虑过使用捆绑附加功能? [stackoverflow.com/questions/4233873/…[1]:stackoverflow.com/questions/4233873/…
  • 我会尝试,但我不知道如何传递例如 Image、ArrayList 和 double。
  • 如果您想传递自定义对象,您可以使用单例创建一个类来保存对这些实例的引用,使用单例将使您能够访问该类的相同实例,并且您将在您的新活动。参考这个类似的问题stackoverflow.com/questions/15164144/…
  • @RamIndani 如果您可以看到我正在尝试在 onClickListener 方法中将实例从 CustomListAdapter 传递到 MoviesSingleActivity,但我只设法传递了字符串。我已经编辑了我的问题,你可以看到我的电影课。
  • @RamIndani 但是如果在同一个任务中使用其他参数启动同一个活动怎么办?它将重写最先被调用且位于后栈下方的活动数据。

标签: android json parsing


【解决方案1】:

我已经创建了一些代码来帮助您,我已经修改了您的 Movie 类以向其添加 id - 以唯一标识它。如果可能的话,我希望你有 id 或生成唯一的 id。

import java.util.ArrayList;
public class Movie {
private String id;
private String title, thumbnailUrl;
private int year;
private double rating;
private ArrayList<String> genre;

public Movie() {
}

public Movie(String name, String thumbnailUrl, int year, double rating,
             ArrayList<String> genre) {
    this.title = name;
    this.thumbnailUrl = thumbnailUrl;
    this.year = year;
    this.rating = rating;
    this.genre = genre;
}

public Movie(String id, String name, String thumbnailUrl, int year, double rating,
             ArrayList<String> genre) {
    this.id = id;
    this.title = name;
    this.thumbnailUrl = thumbnailUrl;
    this.year = year;
    this.rating = rating;
    this.genre = genre;
}

public String getTitle() {
    return title;
}

public void setTitle(String name) {
    this.title = name;
}

public String getThumbnailUrl() {
    return thumbnailUrl;
}

public void setThumbnailUrl(String thumbnailUrl) {
    this.thumbnailUrl = thumbnailUrl;
}

public int getYear() {
    return year;
}

public void setYear(int year) {
    this.year = year;
}

public double getRating() {
    return rating;
}

public void setRating(double rating) {
    this.rating = rating;
}

public ArrayList<String> getGenre() {
    return genre;
}

public void setGenre(ArrayList<String> genre) {
    this.genre = genre;
}

public String getId(){
    return id;
}

public void setId(String id){
    this.id = id;
}

}

一旦你有了这个类,我就创建了一个类来保存你的电影数据。

import java.util.HashMap;


public class MovieModelData {

private HashMap<String, Movie> movieData = new HashMap<String,Movie>();

public void setMovieData(Movie movie){
    movieData.put(movie.getId(), movie);

}

public Movie getMovie(String id){
    return movieData.get(id);
}


}

现在只需将您的 id 作为字符串从自定义适配器传递,将您的电影对象保存到 MovieModelData 中的哈希图上方,然后按 O(1) 的顺序在您想要的任何活动中取回它。

我希望这会有所帮助

【讨论】:

  • 好的,如果我在 onClickListener 方法中声明这样可以吗.. i.putExtra("Movie", movieItems.get(position).getId());
  • 这就是我在 Activity 接收器中添加的内容.. i.getExtras().getString("Movie");
  • 是的,这应该可以工作,一旦你得到了那个 id,你就可以用它从上面的集合中检索你的 Movie 对象
  • 我已经完成了你向我建议的一切,但现在我得到了一个 textViews 的布局和一个我设置了默认 ic_launcher 的图像。我需要为 textView 或 image 设置结果吗?
  • 我认为你缺少一些东西来生成列表视图,你必须将你的适配器设置为列表视图关注这个博客theopentutorials.com/tutorials/android/listview/…
【解决方案2】:

我建议在课堂上存储数据并通过 EventBus https://github.com/greenrobot/EventBus/blob/master/HOWTO.md 或者你可以使用 putExtra

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多