2012-05-23 7 views
0

Я подготовил пользовательский список с помощью BaseAdapter. Теперь я хочу изменить цвет выбранного элемента списка в событии клика. Необходимо выбрать несколько элементов. Здесь я даю одну демо: цветИзменить ListView Item Фон на клик - Android

enter image description here

Выбранный элемент является Orange. Это просто демонстрационный экран. Если кто-то знает, как изменить весь цвет фона выбранного элемента списка, пожалуйста, разместите их отзывы. Благодарю.

Я использую этот BaseAdapter Класс:

public class MyListAdapter extends BaseAdapter { 

private Activity activity; 
private String[] title, artist, duration, rowNumber; 
private static LayoutInflater inflater=null; 
ViewHolder holder; 

View vi; 

public MyListAdapter (Activity context, String[] songTitle,String[] songArtist, String[] songDuration) 
{ 
    try 
    { 
    activity = context; 
    title = songTitle; 
    artist = songArtist; 
    duration = songDuration; 

    rowNumber = new String[title.length]; 
    for(int i=0;i<title.length; i++){ 
     rowNumber[i] = Integer.toString(i+1); 
    } 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 
    catch (NullPointerException e) 
    { 
     e.printStackTrace(); 
    } 
} 

public int getCount() { 
    return title.length; 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public static class ViewHolder{ 
    private TextView txtSongNumber, txtSongTitle, txtSongArtist, txtSongDuration; 

} 

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    try 
    { 
     vi=convertView; 

     // System.out.println("Value of position"+position); 
     if(convertView==null) 
     { 
      vi = inflater.inflate(R.layout.list_songs, null); 
      holder=new ViewHolder(); 
      holder.txtSongNumber = (TextView)vi.findViewById(R.id.txtSongNumber); 
      holder.txtSongTitle = (TextView)vi.findViewById(R.id.txtSongTitle); 
      holder.txtSongArtist = (TextView)vi.findViewById(R.id.txtSongArtist); 
      holder.txtSongDuration = (TextView)vi.findViewById(R.id.txtSongDuration); 

      vi.setTag(holder); 
     } 
     else 

      holder=(ViewHolder)vi.getTag(); 

     holder.txtSongNumber.setText(rowNumber[position]); 
     holder.txtSongTitle.setText(title[position]); 
     holder.txtSongArtist.setText(artist[position]); 

     holder.txtSongDuration.setText(duration[position]); 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return vi; 
} 

}

+0

Есть много вопросов относительно к вашему запросу. [Любой из ссылок может помочь вам] (http://www.google.com/search?q=android+listview+background&ie=utf-8&oe=utf-8&aq=t#hl=ru&sclient=psy-ab&q=android+ ListView + фон + цвет + изменение & OQ = + Android ListView + фон + цвет + изменение & водно = F & AQI = г-K2g-bK1g-bsK1 & акло = & gs_l = serp.3..0i30l2j0i8i30j0i8i10i30.6102.9207.0.9318.15.12.1.2.2.1.509.2396.0j5j3j1j0j1 .10.0 ... 0.0.sK4QGOSwbEE & pbx = 1 & bav = on.2, or.r_gc.r_pw.r_qf., Cf.osb & fp = 71438d7011881060 & biw = 1440 & bih = 785) – Praveenkumar

ответ

2

Его очень просто ... Просто попробуйте следующий код ...

в вашем списке адаптеров:

Определить целочисленный массив первого

ArrayList<Integer> itemPos = new ArrayList<Integer>(); 

затем использовать этот код в GetView Me ThOD:

 if (itemPos.contains(position)) { 
      holder.txtOne.setTextColor(Color.BLUE); 
     } else { 
      holder.txtOne.setTextColor(Color.WHITE); 
     } 

Теперь используйте этот код события нажатия вашего текста Вид:

  if (!itemPos.contains(position)) { 
       holder.txtOne.setTextColor(Color.BLUE); 
       itemPos.add(position); 
       notifyDataSetChanged(); 
      } else { 
       holder.txtOne.setTextColor(Color.WHITE); 
       notifyDataSetChanged(); 
       int po = itemPos.indexOf(position); 
       itemPos.remove(po); 
      } 
0

Поскольку вы реализовали BaseAdapter, который имеет метод ядра под названием GetView, вы можете легко хранить состояние элементов в BaseAdapter. Например, вы можете использовать List для хранения состояний.

Затем должен быть реализован слушатель ListView, как описано в http://developer.android.com/reference/android/widget/AdapterView.html#setOnClickListener(android.view.View.OnClickListener). Документация OnItemClickListener находится здесь, http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html, с помощью которой вы можете получить позиции кликов.

Наконец, измените состояние элементов после событий на клике и вызовите notifyDataSetChanged() в адаптере, чтобы уведомить, что данные были изменены, и вы увидите обновленные выбранные элементы.

+0

Большое спасибо за вашу помощь. Я сделал все это. Теперь я обнаружил, что когда я нажимаю один элемент в списке, другой элемент также выбирается автоматически. Есть ли проблема с BaseAdapter? –

+0

Нет, BaseAdapter работает хорошо. Но вам нужно проверить свой код, чтобы убедиться, что вы использовали правильный параметр OnItemClickListener. В OnItemClickListener позиция означает «положение вида в адаптере», как описано в документации. – Davidsun

+0

Я получаю выбранную позицию позиции. Это верно. Но почему он выбирает более одного элемента, когда я выбираю только один? –

0

«Большое спасибо за вашу помощь. Я сделал все это. Теперь я обнаружил, что, когда я нажимаю один элемент в списке, другой элемент также выбирается автоматически. Есть ли проблемы с BaseAdapter?»

Для этой проблемы вам необходимо сохранить состояния ваших строк списка, независимо от того, выбрана ли эта строка или нет в getview, если она выбрана, а затем установите цвет строки как выбранный. Вы также должны сохранять состояние, когда вы выбираете или снимаете выделение с любой строки. Вот подобный пример, а не флажок, строка будет там в вашем случае ... Надеюсь, что это поможет, я даю вам ссылку ....

How to implement a button that gets all checkbox's state and adds the value of checked item into arraylist?