Why in specific range same image is duplicating in recyclerview? - android

I'm trying to develop android application which can load images from the url in to RecyclerView With the help of Picasso library. But the problem comes that after some sequence "in my case after every 6 image" same image is duplicating in recyclerview. I'm added some code
#Override
public int getItemCount() {
return data.length;
}
#Override
public long getItemId(int position) {
return position;
}
in my adapter but this is not working for me.
Below is my currant adapter code please help me to findout the solution for this.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context context;
private Img[] data;
public MyAdapter(Context context, Img[] data) {
this.context = context;
this.data = data;
}
#Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.image_row, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
#Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final Img user = data[position];
final String imageStr = user.getImgurl();
String taKey = loadTaluka();
final String id = user.getImgId().toString();
if (user.getTaluka().equals(taKey)) {
float date = Float.parseFloat(user.getDateTime());
float lastDayDate = Float.parseFloat(dispDate()) - 1;
if (date >= lastDayDate) {
Picasso.with(holder.myImg.getContext()).load(imageStr).placeholder(R.drawable.loading_1).networkPolicy(NetworkPolicy.OFFLINE).into(holder.myImg, new Callback() {
#Override
public void onSuccess() {
}
#Override
public void onError() {
Picasso.with(holder.myImg.getContext()).load(imageStr).placeholder(R.drawable.loading_1).into(holder.myImg);
}
});
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent intent = new Intent(context, LoadImg.class);
intent.putExtra("url", imageStr);
intent.putExtra("id", id);
context.startActivity(intent);
}
});
}
}
#Override
public int getItemCount() {
return data.length;
}
#Override
public long getItemId(int position) {
return position;
}
/*
#Override
public int getItemViewType(int position) {
return position;
}*/
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView userTitle;
TextView age;
TextView country;
TextView url;
public ImageView myImg;
public MyViewHolder(View itemView) {
super(itemView);
myImg = (ImageView) itemView.findViewById(R.id.postImg);
}
}
//Extras
private String loadTaluka() {
SharedPreferences sf = context.getSharedPreferences("Taluka", MODE_PRIVATE);
return sf.getString("taluka", "a");
}
//Image Viewholder Adapter End
private String dispDate() {
Date c = Calendar.getInstance().getTime();
#SuppressLint("SimpleDateFormat") SimpleDateFormat day = new SimpleDateFormat("dd");
String dayFinal = day.format(c);
#SuppressLint("SimpleDateFormat") SimpleDateFormat month = new SimpleDateFormat("MM");
String monthFinal = month.format(c);
#SuppressLint("SimpleDateFormat") SimpleDateFormat year = new SimpleDateFormat("yyyy");
String yearFinal = year.format(c);
#SuppressLint("SimpleDateFormat") SimpleDateFormat hour = new SimpleDateFormat("HH");
String hourFinal = hour.format(c);
String finalDate = Integer.toString(Integer.parseInt(dayFinal) + Integer.parseInt(monthFinal) + Integer.parseInt(yearFinal)) + "." + hourFinal;
return finalDate;
}
}
-Thankyou.

Because of Recycler views RAM Management, the recycler view try to load cards from the cache and because of your recycler view's cache, the items loads incorrectly.
for preventing this you must add an else to your if like this:
if (date >= lastDayDate)
{
//Do Your Code
}
else
{
//The Default Item View Settings Here...
}

Related

RecyclerView list Limited at one fragment and no Limit another fragment

