I am making an app using youtube data api and I got stuck at a problem and not able to find a solution, so any help will be appreciated
below is my code i have tried a lot but did not find any solution and I am beginner to this so kindly help me on this ,
in onResponse method the toast messege is working that means the code is getting response but those data are not showing in recycler view
public class MainActivity extends AppCompatActivity {
RecyclerView list;
LinearLayoutManager linearLayoutManager;
ArrayList<VideosList> videosLists;
CustomRecyclerAdapter listViewAdapter;
String url = "https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=myId&maxResults=3&key=myApiKey";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = findViewById(R.id.rv);
videosLists = new ArrayList<>();
linearLayoutManager = new LinearLayoutManager(this);
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
#Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this,"Success",Toast.LENGTH_LONG).show();
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("items");
for (int i = 0; i < jsonArray.length(); i++ ) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
JSONObject jsonObjectVideoId = jsonObject1.getJSONObject("id");
JSONObject jsonObjectSnippet = jsonObject1.getJSONObject("snippet");
JSONObject jsonObjectthumb = jsonObject1.getJSONObject("thumbnails").getJSONObject("medium");
String videoId = jsonObjectVideoId.getString("videoId");
String thumb = jsonObjectthumb.getString("url");
VideosList videosList = new VideosList();
videosList.setVideoId(videoId);
videosList.setTitle(jsonObjectSnippet.getString("title"));
videosList.setThumbnail(thumb);
videosLists.add(videosList);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,"failed",Toast.LENGTH_LONG).show();
}
});
requestQueue.add(stringRequest);
list.setHasFixedSize(true);
list.setLayoutManager(linearLayoutManager);
listViewAdapter = new CustomRecyclerAdapter(this, videosLists);
list.setAdapter(listViewAdapter);
}
}
Below is layout for above code
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context="com.creativeapps.entertainmentkidsyouth.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="#+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
Below is the code for adapter
public class CustomRecyclerAdapter extends RecyclerView.Adapter<CustomRecyclerAdapter.ViewHolder> {
private ArrayList<VideosList> videosList;
private Context context;
public CustomRecyclerAdapter(Context context,ArrayList<VideosList> videoList) {
this.videosList = videoList;
this.context = context;
}
#Override
public CustomRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
#Override
public void onBindViewHolder(final CustomRecyclerAdapter.ViewHolder holder, int position) {
holder.name.setText(videosList.get(position).getTitle());
Picasso.get().load(videosList.get(position).getThumbnail()).into(holder.imageView);
}
#Override
public int getItemCount() {
return videosList != null ?videosList.size():0;
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView name;
ImageView imageView;
private ViewHolder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.thumbnail);
name = itemView.findViewById(R.id.title);
}
}
}
Below is the class for videolist
public class VideosList {
public String thumbnail, videoId, title;
public VideosList(String thumbnail, String videoId, String title) {
this.thumbnail = thumbnail;
this.videoId = videoId;
this.title = title;
}
public VideosList() {
}
public String getThumbnail() {
return thumbnail;
}
public void setThumbnail(String thumbnail) {
this.thumbnail = thumbnail;
}
public String getVideoId() {
return videoId;
}
public void setVideoId(String videoId) {
this.videoId = videoId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
layout for custom recycler view
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#fff"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="#+id/root"
android:orientation="horizontal"
android:gravity="center"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="#+id/thumbnail"
android:src="#mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:textSize="16sp"
android:layout_marginStart="10dp"
android:padding="10dp"
android:textColor="#111"
android:id="#+id/title"
android:text="Video"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
you are incorrectly parsing JSON from API
Replace
JSONObject jsonObjectthumb = jsonObject1.getJSONObject("thumbnails").getJSONObject("medium");
with
JSONObject jsonObjectthumb = jsonObject1.getJSONObject("snippet").getJSONObject("thumbnails").getJSONObject("medium");
"thumbnails" is inside "snippet" JSONObject
Replace this line
JSONObject jsonObjectthumb = jsonObject1.getJSONObject("thumbnails").getJSONObject("medium");
With
JSONObject jsonObjectthumb = jsonObjectSnippet.getJSONObject("thumbnails").getJSONObject("medium");
The 'thumbnails' object is inside the 'snippet' object.
Related
https://launchlibrary.net/1.3/launch shows json data. If you paste the id after this url, there is more in depth information about the launch, for example https://launchlibrary.net/1.3/launch/2053.
I want to get the image url of the corresponding launch but it doesn't work how I'm doing it. This is the code from where I parse the JSON data.
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
v = inflater.inflate(R.layout.activity_launches, container, false);
myRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);
myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
launchesList = new ArrayList<>();
temporaryList = new ArrayList<>();
myRequestQueue = Volley.newRequestQueue(getContext());
parseJSON();
return v;
}
private void parseJSON(){
String url = "https://launchlibrary.net/1.3/launch";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
#Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("launches");
for(int i = 0; i < jsonArray.length(); i++){
JSONObject launch = jsonArray.getJSONObject(i);
String launchName = launch.getString("name");
String launchDate = launch.getString("net");
launchId = launch.getString("id");
String imageUrl = getImageUrl();
Launch newLaunch = new Launch(launchName, launchDate, imageUrl);
launchesList.add(newLaunch);
}
myRecyclerViewAdapter = new RecyclerViewAdapter(getContext(), launchesList);
myRecyclerView.setAdapter(myRecyclerViewAdapter);
myRecyclerViewAdapter.setOnItemClickListener(LaunchesActivity.this);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
myRequestQueue.add(request);
}
public String getImageUrl(){
String url = "https://launchlibrary.net/1.3/launch/" + launchId;
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
#Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("launches");
JSONObject launch = jsonArray.getJSONObject(0);
JSONObject rocket = launch.getJSONObject("rocket");
String url = rocket.getString("imageURL");
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
myRequestQueue.add(request);
return url;
}
This is the adapter I created to change the text in the TextViews and ImageView.
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder>{
private Context myContext;
private ArrayList<Launch> launchList;
private OnItemClickListener myListener;
public interface OnItemClickListener{
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
myListener = listener;
}
public RecyclerViewAdapter(Context context, ArrayList<Launch> launchList){
myContext = context;
this.launchList = launchList;
}
#NonNull
#Override
public RecyclerViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(myContext).inflate(R.layout.launch_item, parent, false);
return new RecyclerViewHolder(v);
}
#Override
public void onBindViewHolder(#NonNull RecyclerViewHolder holder, int position) {
Launch currentItem = launchList.get(position);
String name = currentItem.getName();
String date = currentItem.getDate();
String imageUrl = currentItem.getImageUrl();
holder.myTextViewName.setText(name);
holder.myTextViewDate.setText(date);
Picasso.get().load(imageUrl).fit().centerInside().into(holder.myImageViewImage);
}
#Override
public int getItemCount() {
return launchList.size();
}
public class RecyclerViewHolder extends RecyclerView.ViewHolder{
public TextView myTextViewName;
public TextView myTextViewDate;
public ImageView myImageViewImage;
public RecyclerViewHolder(#NonNull View itemView) {
super(itemView);
myTextViewName = itemView.findViewById(R.id.launch_name);
myTextViewDate = itemView.findViewById(R.id.date);
myImageViewImage = itemView.findViewById(R.id.thumbnail);
itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if(myListener != null){
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION){
myListener.onItemClick(position);
}
}
}
});
}
}
A launch object is just this:
public Launch(String name, String date, String imageUrl) {
this.name = name;
this.date = date;
this.imageUrl = imageUrl;
}
What am I doing wrong?
Recyclerview item layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_marginTop="5dp"
android:padding="8dp"
android:background="#323131">
<ImageView
android:id="#+id/thumbnail"
android:layout_width="100dp"
android:layout_height="match_parent"
android:scaleType="centerCrop"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="130dp"
android:layout_margin="8dp"
android:orientation="vertical">
<TextView
android:id="#+id/launch_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Launch name"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#android:color/white"/>
<TextView
android:id="#+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="Date"
android:textColor="#android:color/white"/>
</LinearLayout>
Recyclerview layout
Recyclerview layout:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="#+id/recycler_view"
android:background="#323131"/>
make getImage function get the index of array object and i will tell you why
String imageUrl = getImageUrl(i);
public String getImageUrl(final int index)
after getting url adding that
String url = rocket.getString("imageURL");
launchesList.get(index).imageUrl = url;
myRecyclerViewAdapter.notifyItemChanged(index);
now i tell the thread of get image get image and when finish notify adapter
it work for me
In your getImageUrl() you are returning the wrong url which is this:
String url = "https://launchlibrary.net/1.3/launch/" + launchId;
instead do this:
public String getImageUrl(){
String url = "https://launchlibrary.net/1.3/launch/" + launchId;
//add this
String imageURL = null;
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
#Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("launches");
JSONObject launch = jsonArray.getJSONObject(0);
JSONObject rocket = launch.getJSONObject("rocket");
imageURL = rocket.getString("imageURL");
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
myRequestQueue.add(request);
//return it here
return imageURL;
}
my friend above help u in parsing but let me know why you use two request one for parsing object and second one for get image but u should know that here you will use two thread so we will work on make them in one thread
and check if catch print any log
please send object in array to getImage function and continue to parse
String imageUrl = getImageUrl(launch );
and fix getImageUrl function
public String getImageUrl(JSONObject launch ){
JSONObject rocket = launch.getJSONObject("rocket");
String url = rocket.getString("imageURL");
return url;
}
try this if error still exist please inform me and i will try it on my code
I am trying to archive this functionality for my grocery app https://imgur.com/Ugj4BIO
But I am failed to do so!
I am showing you what I am able to archive. if you have any Better Solution let me know.
Here is my Json code from which I am fetching my data from web server right now its localhost
{"cats":
[{"sub_cats":
[{
"sub_id":"1",
"sub_title":"Charger",
"sub_img":"http:\/\/localhost\/adminPohanch\/public\/img\/img23.jpg"
},
{
"sub_id":"2",
"sub_title":"Dummy",
"sub_img":"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcTrRRV2S-HAzHVIfS0EtgfIeWnej05TRN1PqWQCLW44h3NqM9UOtQ"
}
],
"id":"52",
"title":"Electric Equipments",
"img":""}],
"message":"Categories Loaded","success":1}
Here is the retofit's API abstract class's method
#GET("cats.php")
Call<Categories> getCategories();
My Categories Model Class is this
public class Categories {
#SerializedName("id")
#Expose
private String id;
#SerializedName("title")
#Expose
private String title;
#SerializedName("img")
#Expose
private String img;
#SerializedName("sub_id")
#Expose
private String sub_id;
#SerializedName("sub_title")
#Expose
private String sub_title;
#SerializedName("sub_img")
#Expose
private String sub_img;
#SerializedName("cats")
#Expose
private List<Categories> cats = null;
#SerializedName("sub_cats")
#Expose
private List<Categories> sub_cats = null;
#SerializedName("message")
#Expose
private String message;
#SerializedName("success")
#Expose
private Integer success;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public String getSub_id() {
return sub_id;
}
public void setSub_id(String sub_id) {
this.sub_id = sub_id;
}
public String getSub_title() {
return sub_title;
}
public void setSub_title(String sub_title) {
this.sub_title = sub_title;
}
public String getSub_img() {
return sub_img;
}
public void setSub_img(String sub_img) {
this.sub_img = sub_img;
}
public List<Categories> getCats() {
return cats;
}
public void setCats(List<Categories> cats) {
this.cats = cats;
}
public List<Categories> getSub_cats() {
return sub_cats;
}
public void setSub_cats(List<Categories> sub_cats) {
this.sub_cats = sub_cats;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getSuccess() {
return success;
}
public void setSuccess(Integer success) {
this.success = success;
}
}
Here is the code for my Activity
from which I am getting result/data and initializing to my Adapter
Call<Categories> callCats = RetrofitBuilder.getInstance().getApi().getCategories();
callCats.enqueue(new Callback<Categories>() {
#Override
public void onResponse(Call<Categories> call, Response<Categories> response) {
Categories cats = response.body();
Log.d("cats", "onResponse: " + cats);
if (cats != null){
List<Categories> catsList = cats.getCats();
Log.d("Categories", "onResponse: " + catsList.size());
Log.d("Categories", "onResponse: " + cats.getCats().toString());
for(int i = 0; i < catsList.size(); i++){
Categories categoriesData = new Categories();
String id = catsList.get(i).getId();
String title = catsList.get(i).getTitle();
String img = catsList.get(i).getImg();
categoriesData.setId(id);
categoriesData.setTitle(title);
categoriesData.setImg(img);
getCatItems.add(categoriesData);
List<Categories> sub = catsList.get(i).getSub_cats();
Toast.makeText(BuyerDashboard.this, ""+sub.size(), Toast.LENGTH_SHORT).show();
for (int j = 0; j < sub.size(); j++){
Categories categories = new Categories();
categories.setId(sub.get(i).getSub_id());
categories.setSub_title(sub.get(i).getSub_title());
categories.setSub_img(sub.get(i).getSub_img());
getSubItems.add(categories);
}
}
ExpandableRecyclerViewAdapter expandableCategoryRecyclerViewAdapter =
new ExpandableRecyclerViewAdapter(getApplicationContext(), getCatItems, getSubItems);
expanderRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
expanderRecyclerView.setAdapter(expandableCategoryRecyclerViewAdapter);
}
}
#Override
public void onFailure(Call<Categories> call, Throwable t) {
Toast.makeText(BuyerDashboard.this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
**ExpandableRecyclerViewAdapter **
public class ExpandableRecyclerViewAdapter extends RecyclerView.Adapter<ExpandableRecyclerViewAdapter.ViewHolder> {
List<Categories> nameList ;
List<Integer> counter = new ArrayList<Integer>();
List<Categories> itemNameList;
Context context;
public ExpandableRecyclerViewAdapter(Context context,
List<Categories> nameList,
List<Categories> itemNameList ) {
this.nameList = nameList;
this.itemNameList = itemNameList;
this.context = context;
Log.d("namelist", nameList.toString());
for (int i = 0; i < nameList.size(); i++) {
counter.add(0);
}
}
#NonNull
#Override
public ExpandableRecyclerViewAdapter.ViewHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.cat_items, viewGroup, false);
ExpandableRecyclerViewAdapter.ViewHolder vh = new ExpandableRecyclerViewAdapter.ViewHolder(v);
return vh;
}
#Override
public void onBindViewHolder(#NonNull final ExpandableRecyclerViewAdapter.ViewHolder holder, final int position) {
Categories categories = nameList.get(position);
holder.name.setText(categories.getTitle());
InnerRecyclerViewAdapter itemInnerRecyclerView = new InnerRecyclerViewAdapter(itemNameList, context);
holder.cardRecyclerView.setLayoutManager(new GridLayoutManager(context, 2));
holder.cardView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if (counter.get(position) % 2 == 0) {
holder.cardRecyclerView.setVisibility(View.VISIBLE);
} else {
holder.cardRecyclerView.setVisibility(View.GONE);
}
counter.set(position, counter.get(position) + 1);
}
});
holder.cardRecyclerView.setAdapter(itemInnerRecyclerView);
}
#Override
public int getItemCount() {
return nameList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView name;
ImageButton dropBtn;
RecyclerView cardRecyclerView;
CardView cardView;
public ViewHolder(final View itemView) {
super(itemView);
name = itemView.findViewById(R.id.categoryTitle);
dropBtn = itemView.findViewById(R.id.categoryExpandBtn);
cardRecyclerView = itemView.findViewById(R.id.innerRecyclerView);
cardView = itemView.findViewById(R.id.cardView);
}
}
}
InnerRecyclerViewAdapter For Childs/(sub-categories)
public class InnerRecyclerViewAdapter extends RecyclerView.Adapter<InnerRecyclerViewAdapter.ViewHolder> {
public List<Categories> nameList;
Context context;
public InnerRecyclerViewAdapter(List<Categories> nameList, Context context) {
this.nameList = nameList;
this.context = context;
}
#NonNull
#Override
public ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int i) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.sub_cat_items, parent, false);
InnerRecyclerViewAdapter.ViewHolder vh = new InnerRecyclerViewAdapter.ViewHolder(v);
return vh;
}
#Override
public void onBindViewHolder(#NonNull ViewHolder holder, final int position) {
Categories subCategories = nameList.get(position);
holder.name.setText(subCategories.getTitle());
holder.name.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent i = new Intent(context, ProductsActivity.class);
Categories subCategories = nameList.get(position);
i.putExtra("sub_cat_id", subCategories.getId());
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
});
}
#Override
public int getItemCount() {
return nameList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView name;
public ViewHolder(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.itemTextView);
}
}
}
Right now I am not displaying anything for Images I am focusing on Title of categories(parents) and sub-categories (child)
Here is my sub_cat_items file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
android:id="#+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:id="#+id/linearLayoutHolder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<ImageView
android:id="#+id/sub_cat_img"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:background="#drawable/pohanch" />
<TextView
android:id="#+id/itemTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:text="Fresh Fruits"
android:textAlignment="center"
android:textSize="14sp" />
</LinearLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
And the last here is my cat_items File
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true">
<android.support.v7.widget.CardView
android:id="#+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="#+id/linearLayoutHolder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="20dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
android:orientation="vertical">
<TextView
android:id="#+id/categoryTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fruits & Vegetables"
android:textColor="#color/basiccolor"
android:textSize="16sp" />
<ImageButton
android:id="#+id/categoryExpandBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:background="#FFF"
android:src="#drawable/ic_arrow_downward_black_24dp" />
</RelativeLayout>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="#+id/innerRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/linearLayoutHolder"
android:background="#f6f6f6"
android:visibility="gone">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
I am successful in displaying Categories (parents) to the output but having issues with subcategories(children)
Here is my output
https://imgur.com/Feq6XBP
Checkout this example code for customized expandableview.
https://github.com/developernadeem/ShopGrocery
RecyclerView is for list not for ExpandableListView maybe you want to check this tutorial: https://www.androidhive.info/2013/07/android-expandable-list-view-tutorial/
Or maybe want to check this library: https://github.com/thoughtbot/expandable-recycler-view
Of course you can use RecyclerView but you have to change the layout doing your own calculations, and making the listener to make the expandable and not expandable
Retrofit returns object
Configure classes this way
public class Category{
List<Cats> cats;
private String message;
private int success;
}
Public class Cats{
List<SubCats> sub_cats;
private String id;
private String title;
private String img;
}
public class SubCats{
private String sub_id;
private String sub_title;
private String sub_img;
}
Now
#GET("cats.php")
Call<Category> getCategories();
Yo need to configure JSON as well, Remove red marked in the image. It seems unnecessary.
Reconfigure the PHP as well
I am retrieving JSON data and parcing it by Retrofit. I want to display it on RecyclerView but can't make it display the views. Where am I doing it wrong? Here MainActivity, Model and ListFlowerAdapter are given
public class MainActivity extends AppCompatActivity {
private ListFlowerAdapter mListFlowerAdapter;
private RecyclerView mRecyclerView;
private RetrofitClient mRetrofitClient;
LinearLayoutManager linearLayoutManager;
//private List<FlowerModel> myFlowers;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
configViews();
mRetrofitClient = new RetrofitClient();
Call<List<FlowerModel>> listCall = mRetrofitClient.getFlowerService().getAllFlowers();
listCall.enqueue(new Callback<List<FlowerModel>>() {
#Override
public void onResponse(Call<List<FlowerModel>> call, Response<List<FlowerModel>> response) {
if (response.isSuccessful()) {
List<FlowerModel> flowerList = response.body();
for (int i = 0; i < flowerList.size(); i++) {
FlowerModel flowerModel = flowerList.get(i);
mListFlowerAdapter.addFlower(flowerModel);
}
} else {
int sc = response.code();
switch (sc) {
}
}
}
#Override
public void onFailure(Call<List<FlowerModel>> call, Throwable t) {
}
});
}
private void configViews() {
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(linearLayoutManager);
mListFlowerAdapter = new ListFlowerAdapter();
mRecyclerView.setAdapter(mListFlowerAdapter);
//mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false));
//mListFlowerAdapter = new ListFlowerAdapter();
// mRecyclerView.setAdapter(mListFlowerAdapter);
}
}
ListFlowerAdapter class
public class ListFlowerAdapter extends RecyclerView.Adapter<ListFlowerAdapter.MyViewHolder> {
private static final String TAG = ListFlowerAdapter.class.getSimpleName();
private Context context;
private List<FlowerModel> myFlowers;
public ListFlowerAdapter() {
myFlowers = new ArrayList<>();
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, null, false);
return new MyViewHolder(row);
}
#Override
public void onBindViewHolder(#NonNull MyViewHolder holder, int position) {
FlowerModel currFlower = myFlowers.get(position);
holder.mName.setText(currFlower.getName());
holder.mPrice.setText(Double.toString(currFlower.getPrice()));
Picasso.with(holder.itemView.getContext()).load("http://services.hanselandpetal.com/photos/" + currFlower.getPhoto()).into(holder.mPhoto);
}
#Override
public int getItemCount() {
return myFlowers.size();
}
public void addFlower(FlowerModel flowerModel) {
myFlowers.add(flowerModel);
notifyDataSetChanged();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView mPhoto;
private TextView mName, mPrice;
public MyViewHolder(View itemView) {
super(itemView);
mPhoto = itemView.findViewById(R.id.flower_photo);
mName = itemView.findViewById(R.id.flower_name);
mPrice = itemView.findViewById(R.id.flower_price);
}
}
}
FlowerModel class
public class FlowerModel implements Serializable {
#Expose
private String category;
#Expose
private String price;
#Expose
private String instructions;
#Expose
private String photo;
#Expose
private String name;
#Expose
private int productId;
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public double getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getInstructions() {
return instructions;
}
public void setInstructions(String instructions) {
this.instructions = instructions;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getProductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
}
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:orientation="horizontal">
<ImageView
android:id="#+id/flower_photo"
android:layout_width="150dp"
android:layout_height="150dp"
android:background="#mipmap/ic_launcher"
android:scaleType="centerCrop" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="#+id/flower_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="#style/Base.TextAppearance.AppCompat.Large"
android:text="Large Text" />
<TextView
android:id="#+id/flower_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="#style/Base.TextAppearance.AppCompat.Medium"
android:text="Medium Text" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Stop Downloading" />
<android.support.v7.widget.RecyclerView
android:id="#+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
android:visibility="visible" />
Could you help me with the issue, please? Thank you very much.
Don't notify your adapter recursively,
Your code :
for (int i = 0; i < flowerList.size(); i++) {
FlowerModel flowerModel = flowerList.get(i);
mListFlowerAdapter.addFlower(flowerModel); // Called from here
}
Code from adapter
public void addFlower(FlowerModel flowerModel) {
myFlowers.add(flowerModel);
notifyDataSetChanged(); // Notifying everytime
}
Instead, you should add all data to adapter and notify only once : (Updated code)
for (int i = 0; i < flowerList.size(); i++) {
FlowerModel flowerModel = flowerList.get(i);
mListFlowerAdapter.addFlower(flowerModel);
}
mListFlowerAdapter.notifyDataSetChanged(); // Notify like this
Code from adapter
public void addFlower(FlowerModel flowerModel) {
myFlowers.add(flowerModel);
//notifyDataSetChanged(); Remove from here
}
Pass activity context to the adapter and use that context for populating item on list view.
private Context mContext;
public ListFlowerAdapter(Context context) {
myFlowers = new ArrayList<>();
this.mContext = context;
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View row = LayoutInflater.from(mContext).inflate(R.layout.row_item, parent, false);
return new MyViewHolder(row);
}
From activity send the activity context for initializing the adapter like this
mListFlowerAdapter = new ListFlowerAdapter(this);
And for adding a new item
public void addFlowers(List<FlowerModel> flowerModels) {
for (int i = 0; i < flowerModels.size(); i++) {
FlowerModel flowerModel = flowerModels.get(i);
myFlowers.add(flowerModel);
}
notifyDataSetChanged();
}
And successful response just send the list for updating the adapter
List<FlowerModel> flowerList = response.body();
mListFlowerAdapter.addFlowers(flowerList);
Hope this will help.
Try to remove this line:
mRecyclerView.setHasFixedSize(true);
And add this in the XML file:
android:fillViewport="true"
Without that line, your RecyclerView content initial height is 0 (empty list), and with the fixed size it can't grow although you add items to the adapter.
I am trying to populate a RecylerView from MySQL DB. I am able to correctly fetch data from DB using volley library (tested using Toast) but it is not showing in RecyclerView. My code till now.
fragment_notification.xml
<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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="in.techbash.androidhiverecyclerview.NotificationFragment">
<!-- TODO: Update blank fragment layout -->
<RelativeLayout
android:id="#+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="#string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="#+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical" />
</RelativeLayout>
</FrameLayout>
My NotificationFragment class
NotificationFragment.java
public class NotificationFragment extends Fragment {
private List<Notification> notificationList = new ArrayList<>();
private RecyclerView recyclerView;
NotificationsAdapter notificationsAdapter;
private View rootView;
private RecyclerView.LayoutManager mLayoutManager;
public NotificationFragment() {
// Required empty public constructor
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
rootView = inflater.inflate(R.layout.fragment_notification, container, false);
recyclerView = rootView.findViewById(R.id.recycler_view);
getNotifications();
return rootView;
}
private void getNotifications() {
final String get_notifications = "http://192.168.1.102/notification/get_notifications.php";
final String user_id = "327875";
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("user_id", user_id);
JSONObject jsonObj = new JSONObject(parameters);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
get_notifications, jsonObj, new Response.Listener<JSONObject>() {
#Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("result");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
//adding the product to product list
notificationList.add(new Notification(
jsonObject.getString("msg_title"),
jsonObject.getString("message"),
jsonObject.getString("sender_name")
));
}
//creating adapter object and setting it to recyclerview
NotificationsAdapter adapter = new NotificationsAdapter(getActivity(), notificationList);
recyclerView.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
}
}) {
#Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
};
MySingleton.getInstance(getActivity()).addToRequestQueue(jsonObjectRequest);
}
}
my notification_list_row.xml file
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:orientation="vertical"
android:paddingBottom="#dimen/row_padding_vertical"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/row_padding_vertical">
<TextView
android:id="#+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:textColor="#color/title"
android:textSize="16dp"
android:textStyle="bold" />
<TextView
android:id="#+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#id/title" />
<TextView
android:id="#+id/sender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textColor="#color/year" />
</RelativeLayout>
NotificationsAdapter.java
public class NotificationsAdapter extends
RecyclerView.Adapter<NotificationsAdapter.MyViewHolder> {
private List<Notification> notificationsList;
private Context mCtx;
public NotificationsAdapter(Context mCtx, List<Notification> notificationsList){
this.mCtx = mCtx;
this.notificationsList = notificationsList;
}
#Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//inflating and returning our view holder
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.notification_list_row, parent, false);
return new MyViewHolder(view);
}
#Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Notification notification = notificationsList.get(position);
holder.title.setText(notification.getTitle());
holder.message.setText(notification.getMessage());
holder.sender.setText(notification.getSender());
}
#Override
public int getItemCount() {
return notificationsList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title, message, sender;
public MyViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
message = (TextView) itemView.findViewById(R.id.message);
sender = (TextView) itemView.findViewById(R.id.sender);
}
}
}
my Notification getter/setter
public class Notification {
String sender, title, message;
public Notification(String title, String message, String sender){
this.title = title;
this.message = message;
this.sender = sender;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
I am new to android. Please help me solve this problem.
You haven't set the layout manager for your recycler view. Make this change in your getNotifications() before you set the adapter :
LinearLayoutManager linear = new LinearLayoutManager(getActivity());
linear.setOrientation(LinearLayoutManager.VERTICAL);// If you want a vertical recycler view
recyclerView.setLayoutManager(linear);
NotificationsAdapter adapter = new NotificationsAdapter(getActivity(), notificationList);
recyclerView.setAdapter(adapter);
Hope this will solve your problem !
make some changes set recycler view scroll layout like below code used..
recyclerview.setLayoutManager(new LinearLayoutManager(this));
Firstly add this linearlayoutmanager in onCreate() method.
LinearLayoutManager linearLayout = new LinearLayoutManager(getActivity());
linearLayout .setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayout );
and then add notifyDataSetChanged() in for loop.
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
//adding the product to product list
notificationList.add(new Notification(
jsonObject.getString("msg_title"),
jsonObject.getString("message"),
jsonObject.getString("sender_name")
));
NotificationsAdapter adapter = new NotificationsAdapter(getActivity(),notificationList);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
//creating adapter object and setting it to recyclerview
My data shows in logcat but displays nothing while opening app. You can further view over here. But I found a problem "No adapter attached : skipping layout" Any idea with this problem?
This is my MainActivity xml file:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:card_view="http://schemas.android.com/tools">
<android.support.v7.widget.RecyclerView
android:id="#+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
card_view:cardUseCompatPadding="true"
card_view:cardElevation="5dp"
card_view:cardCornerRadius="5dp">
</android.support.v7.widget.RecyclerView>
<ProgressBar
android:id="#+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:indeterminateTint="#color/colorPrimary" />
</RelativeLayout>
CardView xml file:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:card_view="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.CardView
android:id="#+id/card_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:elevation="3dp"
card_view:cardUseCompatPadding="true"
card_view:cardElevation="5dp"
card_view:cardCornerRadius="5dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton android:id="#+id/imagebtn"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:scaleType="centerCrop" />
<TextView android:id="#+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15dp"
android:layout_below="#+id/imagebtn"
android:padding="5dp"
android:textColor="#000"
android:gravity="center"
android:text="Hospital Name"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
MainActivity java class file:
public class MainActivity extends AppCompatActivity implements
ExampleAdapter.OnItemClickListener {
public static final String EXTRA_CREATOR = "orga_organame";
public static final String EXTRA_URL =
"http://xelwel.com.np/hamrosewaapp/uploads/images/logo/civil.png";
private RecyclerView mRecyclerview;
private ExampleAdapter mExampleAdapter;
private List<UserInfo> mExampleList;
private RequestQueue mRequestQueue;
ImageButton imageButton;
TextView textView;
ProgressBar progressbar;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressbar = findViewById(R.id.progressBar);
progressbar.setVisibility(View.VISIBLE);
imageButton = findViewById(R.id.imagebtn);
textView = findViewById(R.id.description);
mRecyclerview = findViewById(R.id.recycler_view);
mRecyclerview.setHasFixedSize(true);
mRecyclerview.setLayoutManager(new LinearLayoutManager(this));
mExampleList = new ArrayList<>();
mRequestQueue = Volley.newRequestQueue(this);
jsonParse();
}
public void jsonParse() {
final String url =
("http://xelwel.com.np/hamrosewaapp/api/get_organization_list");
final StringRequest request = new StringRequest(Request.Method.POST,
url, new Response.Listener<String>() {
#Override
public void onResponse(String response) {
Log.i("response", url + "response:" + response);
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("org_list");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
String hsname = obj.getString("orga_organame");
String image = obj.getString("logo_path" + "civil.png");
mExampleList.add(new UserInfo(hsname, image));
}
mExampleAdapter = new ExampleAdapter(MainActivity.this,
mExampleList);
mRecyclerview.setAdapter(mExampleAdapter);
mExampleAdapter.setOnItemClickListener(MainActivity.this);
progressbar.setVisibility(View.GONE);
} catch (JSONException e) {
Toast.makeText(getApplicationContext(),"Error Parsing Data",
Toast.LENGTH_LONG);
e.printStackTrace();
}catch (Exception e) {
Toast.makeText(getApplicationContext(),"Something went
wrong", Toast.LENGTH_LONG);
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
}) {
#Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("api_key", "123456789");
return params;
}
};
mRequestQueue.add(request);
}
#Override
public void onItemClick(int position) {
Intent detailIntent = new Intent(this, DetailActivity.class);
UserInfo clickedItem = mExampleList.get(position);
detailIntent.putExtra(EXTRA_URL, clickedItem.getImage_link());
detailIntent.putExtra(EXTRA_CREATOR, clickedItem.getName());
startActivity(detailIntent);
}
}
DetailActivity java class file:
Intent intent = getIntent();
String imageUrl = intent.getStringExtra(EXTRA_URL);
String name = intent.getStringExtra(EXTRA_CREATOR);
ImageView imageView = findViewById(R.id.image_view_detail);
TextView textView = findViewById(R.id.text_view);
Picasso.with(this).load(imageUrl).fit().centerInside().into(imageView);
textView.setText(name);
ExampleAdapter java class file:
public class ExampleAdapter extends
RecyclerView.Adapter<ExampleAdapter.ViewHolder> {
private Context mcontext;
private List<UserInfo> mExampleList;
private OnItemClickListener mListener;
public interface OnItemClickListener{
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}
public ExampleAdapter(Context context, List<UserInfo> list) {
mcontext = context;
mExampleList = list;
}
#Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView =
LayoutInflater.from(mcontext).inflate(R.layout.cardview,parent,false);
return new ViewHolder(itemView);
}
#Override
public void onBindViewHolder(ViewHolder holder, int position) {
UserInfo info = mExampleList.get(position);
String imageUrl = info.getImage_link();
String hsname = info.getName();
holder.textView.setText(hsname);
Picasso.with(mcontext).load(imageUrl).fit().centerInside().
into(holder.imageView);
}
#Override
public int getItemCount() {
return mExampleList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public ImageView imageView;
public ViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.description);
imageView = (ImageView) itemView.findViewById(R.id.image);
itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(mListener!= null){
int position = getAdapterPosition();
if (position!= RecyclerView.NO_POSITION){
mListener.onItemClick(position);
}
}
}
});
}
}
}
UserInfo java class file:
public class UserInfo {
public String id, name, image_link;
public UserInfo(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return image_link;
}
public void setName(String image_link) {
this.image_link = image_link;
}
public String getImage_link() {
return image_link;
}
public void setImage_link(String image_link) {
this.image_link = image_link;
}
}
These are my total code related with these problem. Please view the codes and response with some specific solution...
Try this
You made mistake in UserInfo class Constructor.
You added
mExampleList.add(new UserInfo(hsname, image));
But here set id and name
public UserInfo(String id, String name) {
this.id = id;
this.name = name;
}
change your Constructor
public UserInfo(String name, String image_link) {
this.image_link = image_link;
this.name = name;
}
You didn't set any value in image_link variable,But accessing in adapter class
UserInfo info = mExampleList.get(position);
String imageUrl = info.getImage_link();
String hsname = info.getName();
Try this
try {
JSONObject jsonObject = new JSONObject(response);
String logoURL = jsonObject.getString("logo_path")
JSONArray jsonArray = jsonObject.getJSONArray("org_list");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
String hsname = obj.getString("orga_organame");
String imageurl = obj.getString("orga_image");
String image = logoURL +"/"+ imageurl ;
mExampleList.add(new UserInfo(hsname, image));
}
}