2015-01-21 5 views
0

Мне нужно выделить выбранную строку в виде списка, как только мы выберем элемент.Список Просмотреть выделенную выделенную строку

Например: я выбираю первый элемент, который его подсвечивает, если я выбираю третий элемент, то удаляю 1-й элемент, а затем выделяю третий предмет.

Я видел много примеров и вопросов, размещенных в Stackoverflow, но havent нашел правильное решение.

Ниже мой код, он работает, но мне нужно выбрать элемент дважды, чтобы получить выделение, как я могу изменить это, чтобы работать плавно?

ListView mainListView = (ListView) findViewById(R.id.mainListView); 

     // Create and populate a List of planet names. 
     planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
              "Jupiter", "Saturn", "Uranus", "Neptune", 
              "Ceres","Pluto","Haumea","Makemake","Eris"};  
     planetList = new ArrayList<String>(); 
     planetList.addAll(Arrays.asList(planets)); 

     planetsAdapter = new PlanetsAdapter (this,planetList); 
     planetsAdapter .setNotifyOnChange(true); 

     // Set the ArrayAdapter as the ListView's adapter. 
     mainListView.setAdapter(planetsAdapter); 
     mainListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     mainListView.setOnItemClickListener(new OnItemClickListener() { 

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

адаптированный Класс:

public class PlanetsAdapter extends ArrayAdapter<String> { 
     private ArrayList<String> planets; 
     private Context mContext = null; 
     private LayoutInflater inflater; 

     // used to keep selected position in ListView 
     private int selectedPos = -1; // init value for not-selected 

     public PlanetsAdapter (Context context,ArrayList<String> objects) { 
      super(context,0,objects); 
      mContext = context; 
      planets = objects; 
     } 

     public void setSelectedPosition(int pos){ 
      selectedPos = pos; 
      // inform the view of this change 
     } 

     public int getSelectedPosition(){ 
      return selectedPos; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       inflater = (LayoutInflater) mContext 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.list_item, null); 
      } 

      TextView title = (TextView) convertView 
        .findViewById(R.id.rowTextView); 

      // change the row color based on selected state 
      if(position == selectedPos){ 
       //title.setTextColor(Color.parseColor("#FFFFFF")); 
       title.setBackgroundColor(Color.parseColor("#ED07E1")); 
      }else{ 
       //title.setTextColor(Color.parseColor("#000000")); 
       title.setBackgroundColor(Color.parseColor("#e2e2e2")); 
      } 

      title.setText(getItem(position)); 
      return convertView; 
     } 
    } 

Edit: Ответил Ниже

For anyone who is looking for answers, i have answered it below hope it helps. 
+0

Попробуйте добавить 'notifyDataSetChanged();' to 'setSelect edPosition' в вашем адаптере –

+0

@MD Пробовал это раньше, но все же мне нужно выбрать элемент дважды, чтобы выделить его. – user2056563

+0

Ваш вопрос для меня не подлежит. 'выберите элемент дважды, чтобы получить выделение'. –

ответ

0

Установите это в вашей ListView (XML или код)

XML: android:choiceMode="singleChoice" 

code: mListView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); 

I n ваш xml, попробуйте добавить android: listSelector background для обратной связи по вашему выбору.

Ссылка: http://developer.android.com/reference/android/widget/AbsListView.html

+0

Нет, он не будет выделять строку, это просто указывает, что пользователь выбрал этот пункт. – user2056563

+0

Определите ли вы, что селектор фона доступен для вашего элемента, и имеет ли он это: android : state_activated или андроид: state_selected. –

+0

Да, я сделал, я ссылался на ссылку: http: //stackoverflow.com/questions/18386035/custom-selector-for-list-background – user2056563

0

После долгих исследований и R & D, наконец, получил решение:

Список Просмотр в деятельности или фрагмент:

ListView mainListView = (ListView) findViewById(R.id.mainListView); 

     // Create and populate a List of planet names. 
     planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
              "Jupiter", "Saturn", "Uranus", "Neptune", 
              "Ceres","Pluto","Haumea","Makemake","Eris"};  
     planetList = new ArrayList<String>(); 
     planetList.addAll(Arrays.asList(planets)); 

     planetsAdapter = new PlanetsAdapter (this,planetList); 
     planetsAdapter .setNotifyOnChange(true); 

     // Set the ArrayAdapter as the ListView's adapter. 
     mainListView.setAdapter(planetsAdapter); 
     mainListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     mainListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       view.setSelected(true); //Important 
      } 
     }); 

адаптер Класс:

public class PlanetsAdapter extends ArrayAdapter<String> { 
     private ArrayList<String> planets; 
     private Context mContext = null; 
     private LayoutInflater inflater; 


     public PlanetsAdapter (Context context,ArrayList<String> objects) { 
      super(context,0,objects); 
      mContext = context; 
      planets = objects; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       inflater = (LayoutInflater) mContext 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.list_item, null); 
      } 

      TextView title = (TextView) convertView 
        .findViewById(R.id.rowTextView); 

      title.setText(getItem(position));//Set the text to textview 
      return convertView; 
     } 
    } 

ListView, определенный в XML:

<ListView 
        android:id="@+id/mainListView" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:background="#FFFFFF" 
        android:choiceMode="singleChoice" 
        android:cacheColorHint="#00000000"> 
       </ListView> 

Каждый элемент списка определяется в XML list_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/rowTextView" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:padding="5dp" 
android:background="@drawable/list_item_selector" 
android:textColor="@drawable/text_color_selector" 
android:textSize="16sp" > 
</TextView> 

Примечание в коде выше я использовал 2 разных селекторов один для фона и один для изменения цвета текста.

list_item_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:drawable="@color/defalut_color" android:state_activated="false"/> 
    <item android:drawable="@color/defalut_color" android:state_activated="false" android:state_pressed="false"/> 
    <item android:drawable="@color/pressed_color" android:state_pressed="true"/> 
    <item android:drawable="@color/pressed_color" android:state_activated="true"/> 

</selector> 

text_color_selector:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:color="#000000" android:state_activated="false"/> 
    <item android:color="#000000" android:state_activated="false" android:state_pressed="false"/> 
    <item android:color="#FFFFFF" android:state_pressed="true"/> 
    <item android:color="#FFFFFF" android:state_activated="true"/> 

</selector> 

Рез/значения/colors.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<color name="defalut_color">#e2e2e2</color> 
<color name="pressed_color">#ED07E1</color> 
</resources> 

Так вот это удовольствие :)

+0

Вот что предложил Нгуен Хоай Нам. –

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