hi I want to make a recycler view in two different fragments in which one fragment has limit recycler view list which is shown only 4 lists and another fragment in which all the list item is shown, thanks in advance.
main class code,
private void populatelist() {
List<reviewModel> reviewModelList = new ArrayList<>();
for (int i = 1; i < 20; i++) {
int imges = R.drawable.ic_userlogin;
String names = "User Name is " + i;
String dates = "New Dates is " + i;
String detail = "User details about is " + i;
reviewModel models = new reviewModel(names, dates, detail, 4, imges);
reviewModelList.add(models);
}
setupRecycle(reviewModelList);
}
private void setupRecycle(List<reviewModel> reviewModelList) {
if (adaptOverView == null)
adaptOverView = new reviewAdapt(this, 5);
adaptOverView.setReviewList(reviewModelList);
LinearLayoutManager layout = new LinearLayoutManager(this);
layout.setSmoothScrollbarEnabled(true);
recyclerOverView.setLayoutManager(layout);
recyclerOverView.setHasFixedSize(true);
recyclerOverView.setAdapter(adaptOverView);
}
adapter class code,
private Context mContext;
private List<reviewModel> reviewList;
private int limit;
public void setReviewList(List<reviewModel> list){
this.reviewList = list;
this.notifyDataSetChanged();
}
public reviewAdapt(Context mContext, int limit) {
this.mContext = mContext;
this.limit = limit;
}
public reviewAdapt(Context mContext, List<reviewModel> reviewList, int limit) {
this.mContext = mContext;
this.reviewList = reviewList;
this.limit = limit;
}
#NonNull
public ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.review_design, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
#Override
public void onBindViewHolder(#NonNull ViewHolder holder, int position) {
if (position < limit) {
reviewModel model = reviewList.get(position);
Log.d("TAG", "onBindViewHolder_Limit: "+limit);
Log.d("TAG", "onBindViewHolder_Position_Is_InLimit: "+position);
holder.textViewName.setText(model.getName());
holder.textViewDate.setText(model.getDate());
holder.ratingBarRecycle.setRating(model.getRatingBar());
holder.textViewDetails.setText(model.getDetails());
holder.imageViewRecycle.setImageResource(model.getImg());
}
}
#Override
public int getItemCount() {
return reviewList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textViewName, textViewDate, textViewDetails;
RatingBar ratingBarRecycle;
ImageView imageViewRecycle;
public ViewHolder(#NonNull View itemView) {
super(itemView);
textViewName = itemView.findViewById(R.id.name_review);
textViewDate = itemView.findViewById(R.id.date_review);
textViewDetails = itemView.findViewById(R.id.details_review);
ratingBarRecycle = itemView.findViewById(R.id.review_ratingsBar);
imageViewRecycle = itemView.findViewById(R.id.profile_image);
}
}
}
As per my understanding , You are using limit variable for restricting listing size for fragment. But you are not using it rightly. If I am not wrong, Try to restrict item count for in adapter as below -
#Override
public int getItemCount() {
return limit;
}

i would like to update my cart, for this i have used spinner in RecyclerView after scrolling down cart count is same as initial

