2017-01-31 3 views
0

Я использую следующий код, чтобы выделить щелкнутый элемент. Но есть 2 проблемы:ListView: Изюминка исчезает, когда я прокручиваю

  • При первом щелчке элемента, подсветка не появляется. Таким образом, элементы выделяются только после того, как я нажимаю элементы во второй раз.
  • Когда я прокручиваю, подсветка исчезает. Вместо этого мне нужно, чтобы элементы оставались выделенными до тех пор, пока не будет нажат другой элемент.

Не могли бы вы помочь мне решить эти 2 проблемы?

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

      view.setSelected(true); 

bg_key.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector 
    android:id="@+id/myselector" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- Non focused states --> 
    <item 
     android:state_selected="true" 
     android:drawable="@color/activated_color" /> 
    <item 
     android:drawable="@color/default_color" /> 
</selector> 

song_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="0dp" 
    android:paddingRight="0dp" 
    tools:context=".MainActivity" 
    android:paddingTop="5dp" 
    android:paddingBottom="5dp" 
    android:background="@drawable/bg_key"> 
+0

гвоздем исчезает, потому что вид ребенка из списка перерабатываются – Redman

+0

@Redman так что я могу сделать ? :) – xRobot

+0

Я знаю решение, вы можете удалить условие 'if (convertview == null)' condition в методе getview(), используйте это, если в вашем списке несколько элементов, его не рекомендуется. – Redman

ответ

1

вам нужно сохранить ссылку на выделенный position в адаптере. а затем

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     view.setSelected(true); 
     lvAdpapter.highlightPos = position; // declare highlightPos =-1 by default in you adapter. 

И тогда внутри адаптеров getView, сделайте следующее:

public View getView(int position, View convertView, ViewGroup parent) { 
//existing code 

songLay.setSelected(position ==highlightPos); 
return songLay; 
} 
+0

Просто сделано, а затем что мне делать со ссылкой? – xRobot

+0

устанавливает значение в вашем слушателе, а затем проверяет значение в 'getview', так как я написал выше 2 фрагментов. – Saurabh

+0

Я получаю это: java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.view.View.setSelected (boolean)' на нулевой ссылке объекта на com.xrobotx.alltest.musictest2.myAdapter.getView – xRobot

0

ListView в getView() вызывалась на каждом свитке и для каждого нового элемента списка его называют GetView, если listview пункт в настоящее время не видно на UI, то его convertView равен нулю:

для решения этого вопроса: возьмите массив логических isSelected [] с начальным значением false для каждого.

boolean[] isSelected = new boolean[20]; //your list view size 
Arrays.fill(isSelected, false); 

в классе адаптера:

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

     final ViewHolder holder; 
        string text = itemData[position] 
     if (convertView == null) { 
      rowLayout = (RelativeLayout) LayoutInflater.from(context) 
        .inflate(R.layout.list_view_item, parent, false); 
      holder = new ViewHolder(); 

      holder.txtString= (TextView) rowLayout 
        .findViewById(R.id.txtTitle); 
      rowLayout.setTag(holder); 
     } else { 
      rowLayout = (RelativeLayout) convertView; 
      holder = (ViewHolder) rowLayout.getTag(); 
     } 

     if(isSelected[position] == true){ 
        holder.txtString.setText("Selected") 
        rowLayout.setBackGround(selected) 
     }else{ 
      holder.txtString.setText("Not Selected") 
      rowLayout.setBackGround(notSelected) 
     } 




    public class ViewHolder { 
     public TextView txtString; 
     //your listview contents 
    } 

для ListView oItemClick использования:

listView.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, 
         int position, long arg3) { 
        // TODO Auto-generated method stub 
         isSelected[position] = true // on selection 

         RelativeLayout rowLayout = (RelativeLayout) view; 
         rowLayout.setBackGround(Selected); 

        } 
      }); 
+0

Что мне нужно включить в «ваше содержимое списка»? – xRobot

+0

это ваше текстовое изображение и изображение, которое находится в макете ... также вам нужно инициализировать их в состоянии 'convertView == null' – rafsanahmad007

Смежные вопросы