Android ListView прокручивает клипы элементов в списке - PullRequest
3 голосов
/ 23 февраля 2012

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

Я пытаюсь обновить список с помощью таких вещей, как

l.invalidate();
l.requestLayout();
l.forceLayout();
l.invalidateViews();
l.postInvalidate();
l.refreshDrawableState();

Но безрезультатно: см. Изображение после прокрутки вниз на 150 пикселей

enter image description here

Есть еще записи под data5, но они обрезаны.

код:

public class TestListViewScrollActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final ListView l = (ListView)findViewById(R.id.listView1);
    final MyAdapter adapter = new MyAdapter(getApplicationContext());


    l.setAdapter(adapter);

    l.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            adapter.add();

            l.scrollBy(0, 150);
            l.invalidate();
            l.requestLayout();
            l.forceLayout();
            l.invalidateViews();
            l.postInvalidate();
            l.refreshDrawableState();
        }
    });

}
}

class MyAdapter extends BaseAdapter {

ArrayList data = new ArrayList();
Context context;

public MyAdapter(Context context) {
    data.add("data1");
    data.add("data2");
    data.add("data3");
    data.add("data4");
    data.add("data5");
    data.add("data6");
    data.add("data7");
    data.add("data8");
    data.add("data9");
    this.context = context;
}

public void add() {
    //data.add(0, "new data");
    //notifyDataSetInvalidated();
    notifyDataSetChanged();

}

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

@Override
public Object getItem(int position) {
    return data.get(position);
}

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

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

    View v;
     if (convertView == null) {
         LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         v = vi.inflate(R.layout.listitem, null);

     } else {
         v = convertView;

     }
     TextView text = (TextView) v.findViewById(R.id.text);
        text.setText((String)data.get(position));
 return v;
}





}

Ответы [ 3 ]

2 голосов
/ 27 февраля 2012

Решено, не используя scrollBy, но

l.setSelectionFromTop(l.getFirstVisiblePosition() + 1, l.getChildAt(0).getTop() + 150);

см. Сохранение / сохранение / восстановление позиции прокрутки при возврате в ListView

1 голос
/ 23 февраля 2012
adapter.notifyDataSetChanged();
0 голосов
/ 22 июля 2015

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

public void scrollBy(ListView l, int px){
    l.setSelectionFromTop(l.getFirstVisiblePosition(), l.getChildAt(0).getTop() - px);
}
...