I'm using RecyclerView to display a list of marks, and each mark of the value is shown as a CardView.
But some contents of the cards are lost after the scrolling the RecyclerView down and scrolling back, as shown in the two screenshots below.
The contents of the red rectangle are lost after scrolling.
public class Shop_Products_adapter extends
RecyclerView.Adapter<Shop_Products_adapter.MyViewHolder> {
public static HashMap<String, String> cartHasmap = new HashMap<String, String>();
private List<Shop_Products> ServiceModels = new ArrayList<>();
private Context mContext;
private int count = 0;
public Shop_Products_adapter(List<Shop_Products> ServiceModels, Context mContext) {
this.ServiceModels = ServiceModels;
Log.e("Shop_Products_adapter", ServiceModels.toString());
this.mContext = mContext;
}
#Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_products, parent, false);
return new MyViewHolder(itemView);
}
#Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final Shop_Products serviceModel = ServiceModels.get(position);
Log.e("onBindViewHolder", serviceModel.getName1());
holder.name1.setText(serviceModel.getName1());
holder.cost1.setText("\u20B9 " + serviceModel.getCost());
holder.kgs1.setText(serviceModel.getKgs() + " kgs");
String urlOfImage = serviceModel.getImage1();
Picasso.with(mContext).load(urlOfImage).into(holder.image1);
final List quantity = new ArrayList<Integer>();
for (int i = 0; i <= 10; i++) {
quantity.add(Integer.toString(i));
}
ArrayAdapter<Integer> spinnerArrayAdapter = new ArrayAdapter<Integer>(mContext, android.R.layout.simple_spinner_item, quantity);
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
holder.quatity_spinner.setAdapter(spinnerArrayAdapter);
//holder.quatity_spinner.setSelection(position,true);
holder.quatity_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
#Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if (holder.quatity_spinner.getSelectedItem().equals("0")) {
cartHasmap.put(serviceModel.getId(), serviceModel.getQty());
cartHasmap.values().removeAll(Collections.singleton(serviceModel.getQty()));
Log.e("cartHasmap Remove Valeu", "onItemSelected() returned: " + cartHasmap);
} else {
count = count + 1;
serviceModel.setCount(String.valueOf(count));
String qty = holder.quatity_spinner.getSelectedItem().toString();
serviceModel.setQty(qty);
SharedPreferences pref = mContext.getSharedPreferences("cart_data", 0);
SharedPreferences.Editor editor = pref.edit();
editor.putInt("count", count);
editor.putString("qty", qty);
editor.putString("product_id", serviceModel.getId());
editor.commit();
cartHasmap.put(serviceModel.getId(), serviceModel.getQty());
Log.e("cartHasmap", "onItemSelected() returned: " + cartHasmap);
Log.e("*******", "onitem get id " + serviceModel.getId());
JSONObject object = new JSONObject();
try {
object.put("", serviceModel.getQty());
object.put("", serviceModel.getId());
Log.i("+++++++++", "onItemSelected: " + object);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
#Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
#Override
public int getItemCount() {
return ServiceModels.size();
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public int getItemViewType(int position) {
return position;
}
public void setFilter(ArrayList<Shop_Products> filter) {
ServiceModels = new ArrayList<>();
ServiceModels.addAll(filter);
notifyDataSetChanged();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name1;
public TextView cost1;
public TextView kgs1;
public ImageView image1;
public Spinner quatity_spinner;
public MyViewHolder(View view) {
super(view);
name1 = (TextView) view.findViewById(R.id.name1);
cost1 = (TextView) view.findViewById(R.id.cost);
kgs1 = (TextView) view.findViewById(R.id.kgs);
image1 = (ImageView) view.findViewById(R.id.img1);
quatity_spinner = (Spinner) view.findViewById(R.id.quatity_spinner);
}
}
}

OutOfMemoryError ViewPager Activity

In one of activity contains RecyclerView in which certain items are rendered and on clicking any item its moving to another activity which is having a massive data from a server, its like a detail page of news along with images from server to render in its gallery section, using ViewPager along PagerAdapter(Some news articles may contains 20-30 images.
Whenever I move forward and backward from these activites my application crashes with OutOfMemory Error.
So far I have tried calling System.gc() and then finish() after moving back from detail activity to the one containing RecyclerView but still getting OutOfMemory errors.
I know its a memory leak as its getting large amount of data and then rendering at different places in activity but don't know how to handle it.
I have read some solutions mentioning android:largeHeap but it also doesn't guarentee that you may get large heap with some other cons like frequent pausings.
PagerAdapter:
public class SingleNewsGalleryAdapter extends PagerAdapter {
private String URL="some url";
Context mContext;
LayoutInflater mLayoutInflater;
List<String> newsList= Collections.emptyList();
int width=-1;
int heigth=-1;
public SingleNewsGalleryAdapter(Context context,List<String> newsList) {
this.newsList = newsList;
mContext = context;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
#Override
public int getCount() {
return newsList.size();
}
#Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}
#Override
public Object instantiateItem(ViewGroup container, int position) {
final int pos = position;
View itemView = mLayoutInflater.inflate(R.layout.single_news_pager_layout, container, false);
final Holder holder = new Holder();
holder.imageView = (ImageView) itemView.findViewById(R.id.slidr_img);
holder.left = (ImageView) itemView.findViewById(R.id.swipe_left);
if(position==0){
holder.left.setColorFilter(ContextCompat.getColor(mContext, R.color.trans_black));
}
holder.right= (ImageView) itemView.findViewById(R.id.swipe_right);
if(position==(newsList.size()-1)){
holder.right.setColorFilter(ContextCompat.getColor(mContext, R.color.trans_black));
}
holder.left.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(pos>0){
int desc = pos-1;
if(mContext instanceof SingleNewsActivity){
((SingleNewsActivity)mContext).changePage(desc);
}
}
}
});
holder.right.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(pos<newsList.size()){
if(mContext instanceof SingleNewsActivity){
int inc = pos+1;
((SingleNewsActivity)mContext).changePage(inc);
//Toast.makeText(mContext,pos+"",Toast.LENGTH_LONG).show();
}
}
}
});
String news = newsList.get(position);
//imageView.setImageResource(newsList.get(position).getNews_photo());
int dpiCheck=0;
String res="";
switch (mContext.getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
dpiCheck=1;
break;
case DisplayMetrics.DENSITY_MEDIUM:
dpiCheck=2;
break;
case DisplayMetrics.DENSITY_HIGH:
dpiCheck=3;
break;
case DisplayMetrics.DENSITY_XHIGH:
dpiCheck=4;
break;
}
if(dpiCheck==3){
res="525x255x1-";
}
else if(dpiCheck==4){
res="700x340x1-";
}
// res = width+"x"+height+"x1-";
String url = URL+res+news;
Uri uri = Uri.parse(url);
Picasso.with(this.mContext).load(uri).into(holder.imageView);
container.addView(itemView);
return itemView;
}
#Override
public float getPageWidth(int position) {
return 1f;
}
#Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((RelativeLayout) object);
}
static class Holder {
ImageView imageView;
ImageView left;
ImageView right;
}
}
and my RecyclerAdapter from the listing activity:
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.MyViewHolder> {
String URL = "some url";
List<News> newsList = Collections.emptyList();
Context ctx;
int layoutID;
public NewsAdapter(List<News> newsList, Context ctx, int layout) {
this.layoutID = layout;
this.newsList = newsList;
this.ctx = ctx;
}
#Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(layoutID, parent, false);
return new MyViewHolder(view);
}
#Override
public void onBindViewHolder(MyViewHolder holder, int position) {
News news = newsList.get(position);
String title = news.getNews_title();
holder.title.setText(title);
String desc = news.getNews_description();
String htmlDesc;
String formatedDesc =desc.substring(0, Math.min(desc.length(), 50))+"...";
if (Build.VERSION.SDK_INT >= 24) {
holder.desc.setText(Html.fromHtml(desc, Html.FROM_HTML_SEPARATOR_LINE_BREAK_DIV));
} else {
holder.desc.setText(Html.fromHtml(desc));
}
String authorName;
if(news.getAuthor().trim().equals("") || news.getAuthor()==null){
authorName="Anonymous";
}
else{
authorName = news.getAuthor().trim();
}
holder.author.setText(authorName);
//Format Date
SimpleDateFormat fromUser = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat myFormat = new SimpleDateFormat("d/M/yy");
String formatedDate="";
try {
formatedDate = myFormat.format(fromUser.parse(news.getNews_add_date()));
} catch (ParseException e) {
e.printStackTrace();
}
holder.date.setText(formatedDate);
//view counter format
Integer viewCount = Integer.parseInt(news.getViews());
DecimalFormat formatter = new DecimalFormat("##,##,###");
String number = formatter.format(viewCount);
holder.views.setText(number);
//comments counter format
Integer commentCount = Integer.parseInt(news.getComments());
formatter = new DecimalFormat("##,##,###");
String c_number = formatter.format(commentCount);
holder.comments.setText(c_number);
int dpiCheck=0;
String res="";
switch (ctx.getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
dpiCheck=1;
break;
case DisplayMetrics.DENSITY_MEDIUM:
dpiCheck=2;
break;
case DisplayMetrics.DENSITY_HIGH:
dpiCheck=3;
break;
case DisplayMetrics.DENSITY_XHIGH:
dpiCheck=4;
break;
}
if(dpiCheck==3){
res="165x165x1-";
}
else if(dpiCheck==4){
res="220x220x1-";
}
String url = URL+res+news.getNews_photo();
Uri uri = Uri.parse(url);
Picasso.with(this.ctx).load(uri).into(holder.image);
}
#Override
public int getItemCount() {
return newsList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView title,desc,date,views,comments,author;
ImageView image;
public MyViewHolder(View view) {
super(view);
title = (TextView)view.findViewById(R.id.news_title);
author = (TextView)view.findViewById(R.id.author);
desc =(TextView)view.findViewById(R.id.news_desc);
date=(TextView)view.findViewById(R.id.date);
views = (TextView)view.findViewById(R.id.view_counter);
comments = (TextView)view.findViewById(R.id.comment_counter);
image = (ImageView) view.findViewById(R.id.news_img);
view.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
String id="";
String cat="";
String brand="";
if(Build.VERSION.SDK_INT>=24){
id= newsList.get(getAdapterPosition()).getNews_id();
cat = newsList.get(getAdapterPosition()).getCat_id();
brand = newsList.get(getAdapterPosition()).getBrand_id();
}
else{
id= newsList.get(getPosition()).getNews_id();
cat = newsList.get(getPosition()).getCat_id();
brand = newsList.get(getPosition()).getBrand_id();
}
Intent intent = new Intent(view.getContext(), SingleNewsActivity.class);
intent.putExtra("NEWSID",id);
intent.putExtra("NEWSCAT",cat);
intent.putExtra("NEWSBRAND",brand);
ctx.startActivity(intent);
// Toast.makeText(view.getContext(), "position = " + id, Toast.LENGTH_SHORT).show();
}
});
}
}
public void setFilter(List<News> newList){
this.newsList = new ArrayList<>();
this.newsList.addAll(newList);
notifyDataSetChanged();
}
public void loadMore(List<News> newList){
this.newsList.addAll(newList);
notifyDataSetChanged();
}
}
The Error Statement OutOfMemory Error at NewsAdapter.onCreateViewHolder(NewsAdapter.java:49)
where the onCreateViewHolder is called.

