Android ListView scrollby 剪辑列表中的项目

Posted

技术标签:

【中文标题】Android ListView scrollby 剪辑列表中的项目【英文标题】:Android ListView scrollby clips items in the list 【发布时间】:2012-02-22 20:25:03 【问题描述】:

我试图在我的列表视图中使用 scrollBy 方法并在列表中滚动,但会通过剪切项目使列表看起来很奇怪。

我试图通过使用类似的东西来刷新列表

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

但效果不佳:向下滚动 150 像素后查看图片

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;







【问题讨论】:

【参考方案1】:

不使用scrollBy而是解决

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

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

【讨论】:

【参考方案2】:
adapter.notifyDataSetChanged();

【讨论】:

【参考方案3】:

对我来说,joyne 的答案适用于普通列表视图,但对于带有大量标题的列表视图却失败了,因此我使用了这个即使有大量标题也有效的方法

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

【讨论】:

以上是关于Android ListView scrollby 剪辑列表中的项目的主要内容,如果未能解决你的问题,请参考以下文章

Android scrollTo() scrollBy() Scroller解说及应用

图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

如何在android中滚动视图?

图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()