我有以下问题:
我的Android应用程序中有一个ListView。此列表视图的每个项目都有2个TextView(例如,左和右)。我希望实现以下效果:左侧TextView始终可见,只有当TextView位于屏幕的上半部分时才可见,并且当用户滚动ListView时其可见性会发生变化。
+-------+
|l1 r1|
|l2 r2| <= initial positions, r3 and r4 aren't displayed
|l3 |
|l4 |
+-------+
+-------+
|l3 r3|
|l4 r4| <= the user has scrolled the list up, r3 and r4 are displayed
|l5 |
|l5 |
+-------+
如何达到这样的效果?
我的ListView使用从BaseAdapter扩展的适配器,适配器看起来像
public class ItemAdapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
private List<Item> items;
....
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if (view == null) {
view = lInflater.inflate(R.layout.sample_list_item_view, viewGroup, false);
}
Item item = items.get(i);
((TextView) view.findViewById(R.id.l)).setText(item.key);
((TextView) view.findViewById(R.id.r)).setText(item.value);
return view;
}
}
我很高兴能够在getView()中更改右侧TextView的可见性,但滚动列表时不会调用此方法。
答案 0 :(得分:0)
我理解BaseAdapter的方式,只有在Android创建要在屏幕上显示的项目时才会调用getView()方法。如果该项目已在屏幕上,则不会调用getView()。
答案 1 :(得分:0)
找到了解决方案。
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
for (int index = 0; index < i1; index++) {
View child = listView.getChildAt(index);
if (child != null) {
int[] out = new int[2];
child.getLocationOnScreen(out);
int alpha = (800 - out[1]);
if (alpha < 0) alpha = 0;
if (alpha > 255) alpha = 255;
((TextView) child.findViewById(R.id.r)).setTextColor(Color.argb(alpha, 60, 60, 60));
}
}
}
});