how to show images in listView with Picasso library from server?

What I'm trying to do is fetch images from database and show them in listView. for this i am using one adapter and list elements class but it is not showing any image but one string value that passed from main activity to elements class actually address of the image in which it is stored in database. Like this
Please don't make it duplicate
http://howdysend.com/Howdy/uploads/6.png ... actually that is the address of the image in database and 6 is the id of the image. Here is my code
Main activity
listEvents.setAdapter((ListAdapter) adapterNewsFeed);
adapterNewsFeed = new AdapterNewsFeed(getActivity(), R.layout.custom_events_list_in_newsfeed);
listEvents.setAdapter((ListAdapter) adapterNewsFeed);
try {
jsonObject = new JSONObject(json_string);
jsonArray = jsonObject.getJSONArray("server_response");
int count = 0;
String EventTitle, EventDate, FriendName,friend_id,image;
while (count < jsonArray.length()) {
JSONObject JO = jsonArray.getJSONObject(count);
friend_id=JO.getString("friend_id");
EventTitle = JO.getString("address");
EventDate = JO.getString("DOB");
FriendName = JO.getString("name");
image=("http://howdysend.com/Howdy/uploads/" + friend_id + ".png");
EventsElements eventsElements = new EventsElements(image,EventTitle, EventDate, FriendName);
adapterNewsFeed.add(eventsElements);
listEvents.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
EventsElements eventsElements =(EventsElements) adapterNewsFeed.getItem(position);
Intent i = new Intent(getActivity(), SendGreetings.class);
i.putExtra("user_id", eventsElements.getFriendName());
startActivity(i);
}
});
Elements Class
public class EventsElements {
private String EventTitle, EventDate,FriendName;
public String image;
public EventsElements(String EventTitle,String EventDate,String FriendName, String image){
this.setEventTitle(EventTitle);
this.setEventDate(EventDate);
this.setFriendName(FriendName);
this.setImage(image);
}
public String getEventTitle(){
return EventTitle;
}
public void setEventTitle(String EventTitle) {
this.EventTitle = EventTitle;
}
public String getEventDate() {
return EventDate;
}
public void setEventDate(String EventDate) {
this.EventDate = EventDate;
}
public String getFriendName() {
return FriendName;
}
public void setFriendName(String FriendName) {
this.FriendName = FriendName;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
And AdapterNewsFeed
public class AdapterNewsFeed extends ArrayAdapter {
List list=new ArrayList();
public AdapterNewsFeed(Context context, int resource) {
super(context,resource);
}
#Override
public int getCount() {
return list.size();
}
public void add(EventsElements object) {
super.add(object);
list.add(object);
}
#Override
public Object getItem(int position) {
return list.get(position);
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
view=convertView;
ElementsHolder elemetsHolder;
if (view==null){
LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.custom_events_list_in_newsfeed,parent,false);
elemetsHolder=new ElementsHolder();
elemetsHolder.EventTitle=(TextView) view.findViewById(R.id.EventTitle);
elemetsHolder.EventDate=(TextView) view.findViewById(R.id.EventDate);
elemetsHolder.FriendName=(TextView) view.findViewById(R.id.FriendName);
elemetsHolder.imageView=(ImageView)view.findViewById(R.id.FriendsUserImage);
view.setTag(elemetsHolder);
}
else
{
elemetsHolder=(ElementsHolder) view.getTag();
}
EventsElements eventsElements=(EventsElements)this.getItem(position);
elemetsHolder.EventTitle.setText(eventsElements.getEventTitle());
elemetsHolder.EventDate.setText(eventsElements.getEventDate());
elemetsHolder.FriendName.setText(eventsElements.getFriendName());
Picasso.with(getContext()).load(Uri.parse(eventsElements.getImage())).fit().into(elemetsHolder.imageView);
return view;
}
static class ElementsHolder
{
TextView EventTitle,EventDate,FriendName;
ImageView imageView;
String user_id;
}
}
Your image is from Url so basically you don't need Uri.parse(eventsElements.getImage(). Instead just set your url like this
Picasso.with(getContext()).load(eventsElements.getImage()).fit().into(elemetsHolder.imageView);
For more info check https://guides.codepath.com/android/Displaying-Images-with-the-Picasso-Library
Hope this helps!!

ListView with different layouts with two different objects

I want to populate a ListView with different layouts for odd and even rows. It should look like this:
I use two objects "OddListItem" and "EvenListItem" to store/access the data. I do not know how to pass both objects to my custom listview adapter and get the correct view.
My object classes:
public class OddListItem {
private String time_start;
private String time_end;
private String location;
public OddListItem(String time_start, String time_end, String location) {
super();
this.time_start = time_start;
this.time_end = time_end;
this.location = location;
}
// getters and setters
void setTimeStart(String time_start) {
this.time_start = time_start;
}
void setTimeEnd(String time_end) {
this.time_end = time_end;
}
void setLocation(String location) {
this.location = location;
}
public String getTimeStart() {
return time_start;
}
public String getTimeEnd() {
return time_end;
}
public String getLocation() {
return location;
}
}
public class EvenListItem {
private String image;
private String location;
public EvenListItem (String image, String location) {
super();
this.image = image;
this.location = location;
}
// getters and setters
void setImage(String image) {
this.image = image;
}
void setLocation(String location) {
this.location = location;
}
public String getImage() {
return image;
}
public String getLocation() {
return location;
}
}
MyCustomAdapter:
public class MyCustomAdapter extends BaseAdapter {
// Tag for Logging
private static final String TAG = "MyCustomAdapter";
int type;
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
private ArrayList<OddListItem> mData = new ArrayList<OddListItem>();
private LayoutInflater mInflater;
//private TreeSet mSeparatorsSet = new TreeSet();
private Context context;
public MyCustomAdapter(Context context) {
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.context = context;
}
public void addItem(final OddListItem item) {
mData.add(item);
//The notification is not necessary since the items are not added dynamically
//notifyDataSetChanged();
}
public void addSeparatorItem(final OddListItem item) {
mData.add(item);
//The notification is not necessary since the items are not added dynamically
//notifyDataSetChanged();
}
#Override
public int getItemViewType(int position) {
/*if ((position%2) == 0){
type = TYPE_ITEM;
} else {
type = TYPE_SEPARATOR;
}
return type;*/
return position%2;
}
#Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
#Override
public int getCount() {
return mData.size();
}
#Override
public OddListItem getItem(int position) {
return mData.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
Log.d(TAG, "getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
//inflate the new layout
convertView = mInflater.inflate(R.layout.detail_list_row_odd, parent, false);
holder.tv_time_from = (TextView) convertView.findViewById(R.id.tv_time_from);
holder.tv_time_to = (TextView) convertView.findViewById(R.id.tv_time_to);
holder.tv_current_location_odd = (TextView) convertView.findViewById(R.id.tv_current_location_odd);
//fill the layout with values
/*holder.tv_time_from.setText("12:34");
holder.tv_time_to.setText("12:37");
holder.tv_current_location_odd.setText("Aktueller Standort");*/
holder.tv_time_from.setText(mData.get(position).getTimeStart());
holder.tv_time_to.setText(mData.get(position).getTimeEnd());
holder.tv_current_location_odd.setText(mData.get(position).getLocation());
break;
case TYPE_SEPARATOR:
//inflate the new layout
convertView = mInflater.inflate(R.layout.detail_list_row_even, parent, false);
holder.tv_current_location_even = (TextView) convertView.findViewById(R.id.tv_current_location_even);
holder.img_transport = (ImageView) convertView.findViewById(R.id.img_transport);
//fill the layout with values
holder.tv_current_location_even.setText("Hauptbahnhof");
holder.img_transport.setImageDrawable(context.getResources().getDrawable(R.drawable.rollator));
break;
default:
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
private static class ViewHolder {
public TextView tv_time_from;
public TextView tv_time_to;
public TextView tv_current_location_odd;
public TextView tv_current_location_even;
public ImageView img_transport;
}
}
Here I generate the data and call the adapter:
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detailed_connection);
generateData();
//fill ListView with custom content from MyCustomAdapter class
mAdapter = new MyCustomAdapter(getApplicationContext());
for (int i = 1; i < odd_items.size(); i++) {
mAdapter.addItem(odd_items.get(i));
if (i % 1 == 0) {
mAdapter.addSeparatorItem(odd_items.get(i));
}
}
setListAdapter(mAdapter);
//set duration text
tv_duration = (TextView)findViewById(R.id.tv_duration);
tv_duration.setText("Dauer: 22 Minuten");
}
private void generateData() {
odd_items = new ArrayList<OddListItem>();
odd_items.add(new OddListItem("12:34", "", "Aktueller Standort"));
odd_items.add(new OddListItem("12:37", "12:37", "TUM"));
odd_items.add(new OddListItem("12:42", "12:42", "Hauptbahnhof Nord"));
odd_items.add(new OddListItem("12:48", "12:48", "Hauptbahnhof"));
even_items = new ArrayList<EvenListItem>();
even_items.add(new EvenListItem("R.drawable.rollator", "3 Minuten Fußweg"));
even_items.add(new EvenListItem("R.drawable.bus", "Richtung Hauptbahnhof Nord"));
even_items.add(new EvenListItem("R.drawable.rollator", "6 Minuten Fußweg"));
mData = new Data(odd_items, even_items);
}
Any help would be great. Maybe there is also a better approach then please let me know.
I would create a Single list of Items
public class Items {
private String time_start;
private String time_end;
private String location;
private int image;
private String locationeven;
private int oddoreven;
public String getTime_start() {
return time_start;
}
public void setTime_start(String time_start) {
this.time_start = time_start;
}
public String getTime_end() {
return time_end;
}
public void setTime_end(String time_end) {
this.time_end = time_end;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public String getLocationeven() {
return locationeven;
}
public void setLocationeven(String locationeven) {
this.locationeven = locationeven;
}
public int getOddoreven() {
return oddoreven;
}
public void setOddoreven(int oddoreven) {
this.oddoreven = oddoreven;
}
}
In onCreate of Activity call
generateData() ;
Then
ArrayList<Items> oddorevenlist = new ArrayList<Items>();
private void generateData() {
Items item1 = new Items();
item1.setTime_start("12:34");
item1.setTime_end("");
item1.setLocation("Aktueller Standort");
item1.setOddoreven(0);
oddorevenlist.add(item1);
Items item2 = new Items();
item2.setImage(R.drawable.ic_launcher);
item2.setLocationeven("3 Minuten Fußweg");
item2.setOddoreven(1);
oddorevenlist.add(item2);
Items item3 = new Items();
item3.setTime_start("12:37");
item3.setTime_end("12:37");
item3.setLocation("Tum");
item3.setOddoreven(0);
oddorevenlist.add(item3);
Items item4 = new Items();
item4.setImage(R.drawable.ic_launcher);
item4.setLocationeven("Richtung Hauptbahnhof Nord");
item4.setOddoreven(1);
oddorevenlist.add(item4);
Items item5 = new Items();
item5.setTime_start("12:42");
item5.setTime_end("12:42");
item5.setLocation("Hauptbahnhof Nord");
item5.setOddoreven(0);
oddorevenlist.add(item5);
Items item6 = new Items();
item6.setImage(R.drawable.ic_launcher);
item6.setLocationeven("R6 Minuten Fußweg");
item6.setOddoreven(1);
oddorevenlist.add(item6);
Items item7 = new Items();
item7.setTime_start("12:48");
item7.setTime_end("12:48");
item7.setLocation("HHauptbahnhof");
item7.setOddoreven(0);
oddorevenlist.add(item7);
MyCustomAdapter mAdapter = new MyCustomAdapter(this,oddorevenlist);
setListAdapter(mAdapter);
}
Adapter code
public class MyCustomAdapter extends BaseAdapter {
// Tag for Logging
private static final String TAG = "MyCustomAdapter";
int type;
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private ArrayList<Items> oddorevenlist ;
private LayoutInflater mInflater;
private Context context;
public MyCustomAdapter(Context context, ArrayList<Items> oddorevenlist) {
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.context = context;
this.oddorevenlist = oddorevenlist;
}
#Override
public int getItemViewType(int position) {
if (oddorevenlist.get(position).getOddoreven()==0){
type = TYPE_ITEM;
} else if (oddorevenlist.get(position).getOddoreven()==1) {
type = TYPE_SEPARATOR;
}
return type;
}
#Override
public int getViewTypeCount() {
return 2;
}
#Override
public int getCount() {
return oddorevenlist.size();
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
Log.d(TAG, "getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
//inflate the new layout
convertView = mInflater.inflate(R.layout.row_odd, parent, false);
holder.tv_time_from = (TextView) convertView.findViewById(R.id.tv_time_from);
holder.tv_time_to = (TextView) convertView.findViewById(R.id.tv_time_to);
holder.tv_current_location_odd = (TextView) convertView.findViewById(R.id.tv_current_location_odd);
holder.tv_time_from.setText(oddorevenlist.get(position).getTime_start());
holder.tv_time_to.setText(oddorevenlist.get(position).getTime_end());
holder.tv_current_location_odd.setText(oddorevenlist.get(position).getLocation());
break;
case TYPE_SEPARATOR:
//inflate the new layout
convertView = mInflater.inflate(R.layout.row_even, parent, false);
holder.tv_current_location_even = (TextView) convertView.findViewById(R.id.tv_current_location_even);
holder.img_transport = (ImageView) convertView.findViewById(R.id.img_transport);
//fill the layout with values
holder.tv_current_location_even.setText(oddorevenlist.get(position).getLocationeven());
holder.img_transport.setImageResource(R.drawable.ic_launcher);
break;
default:
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
private static class ViewHolder {
public TextView tv_time_from;
public TextView tv_time_to;
public TextView tv_current_location_odd;
public TextView tv_current_location_even;
public ImageView img_transport;
}
#Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
}
Snap

Categories

Resources