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 View的scrollTo(),scrollBy(),getScrollX(), getScrollY()