2013-09-04 2 views
0

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

Я имею в виду here реализовать нижепреведенного & -drop вид списка (т.е. пользователь может продолжительное нажатие и перетащить элемент списка, чтобы изменить порядок позицию. Я создал пользовательский элемент управления ListView, адаптер и ListActivity. Вот часть код ListActivity:

public class DragNDropListActivity extends ListActivity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.dragndroplistview); 

    ArrayList<String> content = new ArrayList<String>(mListContent.length); 
    for (int i=0; i < mListContent.length; i++) { 
     content.add(mListContent[i]); 
    } 

    setListAdapter(new DragNDropAdapter(this, new int[]{R.layout.dragitem}, new int[]{R.id.TextView01}, content));//new DragNDropAdapter(this,content) 
    ListView listView = getListView(); 

    if (listView instanceof DragNDropListView) { 
     ((DragNDropListView) listView).setDropListener(mDropListener); 
     ((DragNDropListView) listView).setRemoveListener(mRemoveListener); 
     ((DragNDropListView) listView).setDragListener(mDragListener); 
    } 

    listView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.i("", "OnItemClick"); 
     } 
    }); 

} 

private DropListener mDropListener = 
    new DropListener() { 
    public void onDrop(int from, int to) { 
     ListAdapter adapter = getListAdapter(); 
     if (adapter instanceof DragNDropAdapter) { 
      ((DragNDropAdapter)adapter).onDrop(from, to); 
      getListView().invalidateViews(); 
     } 
    } 
}; 

Моей проблема:. когда я перетащил & упал элемент в новое положение, он был заменен правильно, но после этого, когда я попытался перетащить этот пункт снова, предыдущий пункт в этой позиции. Эта проблема может быть восстановлена, если я помещу приложение в фоновый режим, а затем верну его обратно.

Внутри «onDrop» вид списка недействителен. Я узнал из этого сайта, что invalidateViews() не запускается немедленно, но кажется, что invalidateViews() никогда не запускается, пока я не помещу приложение в фоновый режим?! Как заставить элемент списка перерисовать себя?

Дополнительная информация: приложение работает правильно в эмуляторе, но эта проблема произошла на моем телефоне Galaxy (4.1.2).

Надеюсь, кто-то может помочь, большое спасибо!

ответ

0

Check Это, если он работает:

private DropListener mDropListener = 
new DropListener() { 
public void onDrop(int from, int to) { 
    ListAdapter adapter = getListAdapter(); 
    if (adapter instanceof DragNDropAdapter) { 
     ((DragNDropAdapter)adapter).notifyDataSetChanged(); 
     ((DragNDropAdapter)adapter).onDrop(from, to); 
     getListView().invalidate(); 

    } 
} 

};

+0

Спасибо, Ритабан, до сих пор не повезло! –

+0

NotifyDataSetChanged() должен появиться после onDrop(), поскольку данные обновляются внутри onDrop. –

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