My RecyclerView in Fragment (FrameLayout) is sometimes empty on BottomNavigationView item touch (sometimes you can touch 5x and it's not empty but then it's empty again until the next touch).
YouTuberFragment
public class YouTuberFragment extends Fragment {
private List<YouTuber> youtuber;
private class GetYouTuber extends AsyncTask<Void, Void, Void> {
#Override
protected void onPreExecute() {
super.onPreExecute();
}
#Override
protected Void doInBackground(Void... arg0) {
try {
InputStream inputStream = getActivity().getAssets().open("youtuber.json");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder total = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) total.append(line);
String m = total.toString();
JSONObject jsonObject = new JSONObject(m);
JSONArray jsonYouTuberArray = jsonObject.getJSONArray("youtuber");
int youTubersCount = 0;
if (jsonYouTuberArray != null) youTubersCount = jsonYouTuberArray.length();
for (int i = 0; i < youTubersCount; i++) {
JSONObject jsonYouTuberObject = jsonYouTuberArray.getJSONObject(i);
YouTuber youTuber = new YouTuber(
jsonYouTuberObject.getString("name"),
jsonYouTuberObject.getString("role"),
jsonYouTuberObject.getString("picture"),
jsonYouTuberObject.getString("episodes"),
jsonYouTuberObject.getString("youtube")
);
youtuber.add(youTuber);
}
} catch (JSONException | IOException e) {
e.printStackTrace();
}
return null;
}
#Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
public YouTuberFragment() {
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_youtuber, container, false);
LinearLayoutManager llm = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
youtuber = new ArrayList<>();
RVAdapter adapter = new RVAdapter(youtuber, getContext());
new YouTuberFragment.GetYouTuber().execute();
RecyclerView rv = (RecyclerView) v.findViewById(R.id.rv);
rv.setLayoutManager(llm);
rv.setHasFixedSize(true);
rv.setAdapter(adapter);
return v;
}
}
RVAdapter
class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {
private final Context context;
private Resources res;
private List<YouTuber> youTuber;
RVAdapter(List<YouTuber> youTuber, Context context){
this.youTuber = youTuber;
this.context = context;
}
static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
ImageView ytPicture;
TextView ytName;
TextView ytRole;
TextView ytEpisodes;
Button ytYoutube;
PersonViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
ytPicture = (ImageView) itemView.findViewById(R.id.yt_picture);
ytName = (TextView) itemView.findViewById(R.id.yt_name);
ytRole = (TextView) itemView.findViewById(R.id.yt_role);
ytEpisodes = (TextView) itemView.findViewById(R.id.yt_episodes);
ytYoutube = (Button) itemView.findViewById(R.id.yt_youtube);
}
}
#Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
#Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_youtuber, viewGroup, false);
res = v.getResources();
PersonViewHolder pvh = new PersonViewHolder(v);
return pvh;
}
#Override
public void onBindViewHolder(final PersonViewHolder personViewHolder, final int i) {
personViewHolder.ytPicture.setImageResource(res.getIdentifier(youTuber.get(i).picture, "drawable", BuildConfig.APPLICATION_ID));
personViewHolder.ytName.setText(youTuber.get(i).name);
personViewHolder.ytRole.setText(youTuber.get(i).role);
personViewHolder.ytEpisodes.setText(res.getString(R.string.yt_episodes, youTuber.get(i).episodes));
personViewHolder.ytYoutube.setText(youTuber.get(i).youtube);
personViewHolder.ytYoutube.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Uri uri = Uri.parse("https://" + youTuber.get(i).youtube);
Intent youtube_url = new Intent(Intent.ACTION_VIEW, uri);
context.startActivity(youtube_url);
}
});
}
#Override
public int getItemCount() {
return youTuber.size();
}
}
It could be that you are running a different thread to gather your data while your adapter initialization is being ran on the main thread and is being rendered before your data can be retrieved. Have you tried rotating the device if it is blank?
Related
Here in the given below code, I am trying to display in the image in recyclerview in the imageview after fetching it using picasso, it won't show error or app won't crash either but image won't be displayed, it either shows:
"I/Choreographer: Skipped 30 frames! The application may be doing too much work on its main thread."
Or
W/RecyclerView: No adapter attached; skipping layout
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
LayoutInflater inflater;
List<Lists> lst;
private ItemClickListsner mItemListener;
public Adapter(Context ctx, List<Lists> lst, ItemClickListsner itemClickListsner) {
this.inflater = LayoutInflater.from(ctx);
this.lst = lst;
this.mItemListener = itemClickListsner;
}
#NonNull
#Override
public ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.custom_list, parent, false);
return new ViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull ViewHolder holder, int position) {
// final Lists temp = lst.get(position);
holder.id.setText(lst.get(position).getId());
holder.name.setText(lst.get(position).getName());
holder.prc.setText(lst.get(position).getPrc());
holder.add.setText(lst.get(position).getAddress());
holder.description.setText(lst.get(position).getDes());
holder.park.setText(lst.get(position).getGarage());
holder.net.setText(lst.get(position).getNet());
holder.email.setText(lst.get(position).getMail());
holder.number.setText(lst.get(position).getPnumber());
holder.post.setText(lst.get(position).getTle());
holder.date.setText(lst.get(position).getCrt());
Picasso.with(inflater.getContext())
.load(lst.get(position).getMimage())
.placeholder(R.drawable.bed)
.fit()
.into(holder.ImgView);
holder.itemView.setOnClickListener(view -> {
mItemListener.onItemClick(lst.get(position));
});
}
#Override
public int getItemCount() {
return lst.size();
}
public interface ItemClickListsner{
void onItemClick(Lists lst);
}
public void filterList(ArrayList<Lists> filteredList) {
lst = filteredList;
notifyDataSetChanged();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView id, name, add, prc, description, park, net, post,email,number,date;
ImageView ImgView;
// CardView cardView;
public ViewHolder(#NonNull View itemView) {
super(itemView);
id = itemView.findViewById(R.id.textViewRecy1);
name = itemView.findViewById(R.id.textViewRecy2);
prc = itemView.findViewById(R.id.textViewRecy3);
add = itemView.findViewById((R.id.textViewRecy4));
description = itemView.findViewById(R.id.textViewRecy5);
park = itemView.findViewById(R.id.textViewRecy6);
net = itemView.findViewById(R.id.textViewRecy7);
post = itemView.findViewById(R.id.textViewRecy8);
email = itemView.findViewById(R.id.textViewRecy9);
number = itemView.findViewById(R.id.textViewRecy10);
date = itemView.findViewById(R.id.textViewRecy11);
ImgView = itemView.findViewById(R.id.ImageRecy);
}
}
}
Activity Code
private void extractList() {
RequestQueue queue = Volley.newRequestQueue(this);
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, JSON_URL, null, new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
for (int i = 0; i < response.length(); i++) {
try {
JSONObject jsonObject = response.getJSONObject(i);
//Log.d("tags", "error: " + jsonObject);
Lists lists = new Lists();
lists.setName(jsonObject.getString("title").toString());
lists.setAddress(jsonObject.getString("location").toString());
lists.setPrc(jsonObject.getString("price").toString());
lists.setDes(jsonObject.getString("description").toString());
lists.setGarage(jsonObject.getString("parking").toString());
lists.setNet(jsonObject.getString("internet").toString());
lists.setMail(jsonObject.getString("email").toString());
lists.setPnumber(jsonObject.getString("phone_number").toString());
lists.setTle(jsonObject.getString("poster").toString());
lists.setCrt(jsonObject.getString("created").toString());
lists.setMimage(jsonObject.getString("photo1").toString());
String p = jsonObject.getString("photo1").toString();
Log.e("kk","msg"+p);
lst.add(lists);
} catch (JSONException e) {
e.printStackTrace();
}
}
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
adapter = new Adapter(getApplicationContext(), lst, new Adapter.ItemClickListsner() {
#Override
public void onItemClick(Lists lst) {
// startActivity(new Intent(HomeActivity.this,roomsDesc.class));
Intent intent = new Intent(HomeActivity.this, roomsDesc.class);
intent.putExtra("title",lst.getName());
intent.putExtra("price",lst.getPrc());
intent.putExtra("location",lst.getAddress());
intent.putExtra("description",lst.getDes());
intent.putExtra("parking",lst.getGarage());
intent.putExtra("internet",lst.getNet());
intent.putExtra("email",lst.getMail());
intent.putExtra("phone_number",lst.getPnumber());
intent.putExtra("poster",lst.getTle());
intent.putExtra("created",lst.getCrt());
intent.putExtra("photo1",lst.getMimage());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
HomeActivity.this.startActivity(intent);
}
});
recyclerView.setAdapter(adapter);
}
I want to fetch data from json file from the internet using url, After doing all the codes RecyclerView says no adapter attached. I am not able to find out what is wrong with my code.
public class MainActivity extends AppCompatActivity {
private String urlData = "https://vast-shore-74260.herokuapp.com/banks?city=MUMBAI";
private RecyclerView recyclerView;
private RecyclerView.Adapter Radapter;
private List<ListItem> listItems;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//Using this listitem in recyclerView works just fine but when i try to to parse json file, RecyclerView says no adapter attached.
/*listItems = new ArrayList<>();
for (int i=0;i<=10;i++)
{
ListItem listItem = new ListItem(
"SBI"+(i+1),
"Lorem ipsum",
"SBIN00009945",
"khanapara",
"9945",
"ghy",
"kamrup",
"assam"
);
listItems.add(listItem);
}
Radapter = new MyAdapter(listItems,this);
recyclerView.setAdapter(Radapter);*/
Spinner dropdown = findViewById(R.id.spinner);
String[] items = new String[]{"Select City","Mumbai","Bangalore","Chennai"};
ArrayAdapter<String>adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,items)
{
#Override
public boolean isEnabled(int position)
{
if (position == 0)
{
return false;
}
else
{
return true;
}
}
#Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View view = super.getDropDownView(position,convertView,parent);
TextView txtView = (TextView)view;
if (position == 0)
{
txtView.setTextColor(Color.GRAY);
}
else
{
txtView.setTextColor(Color.BLACK);
}
return view;
}
};
dropdown.setAdapter(adapter);
listItems = new ArrayList<>();
loadRecyclerViewData();
}
private void loadRecyclerViewData()
{
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading Data...");
progressDialog.show();
StringRequest stringRequest = new StringRequest(
Request.Method.GET,
urlData,
new Response.Listener<String>() {
#Override
public void onResponse(String s) {
progressDialog.dismiss();
try {
JSONObject jsonObject = new JSONObject(s);
JSONArray array = jsonObject.getJSONArray(urlData);
for (int i=0; i<array.length();i++)
{
JSONObject o = array.getJSONObject(i);
ListItem item = new ListItem(
o.getString("bank_name"),
o.getString("address"),
o.getString("ifsc"),
o.getString("branch"),
o.getInt("bank_id"),
o.getString("city"),
o.getString("district"),
o.getString("state")
);
listItems.add(item);
}
/*Radapter = new MyAdapter(listItems,getApplicationContext());
recyclerView.setAdapter(Radapter);*/
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),error.getMessage(),Toast.LENGTH_LONG).show();
Log.e("errorcode",error.getMessage());
}
}
);
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
There might be some problem in this code:
Radapter = new MyAdapter(listItems,getApplicationContext());
recyclerView.setAdapter(Radapter);
This is the Adapter class
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<ListItem> listItems;
private Context context;
public MyAdapter(List<ListItem> listItemAdap, Context context) {
this.listItems = listItemAdap;
this.context = context;
}
#Override
public ViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_items,parent,false);
return new ViewHolder(v);
}
#Override
public void onBindViewHolder(#NonNull ViewHolder holder, int position) {
ListItem listItem = listItems.get(position);
holder.txtviewBankName.setText(listItem.getBank_name());
holder.txtviewAddress.setText(listItem.getAddress());
holder.txtviewIfsc.setText(listItem.getIfsc());
holder.txtviewBranch.setText(listItem.getBranch());
holder.txtviewBankId.setText(listItem.getBank_id());
holder.txtviewCity.setText(listItem.getCity());
holder.txtviewDistrict.setText(listItem.getDistrict());
holder.txtviewState.setText(listItem.getState());
}
#Override
public int getItemCount() {
return listItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder
{
public TextView txtviewBankName;
public TextView txtviewAddress;
public TextView txtviewIfsc;
public TextView txtviewBranch;
public TextView txtviewBankId;
public TextView txtviewCity;
public TextView txtviewDistrict;
public TextView txtviewState;
public ViewHolder(View itemView) {
super(itemView);
txtviewBankName = (TextView)itemView.findViewById(R.id.bankName);
txtviewAddress = (TextView)itemView.findViewById(R.id.address);
txtviewIfsc = (TextView)itemView.findViewById(R.id.ifsc);
txtviewBranch = (TextView)itemView.findViewById(R.id.branch);
txtviewBankId = (TextView)itemView.findViewById(R.id.bankId);
txtviewCity = (TextView)itemView.findViewById(R.id.city);
txtviewDistrict = (TextView)itemView.findViewById(R.id.district);
txtviewState = (TextView)itemView.findViewById(R.id.state);
}
}
}
Your JSON string has some wrong characters, it should be like this
[{"ifsc":"ABHY0065001","bank_id":60,"branch":"RTGS-HO","address":"ABHYUDAYA BANK BLDG., B.NO.71, NEHRU NAGAR, KURLA (E), MUMBAI-400024","city":"MUMBAI","district":"GREATER MUMBAI","state":"MAHARASHTRA","bank_name":"ABHYUDAYA COOPERATIVE BANK LIMITED"}]
then for parsing this json you can use the com.google.Gson library like this
Type listType = new TypeToken<ArrayList<ListItem>>() {}.getType();
String s = "[{\"ifsc\":\"ABHY0065001\",\"bank_id\":60,\"branch\":\"RTGS-HO\",\"address\":\"ABHYUDAYA BANK BLDG., B.NO.71, NEHRU NAGAR, KURLA (E), MUMBAI-400024\",\"city\":\"MUMBAI\",\"district\":\"GREATER MUMBAI\",\"state\":\"MAHARASHTRA\",\"bank_name\":\"ABHYUDAYA COOPERATIVE BANK LIMITED\"}]";
List<ListItem> items = new Gson().fromJson(s, listType);
then you can set this list as input into your Adapter then assign your adapter to your recycler.
My cart
This is what i need.
Total value need to be updated when one item removed.
I managed to remove the item and get the total value as json respose in adapter viewholder . don't know how to set the update the text in Fragment.
this is my cart fragment
Cart.java
public class Cart extends Fragment {
public Cart() {
// Required empty public constructor
}
Context context;
Activity activity;
List<GetDataAdapter> GetDataAdapter1;
RecyclerView recyclerView;
RecyclerView.LayoutManager recyclerViewlayoutManager;
RecyclerView.Adapter recyclerViewadapter;
String GET_JSON_DATA_HTTP_URL = "http://192.168.0.106/slbros/index.php/get/cart?p_d_id=12&lan=en";
String Total_URL = "http://192.168.0.106/slbros/index.php/get/total?p_d_id=12";
String JSON_CDID = "cart_dtl_id";
String JSON_IMG_URL = "img_url";
String JSON_QTY = "qty";
String JSON_NAME = "name";
String JSON_UNIT = "unit";
String JSON_PRICE = "price";
String JSON_P_ID = "product_id";
JsonArrayRequest jsonArrayRequest;
RequestQueue requestQueue;
ProgressBar progressBar;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_cart, container, false);
TextView total_tv = (TextView)v.findViewById(R.id.total_payment_value);
//recycler view
GetDataAdapter1 = new ArrayList<>();
recyclerView = (RecyclerView) v.findViewById(R.id.rv_cart_list);
progressBar = (ProgressBar) v.findViewById(R.id.progressBar2);
recyclerView.setHasFixedSize(true);
recyclerViewlayoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(recyclerViewlayoutManager);
progressBar.setVisibility(View.VISIBLE);
JSON_DATA_WEB_CALL();
return v;
}
#Override
public void onViewCreated(View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//you can set the title for your toolbar here for different fragments different titles
getActivity().setTitle("Cart");
}
public void JSON_DATA_WEB_CALL() {
jsonArrayRequest = new JsonArrayRequest(GET_JSON_DATA_HTTP_URL,
new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
progressBar.setVisibility(View.GONE);
JSON_PARSE_DATA_AFTER_WEBCALL(response);
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
progressBar.setVisibility(View.GONE);
Toast.makeText(getContext(), "some error....", Toast.LENGTH_SHORT).show();
}
}
);
requestQueue = Volley.newRequestQueue(getContext());
jsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(60000, 0, 1));
requestQueue.add(jsonArrayRequest);
}
public void JSON_PARSE_DATA_AFTER_WEBCALL(JSONArray array) {
for (int i = 0; i < array.length(); i++) {
GetDataAdapter GetDataAdapter2 = new GetDataAdapter();
JSONObject json = null;
try {
json = array.getJSONObject(i);
GetDataAdapter2.setImg_url(json.getString(JSON_IMG_URL));
GetDataAdapter2.setName(json.getString(JSON_NAME));
GetDataAdapter2.setPrice(json.getInt(JSON_PRICE));
GetDataAdapter2.setProduct_id(json.getInt(JSON_P_ID));
GetDataAdapter2.setCart_dtl_id(json.getInt(JSON_CDID));
GetDataAdapter2.setProduct_qty(json.getInt(JSON_QTY));
} catch (JSONException e) {
e.printStackTrace();
}
GetDataAdapter1.add(GetDataAdapter2);
}
recyclerViewadapter = new RecyclerViewAdapterCart(GetDataAdapter1, getContext());
recyclerView.setAdapter(recyclerViewadapter);
}}
this is my adapter
RecyclerViewAdapterCart.java
public class RecyclerViewAdapterCart extends RecyclerView.Adapter<RecyclerViewAdapterCart.ViewHolder> {
JsonArrayRequest jsonArrayRequest ;
RequestQueue requestQueue ;
String baseURL = "http://192.168.0.106/slbros/index.php/";
Context context;
Activity activity;
List<GetDataAdapter> getDataAdapter;
ImageLoader imageLoader1;
public RecyclerViewAdapterCart(List<GetDataAdapter> getDataAdapter, Context context) {
super();
this.getDataAdapter = getDataAdapter;
this.context = context;
}
#Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_list_item, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
#Override
public void onBindViewHolder(ViewHolder Viewholder, int position) {
GetDataAdapter getDataAdapter1 = getDataAdapter.get(position);
imageLoader1 = ServerImageParseAdapter.getInstance(context).getImageLoader();
imageLoader1.get(getDataAdapter1.getImg_url(),
ImageLoader.getImageListener(
Viewholder.product_image_view,//Server Image
R.mipmap.ic_launcher,//Before loading server image the default showing image.
android.R.drawable.ic_dialog_alert //Error image if requested image dose not found on server.
)
);
Viewholder.product_image_view.setImageUrl(getDataAdapter1.getImg_url(), imageLoader1);
Viewholder.product_name_TextView.setText(getDataAdapter1.getName()+" - "+String.valueOf(getDataAdapter1.getProduct_qty()));
Viewholder.product_price_qty_TextView.setText(getDataAdapter1.getPrice()+".00 Rs X "+String.valueOf(getDataAdapter1.getProduct_qty()));
Viewholder.product_t_price_TextView.setText(String.valueOf(getDataAdapter1.getProduct_qty()*getDataAdapter1.getPrice())+".00 Rs");
Viewholder.product_id_TextView.setText(String.valueOf(getDataAdapter1.getProduct_id()));
Viewholder.cart_dtl_id_TextView.setText(String.valueOf(getDataAdapter1.getCart_dtl_id()));
}
#Override
public int getItemCount() {
return getDataAdapter.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public NetworkImageView product_image_view;
public TextView product_name_TextView;
public TextView product_price_qty_TextView;
public TextView product_t_price_TextView;
public TextView product_id_TextView;
public TextView cart_dtl_id_TextView;
public Button p_cancel_btn;
public ViewHolder(View itemView) {
super(itemView);
product_image_view = (NetworkImageView) itemView.findViewById(R.id.item_image1);
product_name_TextView = (TextView) itemView.findViewById(R.id.product_name);
product_price_qty_TextView = (TextView) itemView.findViewById(R.id.p_qty_price);
product_t_price_TextView = (TextView) itemView.findViewById(R.id.p_t__price);
product_id_TextView = (TextView) itemView.findViewById(R.id.product_id_tv);
cart_dtl_id_TextView = (TextView) itemView.findViewById(R.id.cart_dtl_id_tv);
p_cancel_btn = (Button)itemView.findViewById(R.id.p_cancel_btn);
// set item view
p_cancel_btn.setOnClickListener(this);
}
#Override
public void onClick(final View v) {
String str = product_name_TextView.getText().toString();
//Toast.makeText(v.getContext(), str, Toast.LENGTH_SHORT).show();
String cart_dtl_id = cart_dtl_id_TextView.getText().toString();
String url = baseURL + "delete/select?cart_dtl_id="+cart_dtl_id;
jsonArrayRequest = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
//progressBar.setVisibility(View.GONE);
Toast.makeText(v.getContext(), "response -- " + response, Toast.LENGTH_LONG).show();
// here, I have to change the total TextView in Fragment
// Total_TextView.setText("1000rs")
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(v.getContext(), "error", Toast.LENGTH_LONG).show();
}
}
);
requestQueue = Volley.newRequestQueue(v.getContext());
jsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(60000,0,1));
requestQueue.add(jsonArrayRequest);
getDataAdapter.remove(getAdapterPosition());
notifyItemRemoved(getAdapterPosition());
notifyItemRangeChanged(getAdapterPosition(),getDataAdapter.size());
}
}}
Thanks in Advance
add to ReyclerView.
private ItemsChangedListener itemsChangedListener;
public interface ItemsChangedListener {
void onItemsChanged(int sum);
}
public void setItemsChangedListener(ItemsChangedListener listener) {
this.itemsChangedListener = listener;
}
new Response.Listener<JSONArray>() {
#Override
public void onResponse(JSONArray response) {
//progressBar.setVisibility(View.GONE);
// Calc here the Value if you can.
if(listener != null) listener.onItemsChanged(sum);
}
Fragment
public class Cart extends Fragment implements ItemsChangedListener
recyclerView.setItemsChangedListener(this);
#override
public void onItemsChanged(int sum) {
//Update TextView
}
i want know how to scroll to get more data on my recycler view
example my using wordpress api to have 10post from my website
and i want to get 5 per load in recycler and scroll more to get 5 post more
but i don't know how to coding please than a look and give me some correct idea !!
News_list.java
/**
* A simple {#link Fragment} subclass.
*/
public class News_List extends Fragment {
private static final String URL = "https://chsknews.com/wp-json/wp/v2/posts/";
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<News_Item> news_itemList;
private SwipeRefreshLayout swipeRefreshLayout;
public News_List() {
// Required empty public constructor
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_news__list, container, false);
swipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh);
recyclerView = (RecyclerView) rootView.findViewById(R.id.MRecyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
news_itemList = new ArrayList<>();
News_Loader();
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
#Override
public void onRefresh() {
News_Loader();
Toast.makeText(getContext(),"ដំណើរការជោគជ័យក្នុងការទាញយកពត៏មានចុងក្រោយ",Toast.LENGTH_SHORT).show();
news_itemList.clear();
}
});
return rootView;
}
private void News_Loader() {
final ProgressDialog progressDialog = new ProgressDialog(getContext());
progressDialog.setMessage("Loading News");
progressDialog.show();
StringRequest stringRequest = new StringRequest(Request.Method.GET,
URL,
new Response.Listener<String>() {
#Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
//JSONObject jsonObject = new JSONObject(response);
JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++){
JSONObject o = array.getJSONObject(i);
// Log.v("ID",o.getJSONObject("content").optString("rendered"));
news_itemList.add(new News_Item(
o.getJSONObject("title").getString("rendered"),
o.getString("date"),
o.getJSONObject("better_featured_image").getString("source_url"),
o.getString("date"),
o.getJSONObject("content").getString("rendered"))
);
// news_itemList.add(news_item);
}
adapter = new CustomAdapter(news_itemList,getContext());
recyclerView.setAdapter(adapter);
if (swipeRefreshLayout.isRefreshing())
{
swipeRefreshLayout.setRefreshing(false);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(getContext(), error.getMessage(),Toast.LENGTH_LONG).show();
if (swipeRefreshLayout.isRefreshing())
{
swipeRefreshLayout.setRefreshing(false);
}
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(stringRequest);
}
}
Adapter Class
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private List<News_Item> news_items;
private Context context;
public CustomAdapter(List<News_Item> news_items, Context context) {
this.news_items = news_items;
this.context = context;
}
#Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_view,parent,false);
return new ViewHolder(v);
}
#Override
public void onBindViewHolder(ViewHolder holder, final int position) {
final News_Item news_item = news_items.get(position);
holder.title.setText(Html.fromHtml(news_item.getTitle()));
holder.news_date.setText((news_item.getNews_date()));
Picasso.with(context)
.load(news_item.getImage_url())
.fit()
.into(holder.news_img);
holder.news_img.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent intent = new Intent(context,News_Single_Post.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("source_url",news_items.get(position).getImage_url());
intent.putExtra("rendered", news_items.get(position).getTitle());
intent.putExtra("date",news_items.get(position).getNews_date());
intent.putExtra("content",news_items.get(position).getNews_content());
context.startActivity(intent);
}
});
}
#Override
public int getItemCount() {
return news_items.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView title;
public TextView news_date;
public ImageView news_img;
public ViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.news_title);
news_date = (TextView) itemView.findViewById(R.id.news_date);
news_img = (ImageView) itemView.findViewById(R.id.news_image);
}
}
}
private boolean loading = true;
int pastVisiblesItems, visibleItemCount, totalItemCount;
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
{
#Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy)
{
if(dy > 0) //check for scroll down
{
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();
if (loading)
{
if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount)
{
loading = false;
Log.v("...", "Last Item Wow !");
//Do pagination.. i.e. fetch new data
}
}
}
}
});
Don't forget to add
LinearLayoutManager mLayoutManager;
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
I am using recyclerview adapter for my fragment, but my list is not getting shown as the onCreateViewHolder() and onBindViewHolder() are not getting called. Please let me know what is the issue with my code?
MyFragment code :
public class MyFragment extends Fragment {
private Integer mCurrentPage = 1;
private Integer mChosenOrder=0;
ArrayList<MyParcelableObject> mMyList;
private RecyclerView mRecyclerView;
MyAdapter mMyAdapter;
public MyFragment() {
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
mRecyclerView= (RecyclerView) rootView.findViewById(R.id.gridview_movies);
mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
Log.e(LOG_TAG, "In oncreateview");
if (savedInstanceState != null && savedInstanceState.getParcelableArrayList(ConstantUtil.My_LIST_KEY) != null) {
mMyList = savedInstanceState.getParcelableArrayList(ConstantUtil.My_LIST_KEY);
} else {
mMyList = new ArrayList<>();
}
new MyTask(getActivity(), mMyList,mMyAdapter).execute(mChosenOrder);
mMyAdapter = new MyAdapter(getActivity(),mMyList);
Log.e(LOG_TAG,"Adapter size oncreateview"+mMyAdapter.getItemCount());
mRecyclerView.setAdapter(mMyAdapter);
Log.e(LOG_TAG, "In oncreateview after attaching adapter");
return rootView;
}
#Override
public void onStart() {
super.onStart();
populate();
}
private void populate() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
if (prefs != null) {
String order = prefs.getString(getString(R.string.sorting_order), getString(R.string.pref_defaultValue));
int order_value = Integer.parseInt(order);
if (order_value >= 0) {
Resources resources = getResources();
mChosenOrder = Integer.parseInt(resources.getStringArray(R.array.pref_sorting_values)[order_value]);
} else {
mChosenOrder = order_value;
}
} else {
mChosenOrder = Integer.parseInt(getString(R.string.pref_defaultValue));
}
new MyTask(getActivity(),mMyList,mMyAdapter).execute(mChosenOrder);
Log.e(LOG_TAG,"populate Adapter size "+mMyAdapter.getItemCount());
mRecyclerView.setAdapter(mMyAdapter);
}
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArrayList(ConstantUtil.My_LIST_KEY, mMyList);
}
}
Async Task code
public class MyTask extends AsyncTask<Integer, Void, MyParcelableObject[]> {
private Context context;
private List<MyParcelableObject> mMyParcelableObjects;
private RecyclerView recyclerView;
MyAdapter myAdapter;
public MyTask(Context context, List<MyParcelableObject> myParcelableObjects,MyAdapter myAdapter) {
this.context = context;
mMyParcelableObjects = myParcelableObjects;
this.myAdapter = myAdapter;
//this.imageAdapter = imageAdapter;
this.recyclerView = recyclerView;
}
#Override
protected MyParcelableObject[] doInBackground(Integer... params) {
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String myStr[] = null;
// Will contain the raw JSON response as a string.
String myStrJsonStr = null;
Uri buildUri = null;
MyParcelableObject[] myParcelableObjects = null;
//try {
// Context context = getApplicationContext();
ArrayList<MyParcelableObject> myParcelableObjectArrayList = null;
String[] sortOrder = context.getResources().getStringArray(R.array.pref_sorting_values);
int sort = Integer.parseInt(sortOrder[0]);
myParcelableObjectArrayList = getJsonFromUri(params[0]); //correctly gets the json array
if (myParcelableObjectArrayList != null) {
myParcelableObjects = myParcelableObjectArrayList.toArray(new MyParcelableObject[myParcelableObjectArrayList.size()]);
return myParcelableObjects;
return null;
}
/**
* #param results
*/
#Override
protected void onPostExecute(MyParcelableObject[] results) {
Log.e(LOG_TAG, "In onPostExecute");
if (results != null) {
mMyParcelableObjects = Arrays.asList(results);
myAdapter = new MyAdapter(context,mMyParcelableObjects);
Log.e(LOG_TAG,"adapter size"+myAdapter.getItemCount());
myAdapter.notifyDataSetChanged();
}
}
Adapter code
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
List<MyParcelableObject> mParcelableObjects;
ViewHolder mViewHolder;
Context mContext;
public MyAdapter(Context context, List<MyParcelableObject> parcelableObjects) {
mParcelableObjects = parcelableObjects;
mContext=context;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView mImageView;
public ViewHolder(View view) {
super(view);
mImageView = (ImageView) view.findViewById(R.id.movie_content_imageview);
}
}
#Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.e("LOG_TAG","in on onCreateViewHolder");
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.content_main, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
#Override
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
Log.e("LOG_TAG","in on onBindViewHolder");
String myPoster = null;
MyParcelableObject myParcelableObject = mParcelableObjects.get(position);
if (myParcelableObject.poster_path != null) {
myPoster = myParcelableObject.poster_path.replaceAll("/", "");
}
Uri uri = Uri.parse(ConstantUtil.POSTER_URL).buildUpon().
appendPath(ConstantUtil.W342_SIZE).
appendPath(myPoster).build();
Picasso.with(mContext).load(uri).placeholder(R.drawable.resource_notfound).error(R.drawable.resource_notfound).into(mViewHolder.mImageView);
}
#Override
public int getItemCount() {
return mParcelableObjects.size();
}
}
You are not getting value because your list is empty.
replace this
new MyTask(getActivity(), mMyList,mMyAdapter).execute(mChosenOrder);
to this
mMyList = new MyTask(getActivity(), mMyList,mMyAdapter).execute(mChosenOrder).get();