Android--自定义控件---自动分页的GridView
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Android--自定义控件---自动分页的GridView,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含13124字,纯文字阅读大概需要19分钟。
内容图文
![Android--自定义控件---自动分页的GridView](/upload/InfoBanner/zyjiaocheng/1081/3a215c1cd27b4fb594ca8bf3e95f76d2.jpg)
最近,根据项目需求,需要一个能够自动分页的导航,所以便自定义了一个自动分页的GridView。
思路:继承RelativeLayout,然后在里面放了一个viewpager和一个GridView。。。我也不会说,还是直接上代码吧
先看看你效果图,分别是2行3列和1行3列(有自定义属性,可以自己定义几行几列)
接下来直接看源代码(很简单)
1 package custom.widget; 2 3 import android.annotation.TargetApi; 4 import android.content.Context; 5 import android.content.res.TypedArray; 6 import android.os.Build; 7 import android.support.v4.view.PagerAdapter; 8 import android.support.v4.view.ViewPager; 9 import android.util.AttributeSet; 10 import android.view.MotionEvent; 11 import android.view.View; 12 import android.view.ViewGroup; 13 import android.widget.AbsListView; 14 import android.widget.AdapterView; 15 import android.widget.BaseAdapter; 16 import android.widget.GridView; 17 import android.widget.LinearLayout; 18 import android.widget.RadioButton; 19 import android.widget.RadioGroup; 20 import android.widget.RelativeLayout; 21 22 import com.newair.automaticpagedemo.R; 23 24 import java.util.ArrayList; 25 import java.util.List; 26 27 /** 28 * Created by ouhimehime on 16/5/4. 29 * ----------自动分页的GridView---------- 30 */ 31 public class AutoMaticPageGridView extends RelativeLayout { 32 33//分页所用 34private ViewPager viewPager; 35//导航点 36private RadioGroup radioGroup; 37//自定义行数 38privateint lines = 0; 39//自定义列数 40privateint column = 0; 41//自定义按钮样式 42privateint btn_res; 43//自定义属性是否显示导航点 44privateboolean btn_isvisible; 45//页数-需要动态计算 46privateint pages = 0; 47//适配器 48private BaseAutoAdapter adapter; 49//Item的高度 50privateint itemHeight = 0; 51 52//点击事件的接口 53publicinterface OnItemClickCallBack { 54void OnItemClicked(int position, Object object); 55 } 56 57private OnItemClickCallBack onItemClickCallBack; 58 59publicvoid setOnItemClickListener(OnItemClickCallBack onItemClickCallBack) { 60this.onItemClickCallBack = onItemClickCallBack; 61 } 62 63 64public AutoMaticPageGridView(Context context) { 65super(context); 66 } 67 68public AutoMaticPageGridView(Context context, AttributeSet attrs) { 69super(context, attrs); 70 init(context, attrs); 71 } 72 73public AutoMaticPageGridView(Context context, AttributeSet attrs, int defStyleAttr) { 74super(context, attrs, defStyleAttr); 75 init(context, attrs); 76 } 77 78 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 79public AutoMaticPageGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 80super(context, attrs, defStyleAttr, defStyleRes); 81 init(context, attrs); 82 } 83 84 85//初始化控件 86privatevoid init(Context context, AttributeSet attrs) { 87//加载自定义属性 88final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.AutoMaticPageGridView); 89 lines = array.getInteger(R.styleable.AutoMaticPageGridView_auto_lines, 1);//行数 90 column = array.getInteger(R.styleable.AutoMaticPageGridView_auto_column, 4);//列数 91 btn_res = array.getResourceId(R.styleable.AutoMaticPageGridView_auto_button, 0);//btn的样式 92 btn_isvisible = array.getBoolean(R.styleable.AutoMaticPageGridView_auto_button_visible, true);//默认true 93 array.recycle(); 94//分页用 95 viewPager = new ViewPager(context); 96 viewPager.setLayoutParams(new LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 97 RelativeLayout.LayoutParams.MATCH_PARENT)); 98 addView(viewPager); 99//导航点用100 radioGroup = new RadioGroup(context); 101 radioGroup.setOrientation(LinearLayout.HORIZONTAL); 102 RelativeLayout.LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 103 params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 104 params.addRule(RelativeLayout.CENTER_IN_PARENT); 105 radioGroup.setLayoutParams(params); 106 addView(radioGroup); 107//如果不显示的话就隐藏108if (!btn_isvisible) { 109 radioGroup.setVisibility(GONE); 110 } 111 } 112113//设置适配器114publicvoid setAdapter(BaseAutoAdapter baseAdapter) { 115this.adapter = baseAdapter; 116//计算页数117if ((adapter.getCounts() / (column * lines)) > 0) { 118 pages = (adapter.getCounts() / (column * lines)) + 1; //多一页119 } else { 120 pages = adapter.getCounts(); 121 } 122//添加radioButton123 addRadioButton(pages); 124this.post(new Runnable() { 125 @Override 126publicvoid run() { 127 itemHeight = getMeasuredHeight() / lines; 128//显示viewpager129 ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getContext()); 130 viewPager.setAdapter(viewPagerAdapter); 131//设置联动132 initLinkAgeEvent(); 133 } 134 }); 135 } 136137//添加RadioButton138privatevoid addRadioButton(int pages) { 139for (int i = 0; i < pages; i++) { 140 RadioButton radioButton = new RadioButton(getContext()); 141 radioButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 142 LinearLayout.LayoutParams.WRAP_CONTENT)); 143 radioButton.setPadding(5, 5, 5, 5);//间距144 radioButton.setId(i);//设置Id,方便联动145 radioButton.setClickable(false); 146if (btn_res != 0) { //设置按钮样式147 radioButton.setButtonDrawable(btn_res); 148 } 149 radioGroup.addView(radioButton); 150 } 151 } 152153//给当前页计算数据数量154private List<View> getAdapterData(int position) { 155 List<View> cerrent = new ArrayList<>(); 156if (position == pages - 1) { //如果等于最后一页157for (int i = position * (lines * column); i < adapter.getCounts(); i++) { 158 cerrent.add(adapter.getItemView(i, null)); 159 } 160 } else { 161for (int i = position * (lines * column); i < position * (lines * column) + (lines * column); i++) { 162 cerrent.add(adapter.getItemView(i, null)); 163 } 164 } 165return cerrent; 166 } 167168//ViewPager适配器169privateclass ViewPagerAdapter extends PagerAdapter { 170171private Context context; 172173public ViewPagerAdapter(Context context) { 174this.context = context; 175 } 176177 @Override 178publicint getCount() { 179return pages; 180 } 181182 @Override 183publicboolean isViewFromObject(View view, Object object) { 184return view == object; 185 } 186187 @Override 188public Object instantiateItem(ViewGroup container, int position) { 189 CustomGridView gridView = new CustomGridView(context); 190 gridView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, 191 AbsListView.LayoutParams.MATCH_PARENT)); 192 gridView.setNumColumns(column);//设置列数193 gridView.setColumnWidth(GridView.AUTO_FIT); 194 GridViewAdapter adapter = new GridViewAdapter(getAdapterData(position), position); 195 gridView.setAdapter(adapter); 196 container.addView(gridView); 197 gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 198 @Override 199publicvoid onItemClick(AdapterView<?> parent, View view, int position, long id) { 200 GridViewAdapter adapter1 = (GridViewAdapter) parent.getAdapter(); 201 onItemClickCallBack.OnItemClicked(adapter1.currentPage * (lines * column) + position, view); 202 } 203 }); 204return gridView; 205 } 206207 @Override 208publicvoid destroyItem(ViewGroup container, int position, Object object) { 209 container.removeView((GridView) object); 210 } 211 } 212213//GridView的适配器214privateclass GridViewAdapter extends BaseAdapter { 215216private List<View> views;//数据量217publicint currentPage; //当前页218219public GridViewAdapter(List<View> counts, int currentPage) { 220this.views = counts; 221this.currentPage = currentPage; 222 } 223224 @Override 225publicint getCount() { 226return views.size(); 227 } 228229 @Override 230public Object getItem(int position) { 231return position; 232 } 233234 @Override 235publiclong getItemId(int position) { 236return position; 237 } 238239 @Override 240public View getView(int position, View convertView, ViewGroup parent) { 241if (convertView == null) { 242 convertView = views.get(position); 243 convertView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeight)); 244 } 245return convertView; 246 } 247248 } 249250//自定义GridView,禁止滑动251privateclass CustomGridView extends GridView { 252253public CustomGridView(Context context) { 254super(context); 255 } 256257public CustomGridView(Context context, AttributeSet attrs) { 258super(context, attrs); 259 } 260261public CustomGridView(Context context, AttributeSet attrs, int defStyleAttr) { 262super(context, attrs, defStyleAttr); 263 } 264265 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 266public CustomGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 267super(context, attrs, defStyleAttr, defStyleRes); 268 } 269270 @Override 271publicboolean dispatchTouchEvent(MotionEvent ev) { 272if (ev.getAction() == MotionEvent.ACTION_MOVE) { 273returntrue;//禁止GridView进行滑动274 } 275returnsuper.dispatchTouchEvent(ev); 276 } 277 } 278279//初始化联动联动事件280privatevoid initLinkAgeEvent() { 281//默认选中第一个282 viewPager.setCurrentItem(0); 283 radioGroup.check(radioGroup.getChildAt(0).getId()); 284//滑动换页事件285 viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 286 @Override 287publicvoid onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 288289 } 290291 @Override 292publicvoid onPageSelected(int position) { 293 radioGroup.check(position); 294 } 295296 @Override 297publicvoid onPageScrollStateChanged(int state) { 298299 } 300 }); 301 } 302303 }
这个组件也有个适配器,很简单,就是定义了几个抽象方法
package custom.widget; import android.view.View; import android.view.ViewGroup; /** * Created by ouhimehime on 16/5/4. * -----适配器=------ */ public abstract class BaseAutoAdapter { public abstract int getCounts(); //返回数据数量publicabstract Object getItem(int position); //当前Item的数据publicabstract View getItemView(int position, ViewGroup parent); //返回Item的布局 }
还自定义了一部分属性,方便使用起来好控制
<? xml version="1.0" encoding="utf-8" ?> < resources > < declare-styleable name ="AutoMaticPageGridView" > <!-- 行数 --> < attr name ="auto_lines" format ="integer" /> <!-- 列数 --> < attr name ="auto_column" format ="integer" /> <!-- button的样式 --> < attr name ="auto_button" format ="reference" /> <!-- 是否显示导航点 --> < attr name ="auto_button_visible" format ="boolean" /> </ declare-styleable > </ resources >
-----------------------------------------------------------------------以上就是源代码了-----------------------------------------------------------------------------
下面是如何使用:(就当做一个控件来使用就可以)
①、先看布局文件XML,控件的高度是可以自己定义的
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" xmlns:auto ="http://schemas.android.com/apk/res-auto" xmlns:tools ="http://schemas.android.com/tools" android:layout_width ="match_parent" android:layout_height ="match_parent" android:orientation ="vertical" tools:context =".MainActivity" > < custom.widget.AutoMaticPageGridView android:id ="@+id/automatic" android:layout_width ="match_parent" android:layout_height ="0dp" android:layout_weight ="1" auto:auto_button ="@drawable/btn_status_style" auto:auto_column ="3" auto:auto_lines ="2" /> < LinearLayout android:layout_width ="match_parent" android:layout_height ="0dp" android:layout_weight ="2" /> </ LinearLayout >
②、再看适配器代码,适配器需要继承BaseAutoAdapter
package adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.newair.automaticpagedemo.R; import java.util.List; import custom.widget.BaseAutoAdapter; /** * Created by ouhimehime on 16/5/4. * ------------适配器------------ */ public class MyAutoMaticPageAdapter extends BaseAutoAdapter { private Context context; private List<Integer> myData; public MyAutoMaticPageAdapter(Context context, List<Integer> myData) { this.context = context; this.myData = myData; } @Override publicint getCounts() { return myData.size(); } @Override public Object getItem(int position) { return myData.get(position); } @Override public View getItemView(int position, ViewGroup parent) { View view = LayoutInflater.from(context).inflate(R.layout.item_layout, null); return view; } }
③、再看主布局代码,为了方便我就随便放了放了10条数据
package com.newair.automaticpagedemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import adapter.MyAutoMaticPageAdapter; import custom.widget.AutoMaticPageGridView; public class MainActivity extends AppCompatActivity { private AutoMaticPageGridView automatic; private MyAutoMaticPageAdapter adapter; private List<Integer> myData; @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); automatic = (AutoMaticPageGridView) findViewById(R.id.automatic); myData = new ArrayList<>(); for (int i = 0; i < 10; i++) { myData.add(i); } adapter = new MyAutoMaticPageAdapter(this, myData); automatic.setAdapter(adapter); //点击事件 automatic.setOnItemClickListener(new AutoMaticPageGridView.OnItemClickCallBack() { @Override publicvoid OnItemClicked(int position, Object object) { Toast.makeText(MainActivity.this, position + "--", Toast.LENGTH_SHORT).show(); } }); } }
------------------------------------------------------------------------以上是如何使用----------------------------------------------------------------------------------
以上就是自己定义了一个自动分页的控件,写的不好,希望各位见谅。
原文:http://www.cnblogs.com/819158327fan/p/5461111.html
内容总结
以上是互联网集市为您收集整理的Android--自定义控件---自动分页的GridView全部内容,希望文章能够帮你解决Android--自定义控件---自动分页的GridView所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。