Reputation: 1477
Hi I am retrieving images and text from json based on values showing the view using the recycler view. All working fine if the data is less than 10 date if morethan 10 images are showing only once in the recycler view.after I scroll down and scrolled up images are disappeared.Dont know where I did mistake.
This is my code
jsondata
"DATA":[
{
"ID":"82",
"MSG":"",
"IMAGE":"http://14.18.19.15/data/chat_img/20160308102624439533297.jpg",
"TYPE":"1",
"STATUS":"0",
"DATE":"2016-03-08 10:26:24"
},
{
"ID":"81",
"MSG":"saggergergergaskfasjdfahsdfalshdfaldfafdjkahsdfkjahlfdkjahfls",
"IMAGE":"",
"TYPE":"1",
"STATUS":"0",
"DATE":"2016-03-08 10:25:40"
},
{
"ID":"80",
"MSG":"Hi",
"IMAGE":"",
"TYPE":"2",
"STATUS":"0",
"DATE":"2016-03-07 13:24:00"
},....
]
Activity code
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
context=this;
messege = new ArrayList<String>();
date = new ArrayList<String>();
image = new ArrayList<String>();
getjsondata();
//adapter = new RecyclerAdapter(context, stockArr);
//recyclerView.setAdapter(adapter);
// Toast.makeText(getApplicationContext(),""+stockArr.length,Toast.LENGTH_SHORT).show();
System.out.print("ARRRRRRRRRRRRRRRRRRRRRRY"+stockArr);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
public void getjsondata()
{
StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Toast.makeText(MainActivity.this, response, Toast.LENGTH_LONG).show();
try {
JSONObject homeobj = new JSONObject(response);
JSONObject insteller = homeobj.getJSONObject("INSTELLAR");
status = insteller.getString("STATUS");
if(status.equals("success")) {
JSONArray data = insteller.getJSONArray("DATA");
for(int i=0; i < data.length(); i++) {
JSONObject jsonObject = data.getJSONObject(i);
msg = jsonObject.getString("MSG").toString();
img =jsonObject.getString("IMAGE").toString();
dte =jsonObject.getString("DATE").toString();
messege.add(msg);
date.add(dte);
image.add(img);
}
stockArr = new String[messege.size()];
stockArr = messege.toArray(stockArr);
stockArr1 = new String[date.size()];
stockArr1 = date.toArray(stockArr1);
stockArr2 = new String[image.size()];
stockArr2 = image.toArray(stockArr2);
/* for(String s : stockArr)
System.out.println(s);*/
Toast.makeText(getApplicationContext(),"TOAST SIZE"+messege.size(), Toast.LENGTH_SHORT).show();
adapter = new RecyclerAdapter(context, stockArr,stockArr1,stockArr2);
recyclerView.setAdapter(adapter);
}
else
{
Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "Error in Json", Toast.LENGTH_LONG).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("clientid", KEY_ClientID);
params.put("adminid", KEY_ADMINID);
params.put("userid", KEY_USERID);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
Adapter.java
public class RecyclerAdapter extends
RecyclerView.Adapter<RecyclerViewHolder> {
String name[];
String image[];
String date[];
// String [] date={"date1","date2","date3","date4"};
Context context;
LayoutInflater inflater;
public RecyclerAdapter(Context context, String[] message,String[] datee,String[] imageee) {
this.context=context;
inflater=LayoutInflater.from(context);
name=message;
date=datee;
image=imageee;
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v=inflater.inflate(R.layout.item_list, parent, false);
RecyclerViewHolder viewHolder=new RecyclerViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position)
{
try
{
if(name[position].equals("")) {
for(int i = 0;i<image.length;i++) {
Picasso.with(context).load(image[position]).into(holder.imageView);
holder.imageView.setTag(holder);
holder.tv2.setText(date[position]);
}
}
if(image[position].equals(""))
{
holder.imageView.setVisibility(View.GONE);
holder.tv1.setText(name[position]);
holder.tv2.setText(date[position]);
}
// holder.tv1.setVisibility(View.GONE);
} catch (Exception e) {
e.printStackTrace();
// holder.tv1.setVisibility(View.GONE);
// holder.imageView.setVisibility(View.GONE);
// holder.imageView.setTag(holder);
}
}
@Override
public int getItemCount() {
return name.length;
}
}
Upvotes: 0
Views: 98
Reputation: 3520
RecyclerView reuses the row view. Hence your ImageView visibility once set to gone is never made visible. Just add an else to your if(image[position].equals(""))
as below
else{
holder.imageView.setVisibility(View.Visible);
}
Let me know if this works.
Upvotes: 2
Reputation: 13
if you change view state,make sure each if matching one else ,because convert view had remember the view state.
if(flag){
view.changeState();
}else{
view.changeState();
}
Upvotes: 0