2014-09-16 3 views
0

J'ai Listview avec lequel j'essaye d'afficher mon adapteur fait sur commande. Tout fonctionne très bien excepté quand je sélectionne l'article de liste et le défile, les articles qui n'ont pas été choisis sont déjà choisis. Je ne comprends pas vraiment quel est le problème avec ma listview.ListView Scrolling Problème: sur la sélection d'article

Voilà ma classe:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.select_contact_layout); 

    getActionBar().setHomeButtonEnabled(true); 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setTitle("Select Contact"); 

    mArrayAdapter = new CustomAdapter(this,getContacts()); 

    setListAdapter(mArrayAdapter); 

    contactPreferences = getSharedPreferences("contactPref", MODE_PRIVATE); 

    mListView = getListView(); 

} 



@Override 
protected void onListItemClick(ListView l, View v, int position, long id) 
{ 
    super.onListItemClick(l, v, position, id); 

    String name = mArrayAdapter.getItem(position).getName(); 

    v.setBackgroundColor(Color.parseColor("#88dfdf")); 

    Toast.makeText(getApplicationContext(), "Items Pos: " + position +"and Name : "+ name, 0).show(); 

} 

et mon adaptateur personnalisé:

class CustomAdapter extends ArrayAdapter<Contacts> 
{ 
    LayoutInflater layoutInflater; 
    private List<Contacts> conctactList; 


    public CustomAdapter(Context context, List<Contacts> mList) 
    { 
     super(context, R.layout.single_contact_layout,mList); 
     this.conctactList = mList; 
     layoutInflater = LayoutInflater.from(context); 
    } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return conctactList.size(); 
     } 

     @Override 
     public Contacts getItem(int position) { 
      // TODO Auto-generated method stub 
      return conctactList.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) 
     { 
      final Holder holder; 
      Bitmap bitmap = null; 
      Bitmap scaleBitmap = null; 

      if(convertView == null) 
      { 
       holder = new Holder(); 


       convertView = layoutInflater.inflate(R.layout.single_contact_layout, null); 
       holder.name = (TextView) convertView.findViewById(R.id.contact_name); 
       holder.number = (TextView) convertView.findViewById(R.id.contact_number); 
       holder.contact_img = (ImageView)convertView.findViewById(R.id.contact_img); 


       convertView.setTag(holder); 
       convertView.setTag(R.id.contact_name, holder.name); 
      } 

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

      holder.name.setText(conctactList.get(position).getName()); 
      holder.number.setText(conctactList.get(position).getNumber()); 
      try { 
       bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.parse(contactsList.get(position).getImgUri())); 

       scaleBitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, true); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      holder.contact_img.setImageBitmap(ImageHelper.getRoundedCornerBitmap(scaleBitmap, 100)); 

      return convertView; 
     } 


} 

private static class Holder{ 
    TextView name; 
    TextView number; 
    ImageView contact_img; 
    } 
+0

donc ce que vous voulez faire quand l'élément sélectionné dans la liste –

+0

sur le défilement des éléments qui ne sont pas sélectionnés sont également sélectionnés, c'est mon problème @AndoMasahashi – Pankaj

Répondre

2

v.setBackgroundColor(Color.parseColor("#88dfdf")); Vous devriez non seulement cela, mais aussi un ArrayList<Boolean> selectedList dans lequel vous souvenez »si l'élément est sélectionné . Ensuite, dans getView vous devriez 'inspecter' cette liste et mettre la couleur en conséquence.

if (selectedList.get(position)) 
     convertView.setBackgroundColor(Color.parseColor("#88dfdf")); 
else  
     convertView.setBackgroundColor(Color.parseColor(normal color)); 

Initialiser la liste dans la classe d'adaptateur:

ArrayList<Boolean> selectedList = new ArrayList<Boolean>(); 

public CustomAdapter(Context context, List<Contacts> mList) 
{ 
......... 
int nr = -1; 
while (++nr < mList.size()) 
    selectedList.add(false); 
} 
} 

également ajouter cette fonction à

public View getView(final int position, View convertView, ViewGroup parent) 
    { ............................... 
     holder.contact_img.setImageBitmap(ImageHelper.getRoundedCornerBitmap(scaleBitmap, 100)); 

     if(selectedList.get(position)== true) 
     { 
      convertView.setBackgroundColor(Color.parseColor("#88dfdf")); 
     } 
     else 
     { 
      convertView.setBackgroundColor(Color.background_light); 
     } 
     return convertView; 
    } 

getView() aussi ajouter la ligne suivante à votre onListItemClick().

protected void onListItemClick(ListView l, View v, int position, long id) 
{ 
    .................. 
    if(mArrayAdapter.selectedList.get(position)==true) 
    { 
     v.setBackgroundColor(Color.background_light)); 
     mArrayAdapter.selectedList.set(position,false); 
    } 
    else 
    { 
     v.setBackgroundColor(Color.parseColor("#88dfdf")); 
     mArrayAdapter.selectedList.set(position,true); 
     Toast.makeText(getApplicationContext(), "Items Pos: " + position +"and Name : "+ name, 0).show(); 
    } 

} 

et également de rendre la variable selectedList à public dans CustomAdapter.

+0

D'accord, Laissez-moi l'essayer, en passant merci pour la réponse – Pankaj

+0

mais selectedList n'aura que des valeurs booléennes lorsque je sélectionne Items ou bien ça passera par l'exception OverFlow, une chose aussi je dois aussi stocker la position des items pour vérifier les valeurs booléennes. ? – Pankaj

+0

Désolé, je ne peux pas vous suivre. Mais vous devez initialiser la liste des cours. Il doit contenir autant d'éléments que d'éléments dans votre liste d'adaptateurs. Je vais ajouter le code. – greenapps

0

Une autre solution, mettre simple int dans votre liste personnalisée Voir

public class CustomListView extends BaseAdapter { 
    private int selected = 0; 

vérifier la position dans votre getView

public View getView(int position, View convertView, ViewGroup parent) { 
    if (position == selected) 
     selector.setImageResource(R.drawable.selected); 
    else 
     selector.setImageResource(R.drawable.not_selected); 

et enfin dans le clickListener de votre activité ou d'un fragment, définissez la position avec la méthode setter/getter et notifier l'adaptateur.

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    customListViewAdapter.setSelectedPosition(position); 
    customListViewAdapter.notifyDataSetChanged(); 
} 

Il fonctionne comme un charme pour moi;)