2016-04-12 2 views
0

Я реализовал простой список с возможностью выбирать каждый раз только один элемент из него, эта функциональность работает исправно. Также у меня есть кнопка для сортировки записей в Asc или Desc порядке, когда я выбираю запись, и после этого я сортирую записи, селектор старой записи остается в прежнем положении, даже когда выбранная позиция обновляется различное положение.выбранный элемент списка остается в том же положении после notifyDataSetChanged

MainActivity:

public class MainActivity extends Activity 
{ 

    private ListView  _listView; 
    private PersonAdapter _adapter; 
    private Button   _sortBtn; 
    private List<Person> _data; 
    private int    _sort; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     _listView = (ListView) findViewById(R.id.list); 
     _sortBtn = (Button) findViewById(R.id.sort_list_btn); 

     _sort = 1; 
     _data = new ArrayList<Person>(); 
     _data.add(new Person("abc", "defg", 1)); 
     _data.add(new Person("aaa", "defg", 12)); 
     _data.add(new Person("ccc", "defg", 13)); 
     _data.add(new Person("bb", "defg", 14)); 
     _data.add(new Person("aa", "defg", 144)); 
     _data.add(new Person("fff", "defg", 199)); 

     _adapter = new PersonAdapter(this, _data); 
     _listView.setAdapter(_adapter); 

     _sortBtn.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View v) 
      { 
       Comparator<Person> sortById = Person.getComperatorByFirstName(_sort); 
       Collections.sort(_data, sortById); 

       _adapter.setData(_data); 
       _sort = -_sort; 
      } 
     }); 

    } 

    public static class Person 
    { 
     public String _fName; 
     public String _lName; 
     public int  _age; 
     public boolean _selected; 

     public Person(String fName, String lName, int age) 
     { 
      _fName = fName; 
      _lName = lName; 
      _age = age; 
     } 

     public static Comparator<Person> getComperatorByFirstName(final int ascendingFlag) 
     { 
      return new Comparator<Person>() 
      { 
       @Override 
       public int compare(Person patient1, Person patient2) 
       { 
        return patient1._fName.compareTo(patient2._fName) * ascendingFlag; 
       } 
      }; 
     } 

    } 

} 

ListView адаптер

public class PersonAdapter extends BaseAdapter 
{ 

    private Context   _con; 
    private List<Person> _data; 

    public PersonAdapter(Context context, List<Person> data) 
    { 
     _con = context; 
     _data = data; 
    } 

    @Override 
    public int getCount() 
    { 
     // TODO Auto-generated method stub 
     return _data.size(); 
    } 

    @Override 
    public Person getItem(int position) 
    { 
     return _data.get(position); 
    } 

    @Override 
    public long getItemId(int position) 
    { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     Holder h = null; 
     if (convertView == null) 
     { 
      h = new Holder(); 
      convertView = LayoutInflater.from(_con).inflate(R.layout.item_layout, parent, false); 

      h._backgroundItem = (LinearLayout) convertView.findViewById(R.id.item_layout); 
      h._fName = (TextView) convertView.findViewById(R.id.f_name); 
      h._lName = (TextView) convertView.findViewById(R.id.l_name); 
      h._age = (TextView) convertView.findViewById(R.id.age); 
      convertView.setTag(h); 
     } 
     else 
     { 
      h = (Holder) convertView.getTag(); 
     } 

     Person p = getItem(position); 
     h._fName.setText(p._fName); 
     h._lName.setText(p._lName); 
     h._age.setText(String.valueOf(p._age)); 
     h._backgroundItem.setActivated(p._selected); 



     return convertView; 

    } 


    public void setData(List<Person> data) 
    { 
     _data = data; 
     notifyDataSetChanged(); 

    } 

    private static class Holder 
    { 
     public LinearLayout _backgroundItem; 
     public TextView  _fName; 
     public TextView  _lName; 
     public TextView  _age; 
    } 



} 

элемент макета:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/item_layout" 
    android:layout_width="match_parent" 
    android:layout_height="48dp" 
    android:orientation="horizontal" 
    android:background="@drawable/list_selector" 
    android:weightSum="3" > 

    <TextView 
     android:id="@+id/f_name" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 

    <TextView 
     android:id="@+id/l_name" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 

    <TextView 
     android:id="@+id/age" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 

</LinearLayout> 

Я уже пробовал использовать clearChoices но после сортировки я не вижу селектор на всех, также я попытался изменить режим выбора из одного режима в один, а затем снова один, но без каких-либо su ступа.

ответ

1

Это связано с тем, что вы переключаете содержимое элементов внутри элемента списка, но щелчок привязан к позиции с помощью ListView, поэтому он не «обновляется» до новой позиции элемента. Я предлагаю вам программно нажать на новый элемент, когда закончите сортировку. Получить идентификатор щелкнули пункта

public int getItemPosition(long id) 
{ 
    for (int position=0; position<mList.size(); position++) 
     if (mList.get(position).getId() == id) 
      return position; 
    return 0; 
} 

затем после сортировки сделать замковое

mList.performItemClick(
    mList.getAdapter().getView(mActivePosition, null, null), 
    mActivePosition, 
    mList.getAdapter().getItemId(mActivePosition)); 

надеюсь, что это помогает!

+0

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

+0

Он работал, как вы писали, единственное изменение, которое я сделал, это использовать setItemChecked вместо performItemClick. Благодаря! –

+0

О, я только что проверил Stackoverflow сейчас, я не видел вашего предыдущего сообщения. Отлично, что сейчас он работает ... не могли бы вы дать ответ положительным, пожалуйста? лол –

0

Я предлагаю сохранить идентификатор выбранного элемента, когда он выбран, и после заказа набора данных выполните поиск этого идентификатора и переустановите его.