3

Im trying to use the scrollBy method in my listview and its scrolling in the list but will make the list look weird by clipping items.

Im trying to refresh the list by using things like

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

But for no good results: see image after I scroll down 150 px

enter image description here

There are more entries below data5 but they have been clipped.

code:

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;
}





}
joynes
  • 1,627
  • 4
  • 16
  • 19

3 Answers3

2

Solved by not using scrollBy but

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

see Maintain/Save/Restore scroll position when returning to a ListView

Community
  • 1
  • 1
joynes
  • 1,627
  • 4
  • 16
  • 19
1
adapter.notifyDataSetChanged();
Samir Mangroliya
  • 39,918
  • 16
  • 117
  • 134
0

for me joyne's answer worked for normal listviews but failed with ones with massive headers, hence i used this one which worked even with massive headers

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