My application use a ListView
which display different items in the cell. it must have photo and name, but it happens to have description and icons.
The problem is: when I scroll the ListView
and come back to the top, the description and icons have disappeared, there are only image and name. I have the impression the description and icons have been removed to have the same size for each row.
I use a custom adapter (BaseAdapter)
for my ListView
:
public class MyAdapterPark extends BaseAdapter {
private ArrayList<DataPark> datapark;
private LayoutInflater myInflater;
public MyAdapterPark (Context context, ArrayList<DataPark> _datapark)
{
this.myInflater = LayoutInflater.from(context);
this.datapark = _datapark;
}
@Override
public int getCount() {
return this.datapark.size();
}
@Override
public Object getItem(int arg0) {
return this.datapark.get(arg0);
}
@Override
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
ImageView image;
TextView text01;
ImageView facebook;
ImageView twitter;
ImageView linkedin;
ImageView blog;
ImageView music;
TextView bio;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null)
{
convertView = myInflater.inflate(R.layout.affichageitem, null);
holder = new ViewHolder();
holder.image = (ImageView)convertView.findViewById(R.id.img);
holder.text01 = (TextView)convertView.findViewById(R.id.user);
holder.facebook = (ImageView)convertView.findViewById(R.id.facebook);
holder.twitter = (ImageView)convertView.findViewById(R.id.twitter);
holder.linkedin = (ImageView)convertView.findViewById(R.id.linkedin);
holder.blog = (ImageView)convertView.findViewById(R.id.blog);
holder.music = (ImageView)convertView.findViewById(R.id.music);
holder.bio = (TextView)convertView.findViewById(R.id.bio);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.text01.setText(datapark.get(position).nickname);
if (!(datapark.get(position).pic.equals(""))){
try {
//byte[] decodedString;
//decodedString = Base64.decode(datapark.get(position).pic);
//Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
//holder.image.setImageBitmap(bitmap);
holder.image.setImageBitmap(telechargerImage(datapark.get(position).pic));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
holder.image.setImageResource(R.drawable.profilbase);
}
if (!(datapark.get(position).facebook.equals(""))){
holder.facebook.setImageResource(R.drawable.fb);
}else{
((ImageView)convertView.findViewById(R.id.facebook)).setVisibility(View.GONE);
}
if (!(datapark.get(position).twitter.equals(""))){
holder.twitter.setImageResource(R.drawable.twitter);
}else{
((ImageView)convertView.findViewById(R.id.twitter)).setVisibility(View.GONE);
}
if (!(datapark.get(position).linkedin.equals(""))){
holder.linkedin.setImageResource(R.drawable.linkedin);
}else{
((ImageView)convertView.findViewById(R.id.linkedin)).setVisibility(View.GONE);
}
if (! (datapark.get(position).blog.equals(""))){
holder.blog.setImageResource(R.drawable.blog);
}else{
((ImageView)convertView.findViewById(R.id.blog)).setVisibility(View.GONE);
}
if (!(datapark.get(position).music.equals(""))){
holder.music.setImageResource(R.drawable.music);
}else{
((ImageView)convertView.findViewById(R.id.music)).setVisibility(View.GONE);
}
if (!(datapark.get(position).bio.equals(""))){
holder.bio.setText(datapark.get(position).bio);
}else{
((TextView)convertView.findViewById(R.id.bio)).setVisibility(View.GONE);
}
return convertView;
}
public static Bitmap telechargerImage(String url) {
Bitmap bm = null;
try {
URL aURL = new URL(url);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch (IOException e) {
Log.e("Erreur","Erreur lors de la récupération de l'image : " + e.getMessage().toString());
}
return bm;
}
}
And the XML of my adapter:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#eaf4f0"
>
<ImageView
android:id="@+id/img"
android:layout_width="70px"
android:layout_height="70px"
android:background="@drawable/carre"
android:scaleType="fitXY"
android:padding="5sp"
android:layout_marginLeft="0sp"
android:src="@drawable/profilbase"
android:layout_margin="5sp"
/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="0sp"
android:layout_weight="1"
>
<TextView android:id="@+id/user"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14px"
android:textColor="#000000"
android:textStyle="bold"
android:text=""
android:layout_marginTop="5sp"
/>
<TextView android:id="@+id/bio"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14px"
android:textColor="#000000"
android:layout_marginTop="1sp"
android:layout_marginRight="2sp"
android:text=""
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4sp"
android:layout_marginBottom="4sp"
>
<ImageView
android:id="@+id/facebook"
android:layout_width="17px"
android:layout_height="17px"
android:scaleType="fitXY"
android:layout_gravity="center"
/>
<ImageView
android:id="@+id/twitter"
android:layout_width="17px"
android:layout_height="17px"
android:scaleType="fitXY"
android:layout_gravity="center"
android:layout_marginLeft="5sp"
/>
<ImageView
android:id="@+id/linkedin"
android:layout_width="17px"
android:layout_height="17px"
android:scaleType="fitXY"
android:layout_gravity="center"
android:layout_marginLeft="5sp"
/>
<ImageView
android:id="@+id/blog"
android:layout_width="17px"
android:layout_height="17px"
android:scaleType="fitXY"
android:layout_gravity="center"
android:layout_marginLeft="5sp"
/>
<ImageView
android:id="@+id/music"
android:layout_width="17px"
android:layout_height="17px"
android:scaleType="fitXY"
android:layout_gravity="center"
android:layout_marginLeft="5sp"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
Thanks!
The key to a smoothly scrolling ListView is to keep the application's main thread (the UI thread) free from heavy processing. Ensure you do any disk access, network access, or SQL access in a separate thread. To test the status of your app, you can enable StrictMode .
ListView uses Adapter classes which add the content from data source (such as string array, array, database etc) to ListView.
10 Answers. Show activity on this post. Never put ListView in ScrollView . ListView itself is scrollable.
Just call stopScroll(myListView); when you need to stop scroll. Show activity on this post. // Stop scrolling smoothScrollBy(0, 0);
It's because you're hiding some of your views sometimes, and you never show them again. Example:
if (!(datapark.get(position).bio.equals(""))){
holder.bio.setText(datapark.get(position).bio);
}else{
((TextView)convertView.findViewById(R.id.bio)).setVisibility(View.GONE);
}
instead try:
if (!(datapark.get(position).bio.equals(""))){
holder.bio.setVisibility(View.VISIBLE);
holder.bio.setText(datapark.get(position).bio);
}else{
holder.bio.setVisibility(View.GONE);
}
Remember that views are recycled, so, unless you show the views the next time you return one, they will never be visible again. Also, remember that holder.bio is the same thing that is returned by the findViewById, so you can do holder.bio.setVisibility(View.GONE)
in the else block.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With