Reputation: 93
I am having trouble implementing onItemClick
for my ListView
. I need to open a new activity on clicking the item in my ListView
and pass the title/genre/rating/release year data to this new activity. I would also like to know how can I pass the thumbnail image of the clicked Item in ListView
and display it in a new activity.
CustomListAdapter.java
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(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.list_row, 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("Rating: " + 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()));
return convertView;
}
}
Main2Activity.java
public class Main2Activity extends AppCompatActivity {
// Log tag
private static final String TAG = Main2Activity.class.getSimpleName();
// Movies json url
private static final String url = "http://api.androidhive.info/json/movies.json";
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.activity_main2);
listView = (ListView) findViewById(service_list);
adapter = new CustomListAdapter(this, movieList);
listView.setAdapter(adapter);
pDialog = new ProgressDialog(this);
// Showing progress dialog before making http request
pDialog.setMessage("Loading...");
pDialog.show();
// changing action bar color
//getActionBar().setBackgroundDrawable(
//new ColorDrawable(Color.parseColor("#1b1b1b")));
// 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;
}
}
}
Upvotes: 0
Views: 483
Reputation: 93
Everything works fine, after i changed the code with the help of people who answered to this question.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Movie movie = (Movie) adapterView.getItemAtPosition(i);
Intent intent = new Intent(view.getContext(), Main3Activity.class);
intent.putExtra("mName", movie.getTitle());
intent.putExtra("mRating", movie.getRating());
intent.putExtra("mGenre", movie.getGenre());
intent.putExtra("mYear", movie.getYear());
intent.putExtra("mServiceImage",movie.getThumbnailUrl());
//OR make Moview implement Serializable and do this :
//intent.putExtra("clickedObject", movie);
startActivity(intent);
}
});
In the final activity i use Android-Universal-Image-Loader to load the image from the url i passed from first activity.
String mName = getIntent().getExtras().getString("mServiceImage");
imageLoader.displayImage(mName, imageView);
Upvotes: 0
Reputation: 1367
You can add the individual items of the model calls as Extras to an intent, or you can make the model class implement the Serializable interface and just add the whole object to the intent manually :
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Movie movie = (Movie) adapterView.getItemAtPosition(i);
Intent intent = new Intent(view.getContext(), DetailActivity.class);
intent.putExtra("mName", movie.getTitle());
intent.putExtra("mRating", movie.getRating());
intent.putExtra("mGenre", movie.getGenre());
intent.putExtra("mYear". movie.getYear());
//Get the Bitmap object from the NetworkImageView
Bitmap bm = ((BitmapDrawable)((NetworkImageView)view.findViewById(R.id.image)).getDrawable()).getBitmap();
//Can be added directly as an Extra, as Bitmap implements Parcelable
intent.putExtra("mImage", bm);
//OR make Moview implement Serializable and do this :
//intent.putExtra("clickedObject", movie);
startActivity(intent);
}
});
In the receiving activity, you can use getExtras() to get the values :
Bitmap bm = getIntent().getExtras().getParcelable("mImage");
imageView.setImageBitmap(bm);
Upvotes: 1
Reputation: 350
You can send whole object movieItem and position of item click then In next activity you can extract them like this.
listview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> p1, View p2, int p3, long p4)
{
intent=new Intent(getBaseContext(),NextActivity.class);
intent.putParcelableArrayListExtra("key", movielist);
intent.putExtra("IntKey",p3);
}
});
Upvotes: 1