根据屏幕位置更新ListView项目外观

时间:2017-07-20 13:07:02

标签: android listview

我有以下问题:

我的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的可见性,但滚动列表时不会调用此方法。

2 个答案:

答案 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));
                }
            }
        }
    });