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