当点击一个button或者是其它view时对应的item滑到顶部

需求:当点击一个button或者是其它view时,使得对应的listview的item自动滑动屏幕的顶部、、、、、

思路:利用了ScrollView嵌套ListView,然后ListView嵌套了ListView来实现。

注意:因为分装的方法中用了listview 所以适配器中的视图用了listview嵌套了listview。

主页面的代码:

public class MainActivity extends AppCompatActivity {
    private ListView myListView;
    private ScrollView myScrollView;

    private List<String> data = new ArrayList<>();
    private ListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myListView = ((ListView) findViewById(R.id.lv));
        myScrollView = ((ScrollView) findViewById(R.id.sv));

        initData();

    }

    private void initData() {
        data.add("好好学习,天天向上");
        data.add("今天是个号日子");
        data.add("尼玛,你说的是真的吗");

        adapter = new ListAdapter(this,data);
        myListView.setAdapter(adapter);
    }

    public void onclicl(View view) {
        switch (view.getId()){
            //当点击 a 这个button按钮的时候
            case R.id.a:
                Log.e("flag","aaaaaaaaaaaaaaaa");
                myScrollView.smoothScrollTo(0,adapter.getViewLocation(myScrollView,0));
                break;
            //当点击 b 这个button按钮的时候
            case R.id.b:
                Log.e("flag","bbbbbbbbbbbbbbbb");
                myScrollView.smoothScrollTo(0,adapter.getViewLocation(myScrollView,1));
                break;
            //当点击 c 这个button按钮的时候
            case R.id.c:
                Log.e("flag","ccccccccccccc");
                myScrollView.smoothScrollTo(0,adapter.getViewLocation(myScrollView,2));
                break;
        }
    }
}

             适配器中的代码:

public class ListAdapter extends BaseAdapter {
    private Context context;
    private List<String> data = new ArrayList<>();
    private HashMap<Integer,Integer> mapHeights = new HashMap<>();
    public ListAdapter(Context context, List<String> data) {
        this.context = context;
        this.data = data;
    }

    @Override
    public int getCount() {
        return 3;
    }

    @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) {
        final  ViewHolder holder;
        if (convertView == null){
            convertView = LayoutInflater.from(context).inflate(R.layout.item_baike, parent, false);
            holder = new ViewHolder();
            holder.myListView = (ListView) convertView.findViewById(R.id.myListView);
            convertView.setTag(holder);
        }else {
            holder = ((ViewHolder) convertView.getTag());
        }
        //利用了listview嵌套listview  外边大的ListView的position
        if (position==0){
            OneAdapter oneAdapter = new OneAdapter(context,data);
            holder.myListView.setAdapter(oneAdapter);
            //当position是0的时候,计算他的高度
            mapHeights.put(position,setListViewHeightBasedOnChildren(holder.myListView));
        }else if (position==1){
            OneAdapter oneAdapter = new OneAdapter(context,data);
            holder.myListView.setAdapter(oneAdapter);
            mapHeights.put(position,setListViewHeightBasedOnChildren(holder.myListView));
        }else {
            OneAdapter oneAdapter = new OneAdapter(context,data);
            holder.myListView.setAdapter(oneAdapter);
            mapHeights.put(position,setListViewHeightBasedOnChildren(holder.myListView));
        }

        return convertView;
    }


    private static class ViewHolder {
        ListView myListView;
    }

    public int getViewLocation(ScrollView scrollView, int pos){
        int height = 0;
        // 遍历全部高度,到达对应的索引
        for (int i = 0; i < pos; i++){
            Integer integer = mapHeights.get(i);
            if (integer != null){
                height += integer;
            }
        }
        return getLinearViewY(scrollView) + height;
    }
    private int getLinearViewY(ScrollView scrollView){
        if (scrollView == null){
            return 0;
        }
        //
        LinearLayout rView = (LinearLayout) scrollView.getChildAt(0);
        for (int i = 0, size = rView.getChildCount(); i < size; i++){
            View view = rView.getChildAt(i);
            if (view instanceof YListView){
                // return view.getScrollY();
                return (int) view.getY();
            }
        }
        return 0;
    }
    public static int setListViewHeightBasedOnChildren(ListView listView) {
        //获取listview对应的adapter
        android.widget.ListAdapter listAdapter = listView.getAdapter(); //item的高度
        if (listAdapter == null) {
            return 0;
        }

        int totalHeight = 0;
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
            // listAdapter.getCount()返回数据项的数目
            View listItem = listAdapter.getView(i, null, listView);
            // 计算子项View 的宽高
            listItem.measure(0, 0);
            // 统计所有子项的总高度
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        // listView.getDividerHeight()获取子项间分隔符占用的高度
        // params.height最后得到整个ListView完整显示需要的高度
        listView.setLayoutParams(params);
        // 返回总体高度
        return params.height;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值