Lorsque vous faites défiler la liste de 6 images, les 3 premières images sont répétées à nouveau comme les 3 dernières. Le texte répète également la même chose à partir des 3 premières mais mon message toast affiche le message correct, par exemple. photo 1 à 6.

Ceci est la classe d'adaptateur

public class CustomAdapter extends BaseAdapter {

Context context;
List<RowItem> rowItems;

CustomAdapter(Context context, List<RowItem> rowItems) {
    this.context = context;
    this.rowItems = rowItems;
}

@Override
public int getCount() {
    return rowItems.size();
}

@Override
public Object getItem(int position) {
    return rowItems.get(position);
}

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}

/* private view holder class */
private class ViewHolder {
    ImageView profile_pic;
    TextView pic_name;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;

    View mView;

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();

        holder.pic_name = (TextView) convertView.findViewById(R.id.pic_name);
        holder.profile_pic = (ImageView) convertView.findViewById(R.id.profile_pic);

        convertView.setTag(holder);

        RowItem row_pos = rowItems.get(position);

        holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
        holder.pic_name.setText(row_pos.getPic_name());

        convertView.setTag(holder);



    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    return convertView;
}

}

Mon activité principale

public class MainActivity extends Activity implements OnItemClickListener {

String[] pic_names;
TypedArray profile_pics;

List<RowItem> rowItems;
ListView mylistview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    rowItems = new ArrayList<RowItem>();
    pic_names = getResources().getStringArray(R.array.pic_names);
    profile_pics = getResources().obtainTypedArray(R.array.profile_pics);

    for (int i = 0; i < pic_names.length; i++) {
        RowItem item = new RowItem(pic_names[i], profile_pics.getResourceId(i, -1));
        rowItems.add(item);
    }

    mylistview = (ListView) findViewById(R.id.list);
    CustomAdapter adapter = new CustomAdapter(this, rowItems);
    mylistview.setAdapter(adapter);

    mylistview.setOnItemClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {

    String pic_name = rowItems.get(position).getPic_name();
    Toast.makeText(getApplicationContext(), "" +  pic_name,
            Toast.LENGTH_SHORT).show();
}





}

Ce sont les getters et les setters

public class RowItem {

private String pic_name;
private int profile_pic_id;

public RowItem(String pic_name, int profile_pic_id) {

    this.pic_name = pic_name;
    this.profile_pic_id = profile_pic_id;

}

public String getPic_name() {
    return pic_name;
}

public void setPic_name(String pic_name) {
    this.pic_name = pic_name;
}

public int getProfile_pic_id() {
    return profile_pic_id;
}

public void setProfile_pic_id(int profile_pic_id) {
    this.profile_pic_id = profile_pic_id;
}

}

0
Ashley 'Splash' Elliott 28 avril 2017 à 14:12

3 réponses

Meilleure réponse

Veuillez écrire ces lignes à l'extérieur si la condition

    RowItem row_pos = rowItems.get(position);

    holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
    holder.pic_name.setText(row_pos.getPic_name());

Et supprimez une ligne de plus de votre code et ne la gardez qu'une seule fois, vous avez écrit cette ligne deux fois

convertView.setTag(holder);

Code final

public class CustomAdapter extends BaseAdapter {

        Context context;
       List<RowItem> rowItems;

       CustomAdapter(Context context, List<RowItem> rowItems) {
           this.context = context;
           this.rowItems = rowItems;
       }

       @Override
       public int getCount() {
           return rowItems.size();
       }

       @Override
       public Object getItem(int position) {
           return rowItems.get(position);
       }

       @Override
       public long getItemId(int position) {
           return rowItems.indexOf(getItem(position));
       }

       /* private view holder class */
       private class ViewHolder {
           ImageView profile_pic;
           TextView pic_name;
       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {

           ViewHolder holder = null;

           View mView;

           LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

           if (convertView == null) {
               convertView = mInflater.inflate(R.layout.list_item, null);
               holder = new ViewHolder();

               holder.pic_name = (TextView) convertView.findViewById(R.id.pic_name);
               holder.profile_pic = (ImageView) convertView.findViewById(R.id.profile_pic);

               convertView.setTag(holder);


           } else {
               holder = (ViewHolder) convertView.getTag();
           }

               RowItem row_pos = rowItems.get(position);

               holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
               holder.pic_name.setText(row_pos.getPic_name());

           return convertView;
       }
   }
3
Dharmbir Singh 28 avril 2017 à 11:15

Définir la ressource image en dehors de la condition if

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;

    View mView;

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();

        holder.pic_name = (TextView) convertView.findViewById(R.id.pic_name);
        holder.profile_pic = (ImageView) convertView.findViewById(R.id.profile_pic);
        convertView.setTag(holder);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    RowItem row_pos = rowItems.get(position);
    holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
    holder.pic_name.setText(row_pos.getPic_name());

    return convertView;
}
0
Kamran Ahmed 28 avril 2017 à 11:23

Votre méthode getView() est incorrecte. Vous prenez correctement en compte la création du View lorsqu'il n'y a pas de vue recyclée, mais vous ne parvenez pas à modifier le contenu lorsque le convertView recyclé vous est fourni. C'est pourquoi les images ne changent jamais.

Apportez les modifications suivantes dans getView():

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;

    View mView;

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        convertView.setTag(holder);
        holder.pic_name = (TextView) convertView.findViewById(R.id.pic_name);
    holder.profile_pic = (ImageView) convertView.findViewById(R.id.profile_pic);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    RowItem row_pos = rowItems.get(position);

    holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
    holder.pic_name.setText(row_pos.getPic_name());
    return convertView;
}
0
rupps 28 avril 2017 à 11:17