Reputation: 2927
my list view is ordered items randomly , when i scroll down or up the items positions changed randomly I've tried many ways to fix this but no success
I've googled and i found too many ways to fix this issue related to Expanded listview but its not working with my code
please some help
this is the listview code
static class ViewHolder {
ImageView play;
ImageView download;
TextView rtitle;
TextView size;
TextView downloads;
RatingBar ratingsmall;
ImageView ratebutton;
long tonid;
TextView voters;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
//Get the current location object
JSONObject r = (JSONObject) getItem(position);
//Inflate the view
if (convertView == null) {
convertView = mInflater.inflate(R.layout.ringtone_bit, null);
holder = new ViewHolder();
ImageView play = (ImageView) convertView.findViewById(R.id.play);
ImageView download = (ImageView) convertView.findViewById(R.id.download);
ImageView ratebutton = (ImageView) convertView.findViewById(R.id.ratebutton);
TextView rtitle = (TextView) convertView.findViewById(R.id.rtitle);
TextView size = (TextView) convertView.findViewById(R.id.size);
TextView downloads = (TextView) convertView.findViewById(R.id.downloads);
TextView voters = (TextView) convertView.findViewById(R.id.voters);
TextView personname = (TextView) convertView.findViewById(R.id.personname);
TextView date = (TextView) convertView.findViewById(R.id.date);
RatingBar ratingsmall = (RatingBar) convertView.findViewById(R.id.ratingsmall);
//setdate
try {
Date date_g = new Date(r.getLong("timestamp") * 1000);
date.setText(date_g.toLocaleString());
} catch (JSONException e2) {}
//set person name
try {
String client_name = (r.getString("personname").equals("null") == true) ? "ghost" : r.getString("personname");
personname.setText(client_name);
} catch (JSONException e2) {}
//set total votars and vote avarage
try {
float z = (float) r.getInt("rate");
voters.setText(" ( " + r.getLong("voters") + " ) / " + z);
} catch (JSONException e2) {}
//set rating bar
try {
float z = (float) r.getInt("rate");
ratingsmall.setRating(z);
} catch (JSONException e2) {}
//set ringtone Name as defualt device language
try {
String name = (lang.equals("English") == true) ? r.getString("en_name") : r.getString("ar_name");
rtitle.setText(name);
} catch (JSONException e2) {}
//ringtone file size
try {
size.setText(r.getString("size"));
} catch (JSONException e2) {}
//set downloads
try {
downloads.setText(String.valueOf(r.getLong("downloads")));
} catch (JSONException e2) {}
//set ringtone ID toneid
try {
holder.tonid = r.getLong("toneid");
download.setTag(r.getLong("toneid"));
ratebutton.setTag(r.getLong("toneid"));
} catch (JSONException e1) {}
//set download stram url to play icon
try {
play.setTag(r.getString("stream_url"));
} catch (JSONException e) {}
//add play listener test Ringtone before download it
play.setOnClickListener(onClickListener);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
Upvotes: 0
Views: 123
Reputation: 25873
I think you misunderstood what ViewHolder is for. ViewHolder is not to hold values but to hold the Views so you don't have to inflate them again. You still need to set the data even if you get the View from the tag.
This how you correctly use a View holder:
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.ringtone_bit, null);
holder = new ViewHolder();
convertView.setTag(holder);
holder.play = ( ImageView ) convertView.findViewById(R.id.play);
holder.download = ( ImageView ) convertView.findViewById(R.id.download);
holder.ratebutton = ( ImageView ) convertView.findViewById(R.id.ratebutton);
holder.rtitle = (TextView) convertView.findViewById(R.id.rtitle);
holder.size = (TextView) convertView.findViewById(R.id.size);
holder.downloads = (TextView) convertView.findViewById(R.id.downloads);
holder.voters = (TextView) convertView.findViewById(R.id.voters);
holder.personname = (TextView) convertView.findViewById(R.id.personname);
holder.date = (TextView) convertView.findViewById(R.id.date);
holder.ratingsmall = (RatingBar) convertView.findViewById(R.id.ratingsmall);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Fill the data
Upvotes: 3
Reputation: 2295
//Get the current location object
JSONObject r = (JSONObject) getItem(position);
//Inflate the view
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.ringtone_bit, null);
}
ImageView play = ( ImageView ) convertView.findViewById(R.id.play);
ImageView download = ( ImageView ) convertView.findViewById(R.id.download);
ImageView ratebutton = ( ImageView ) convertView.findViewById(R.id.ratebutton);
TextView rtitle = (TextView) convertView.findViewById(R.id.rtitle);
TextView size = (TextView) convertView.findViewById(R.id.size);
TextView downloads = (TextView) convertView.findViewById(R.id.downloads);
TextView voters = (TextView) convertView.findViewById(R.id.voters);
TextView personname = (TextView) convertView.findViewById(R.id.personname);
TextView date = (TextView) convertView.findViewById(R.id.date);
RatingBar ratingsmall = (RatingBar) convertView.findViewById(R.id.ratingsmall);
//setdate
try {
Date date_g = new Date(r.getLong("timestamp")*1000);
date.setText( date_g.toLocaleString() ) ;
} catch (JSONException e2) {}
//set person name
try {
String client_name = ( r.getString("personname").equals( "null" ) == true ) ? "ghost" : r.getString("personname");
personname.setText(client_name);
} catch (JSONException e2) {}
//set total votars and vote avarage
try {
float z = (float) r.getInt("rate");
voters.setText(" ( "+ r.getLong("voters") +" ) / " + z);
} catch (JSONException e2) {}
//set rating bar
try {
float z = (float) r.getInt("rate");
ratingsmall.setRating(z);
} catch (JSONException e2) {}
//set ringtone Name as defualt device language
try {
String name = ( lang.equals( "English" ) == true ) ? r.getString("en_name") : r.getString("ar_name");
rtitle.setText(name);
} catch (JSONException e2) {}
//ringtone file size
try {
size.setText(r.getString("size"));
} catch (JSONException e2) {}
//set downloads
try {
downloads.setText(String.valueOf( r.getLong("downloads") ));
} catch (JSONException e2) {}
//set ringtone ID toneid
try {
holder.tonid = r.getLong("toneid");
download.setTag(r.getLong("toneid"));
ratebutton.setTag(r.getLong("toneid"));
} catch (JSONException e1) {}
//set download stram url to play icon
try {
play.setTag(r.getString("stream_url"));
} catch (JSONException e) {}
//add play listener test Ringtone before download it
play.setOnClickListener(onClickListener);
return convertView;
view holders are weird and usually cause confusion, this is how I'd recommend implementing getView()
Upvotes: 0
Reputation: 10977
You are not populating the data if convertView != null
. You should read another example that uses a viewHolder. This time check it more carefully.
Upvotes: 1