2012-06-18 2 views
0

Я пытаюсь создать контекстное меню для своего списка, поэтому, когда пользователь долго нажимает строку, появляется контекстное меню, и когда пользователь выбирает параметр, строка выбирается. Однако выбрано много строк, оно повторяет выбор в шаблоне для других строк в списке.Повторяющийся выбор ListView

То же самое происходит, когда я просто нажимаю строку. IDK, если это проблема с переработкой вида просмотра или что.

Как решить обе проблемы, так как первый обрабатывается внутри onContextItemSelected(MenuItem item) поэтому я управляю строку манипулируя MenuItem объект, а второй обрабатывается в AdapterView.OnItemClickListener.

BTW, я использую CursorAdapter для заполнения ListView.

Спасибо.

Вот мой код:

// Listener for the click on the items in the ListView 
mListViewListener = new AdapterView.OnItemClickListener() 
{ 
    // When the user clicks some item, the Activity that shows the available dates will be shown 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long arg3) 
    { 
     view.setBackgroundColor(0xff333333); 
    } 
}; 


// Handle the LongClick on the row 
@Override 
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) 
{ 
    super.onCreateContextMenu(menu, view, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.contact_options, menu); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) 
{ 
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
    switch(item.getItemId()) 
    { 
     case R.id.context_menu_item: 
      info.targetView.setBackgroundColor(0xff333333); 

      default: 
      return super.onContextItemSelected(item); 
    } 
} 
+0

Какова ваша конечная цель: изменить цвет фона на длинный клик? Или больше? – Sam

+0

@Sam меняет фон строки, на которую я долго нажимал (после выбора опции из контекстного меню, созданного LongClick), и измените фон строки, которую я просто нажал. – rogcg

+0

Проверьте фокус для строк и посмотрите, что произойдет – SpicyWeenie

ответ

1

Нечто подобное в вашем CursorAdapter должно работать:

private Set<String> mSelectedContactNumbers = new HashSet<String>(); 

@Override 
public void bindView(View view, Context context, final Cursor cursor) 
{ 
    final String contactNumber = cursor.getString(cursor.getColumnIndex("contact_number")); 
    view.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
        if (!mSelectedContactNumbers.remove(contactNumber)) { 
         mSelectedContactNumbers.add(contactNumber); 
        } 
        notifyDataSetChanged(); 
     } 
    }); 
    if (mSelectedContactNumbers.contains(contactNumber)) { 
     view.setBackgroundColor(0xff333333); 
    } else { 
     view.setBackgroundColor(0); 
    } 
    createView(view, cursor);  
} 

Это только быстрое решение. Вы создаете функцию toggleSelected в адаптере, которую вы можете вызывать из OnItemClickListener. Таким образом, это будет немного лучше.