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

来源:互联网 发布:mac搜狐视频怎么缓存 编辑:程序博客网 时间:2024/05/17 03:13

需求:当点击一个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;    }}


阅读全文
1 0
原创粉丝点击