2014-09-16 3 views
0

У меня есть ListView, с помощью которого я пытаюсь отобразить свой пользовательский адаптер. Все работает отлично, за исключением случаев, когда я выбираю элемент списка и прокручиваю его, элементы, которые не были выбраны, уже выбраны. I не понимаю, в чем проблема с моим списком.ListView Scrolling Issue: on Item Selection

Вот мой класс:

@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(); 

} 

и мой заказ адаптер:

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

так, что вы хотите делать, когда элемент списка выбран –

+0

на прокрутку элементов, которые не были выбраны также выбраны, что мой вопрос @AndoMasahashi – Pankaj

ответ

2

v.setBackgroundColor(Color.parseColor("#88dfdf")); Вы должны не только делать, но и иметь ArrayList<Boolean> selectedList, в котором вы «помнить», если выбран пункт , Затем в getView вы должны «проверить» этот список и соответствующим образом поместить цвет.

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

Инициализация списка в классе адаптера:

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

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

также добавить это GetView функция()

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; 
    } 

также добавить следующую строку в 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(); 
    } 

} 

а также сделать selectedList переменной общедоступной в CustomAdapter.

+0

Хорошо, Позвольте мне попробовать, кстати thanx для ответа – Pankaj

+0

, но selectedList будет иметь только логические значения, когда я выберу элементы, иначе это произойдет через исключение OverFlow, и я тоже должен сохранить позицию элементов, а также проверить значения булевых значений? ? – Pankaj

+0

Извините, я не могу следовать за вами. Но вы должны инициализировать список событий. Он должен содержать столько элементов, сколько есть в списке адаптеров. Я добавлю код. – greenapps

0

Другое решение, поставить простой Int в ваш список Просмотр

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

проверить положение в вашем 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); 

и, наконец, в clickListener вашей деятельности или фрагмента, установите положение с методом setter/getter и уведомлять адаптер.

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

Он работает как шарм для меня;)