PullToRefresh+TabLayout+DrawerLayout+无限轮播集成使用
来源:互联网 发布:淘宝卖家手机登录 编辑:程序博客网 时间:2024/06/08 02:43
进入应用获取网络图片进行轮播,设置按钮跳转个另一个Login界面,用Drawerlayout设置能够侧拉同时用Tablayout设置横滑,整个界面用PullToRefresh设置下拉上提刷新图片缓存
先写第一个页面图片轮播布局
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/vp" /> //这个Linerlayout就是到时候放入小圆点 <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="40dp" android:layout_alignParentBottom="true" android:gravity="center" android:id="@+id/ll" /> <Button android:layout_width="match_parent" android:id="@+id/bt" android:text="跳转啊" android:layout_above="@+id/ll" android:layout_height="50dp" /></RelativeLayout>
上面布局用viewpage进行轮播设置一个跳转按钮
轮播有一个比较ex的地方就是网络获取图片轮播底下的小圆点不知道有多少不能写固定布局 那么先写两个小圆点的出发
接下来就是小圆点布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <View android:layout_width="8dp" android:layout_height="8dp" android:layout_margin="3dp" android:id="@+id/dot" android:background="@drawable/dot_normal" /></LinearLayout>
接下来就是代码喽
public class MainActivity extends AppCompatActivity {//网络获取素材 private static final String str = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10"; private ViewPager vp; private LinearLayout ll; private int i = 0; private int current = 0 ; private int old_dot = 0; private Button bt; //定义一个放置小圆点的集合 private ArrayList<View> viewArrayList = new ArrayList<View>(); //使用handler进行圆点的设置 private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); vp.setCurrentItem(msg.what); viewArrayList.get(old_dot).setBackgroundResource(R.drawable.dot_normal); viewArrayList.get(msg.what%viewArrayList.size()).setBackgroundResource(R.drawable.dot_focused); old_dot = msg.what%viewArrayList.size(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vp = (ViewPager) findViewById(R.id.vp); ll = (LinearLayout) findViewById(R.id.ll); bt = (Button) findViewById(R.id.bt); //用异步进行网络材料的解析吧 new AsyncTask<String, Integer, String>() { @Override protected String doInBackground(String... params) { String s = params[0]; //这个HttpUrl是自己定义的httpurl方法下方有代码 String getpp = new HttpUrl().getpp(s); return getpp; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); //运用Gson进行解析 Bena bena = new Gson().fromJson(s, Bena.class); List<News> newslist = bena.getNewslist(); //适配器 同上 下方有代码 MyAdapter myAdapter = new MyAdapter(newslist, MainActivity.this); vp.setAdapter(myAdapter); //设置图片轮播的第一张 vp.setCurrentItem(newslist.size()*100); //设置小圆点的数量以及加载小圆点 for (int g = 0 ; g <newslist.size() ; g++){ View view = View.inflate(MainActivity.this,R.layout.view_item,null); View doc = view.findViewById(R.id.dot); viewArrayList.add(doc); ll.addView(view); } //让小圆点从第一开始动 viewArrayList.get(0).setBackgroundResource(R.drawable.dot_focused); //定义i获取图片位置 i = vp.getCurrentItem(); //线程进行轮播 new Thread(){ @Override public void run() { while (true){ try { sleep(3000); //new一个Message存储i的位置 Message obtain = Message.obtain(); obtain.what = i++; handler.sendMessage(obtain); } catch (Exception e) { e.printStackTrace(); } } } }.start(); //跳转 final Intent intent = new Intent(MainActivity.this, Login.class); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(intent); } }); //同时设置自动跳转 两者取其一个就可 new Thread(){ @Override public void run() { try { sleep(9000); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } }.start(); } }.execute(str); }}
HttpUrl方法
public class HttpUrl { public String getpp(String ss){ URL url = null; HttpURLConnection httpURLConnection = null; String pp = ""; try { url= new URL(ss); httpURLConnection = (HttpURLConnection) url.openConnection(); int code = httpURLConnection.getResponseCode(); if (code == 200){ InputStream inputStream = httpURLConnection.getInputStream(); byte [] b = new byte[1024]; int len = 0; while ((len = inputStream.read(b))!=-1){ pp += new String(b,0,len); } inputStream.close(); } } catch (Exception e) { e.printStackTrace(); } return pp; }}
适配器
适配器图片进行缓存的话需要建一个Myapp继承Application
public class MyAdapter extends PagerAdapter { private List<News> list; private Context context; public MyAdapter(List<News> list, Context context) { this.list = list; this.context = context; } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(context); DisplayImageOptions option = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .bitmapConfig(Bitmap.Config.RGB_565) .imageScaleType(ImageScaleType.EXACTLY) .build(); ImageLoader.getInstance().displayImage(list.get(position%list.size()).getPicUrl(),imageView,option); container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); }}
Myapp
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); File file = StorageUtils.getOwnCacheDirectory(getApplicationContext(), "UniversalImageLoader/Cache"); DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).build(); ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(getApplicationContext()) .defaultDisplayImageOptions(options) .memoryCache(new LRULimitedMemoryCache(12*1024*1024)) .memoryCacheSize(12*1024*1024) .diskCache(new UnlimitedDiskCache(file)) .threadPriority(Thread.NORM_PRIORITY - 2) .denyCacheImageMultipleSizesInMemory() .diskCacheFileNameGenerator(new Md5FileNameGenerator()) .tasksProcessingOrder(QueueProcessingType.LIFO) .writeDebugLogs() .build(); ImageLoader.getInstance().init(configuration); }}
设置Myapp的manifest
需要在application 里面写上一个android:name=”.MyApp”
第一个界面完事了
跳转过去就需要设置Drawerlayout和Tablayout的布局了
大布局就需要用Drawerlayout进行罩住
<?xml version="1.0" encoding="utf-8"?><android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/activity_login" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/ll" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="match_parent"> //横滑布局 <android.support.design.widget.TabLayout android:id="@+id/tab" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="@color/red" app:tabMode="scrollable" app:tabSelectedTextColor="@color/red" app:tabTextColor="@color/black"/> <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> //侧滑数据放入Listview <ListView android:id="@+id/lv" android:divider="#f00" android:background="#fff" android:dividerHeight="1dp" android:layout_gravity="start" android:layout_width="200dp" android:layout_height="match_parent"/></android.support.v4.widget.DrawerLayout>
接着是Login的主页面代码
public class Login extends AppCompatActivity { private DrawerLayout drawerLayout; private TabLayout tab; private ViewPager vp; private ArrayList<String> list; private ListView lv; private LinearLayout ll; //这里面是横排的条目 private String[] channels = {""}; //这是横排条目的地址 private String[] urlS = {"}; //存放fragment的集合 private List<ChannelFragment> fragments = new ArrayList<>(); private LayoutInflater inflater; private ChannelFragment channelFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); //获取组件 drawerLayout = (DrawerLayout) findViewById(R.id.activity_login); tab = (TabLayout) findViewById(R.id.tab); vp = (ViewPager) findViewById(R.id.vp); lv = (ListView) findViewById(R.id.lv); ll = (LinearLayout) findViewById(R.id.ll); //侧滑方法 initDrawer(); //横排方法 initTablayout(); }
侧滑我用的是自定义集合写入数据只是查看点击没用
private void initDrawer() { list = new ArrayList<>(); list.add("搜索"); list.add("收藏"); list.add("消息"); list.add("离线"); list.add("活动"); lv.setAdapter(new BaseAdapter() { @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = View.inflate(Login.this,R.layout.lv_item,null); TextView Lv_tv = (TextView) convertView.findViewById(R.id.Lv_tv); Lv_tv.setText(list.get(position)); return convertView; } }); //给LinearLayout设置监听 ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //打开侧滑 drawerLayout.openDrawer(lv); } }); } }); } 设置横排 private void initTablayout() { //循环获取网络地址发送给fragment 下文新建一个fragment接收 for (int i = 0 ; i<channels.length ; i++){ channelFragment = new ChannelFragment(); Bundle bundle = new Bundle(); bundle.putString("url",urlS[i]); channelFragment.setArguments(bundle); fragments.add(channelFragment); tab.addTab(tab.newTab().setText(channels[i])); } 适配 FragmentManager manager = getSupportFragmentManager(); MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(manager, fragments); vp.setAdapter(pagerAdapter); tab.setupWithViewPager(vp); tab.setTabsFromPagerAdapter(pagerAdapter); } //适配器 class MyFragmentPagerAdapter extends FragmentPagerAdapter{ private List<ChannelFragment> fragments; public MyFragmentPagerAdapter(FragmentManager fm, List<ChannelFragment> fragments) { super(fm); this.fragments = fragments; } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } 这个方法自己写出 @Override public CharSequence getPageTitle(int position) { return channels[position]; } }}
channelFragment类
public class ChannelFragment extends Fragment{ private String news_url; private View view; private PullToRefreshListView mpull; private List<News> newslist; private MyAdapter2 adapter2; private Person person; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //接收Login发来的url地址 Bundle bundle = getArguments(); news_url = (String) bundle.get("url"); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { person = new Person(getActivity()); //加载布局 下文有PullToRefresh的布局 view = inflater.inflate(R.layout.lva,null); //下拉上提的方法 initView(); //刚进入显示 initDate(); return view; } private void initDate() { xiala(); } private void initView() { mpull = (PullToRefreshListView) view.findViewById(R.id.pull_refresh_list); mpull.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { //设置下拉时的时间显示 String label= DateUtils.formatDateTime(getActivity().getApplicationContext(), System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); //更新label显示 refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); xiala(); } }); mpull.setOnLastItemVisibleListener(new PullToRefreshBase.OnLastItemVisibleListener() { @Override public void onLastItemVisible() { shangti(); } }); } 同样是异步进行解析 public void xiala(){ new AsyncTask<String, Integer, String>() { @Override protected String doInBackground(String... params) { String s = params[0]; String getpp = new HttpUrl().getpp(s); return getpp; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Bena bena = new Gson().fromJson(s, Bena.class); newslist = bena.getNewslist(); //添加数据裤 for (int i = 0 ; i<newslist.size() ; i++){ String title = newslist.get(i).getTitle(); String picUrl = newslist.get(i).getPicUrl(); person.add(title,picUrl); } 适配器在下面 adapter2 = new MyAdapter2(getActivity(), newslist); mpull.setAdapter(adapter2); mpull.onRefreshComplete(); } }.execute(news_url); } public void shangti(){ new AsyncTask<String, Integer, String>() { @Override protected String doInBackground(String... params) { String s = params[0]; String getpp = new HttpUrl().getpp(s); return getpp; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Bena bena = new Gson().fromJson(s, Bena.class); newslist.addAll(bena.getNewslist()); adapter2.notifyDataSetChanged(); mpull.onRefreshComplete(); } }.execute(news_url); }}
适配器
public class MyAdapter2 extends BaseAdapter { private Context context; private List<News> list; public MyAdapter2(Context context, List<News> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { DisplayImageOptions option = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .bitmapConfig(Bitmap.Config.RGB_565) .imageScaleType(ImageScaleType.EXACTLY) .build(); convertView = View.inflate(context,R.layout.lv_tv_im,null); TextView tv = (TextView) convertView.findViewById(R.id.tv); ImageView iv8 = (ImageView) convertView.findViewById(R.id.iv8); tv.setText(list.get(position).getTitle()); ImageLoader.getInstance().displayImage(list.get(position).getPicUrl(),iv8,option); return convertView; }}
适配器布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/pull_refresh_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:cacheColorHint="#000000" android:divider="#19000000" android:dividerHeight="4dp" android:fadingEdge="none" android:fastScrollEnabled="false" android:footerDividersEnabled="false" android:headerDividersEnabled="false" android:smoothScrollbar="true" ptr:ptrAnimationStyle="rotate" ptr:ptrHeaderTextColor="#ffffff" ptr:ptrHeaderSubTextColor="#00ffff" ptr:ptrHeaderBackground="@null" /></LinearLayout>
适配器子布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageView android:id="@+id/iv8" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
添加到数据库吧
上文的下拉中写了for循环添加数据库
没有查询
//新建一个SQlitepublic class SqliteHelp extends SQLiteOpenHelper { public SqliteHelp(Context context){ super(context,"Dd",null,1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table user (id integer primary key autoincrement , picUrl varchar(20),title varchar(20))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}//再建一个Personpublic class Person { private final SQLiteDatabase liteDatabase; public Person(Context context){ SqliteHelp sqliteHelp = new SqliteHelp(context); liteDatabase = sqliteHelp.getWritableDatabase(); } public void add(String picUrl,String title){ liteDatabase.execSQL("insert into user(picUrl,title) values (?,?)",new Object[]{picUrl,title}); } public List<News> file(){ Cursor rawQuery = liteDatabase.rawQuery("select * from user", null); ArrayList<News> list = new ArrayList<>(); while(rawQuery.moveToNext()){ String title = rawQuery.getString(rawQuery.getColumnIndex("title")); String picUrl = rawQuery.getString(rawQuery.getColumnIndex("picUrl")); News news = new News(); news.setPicUrl(picUrl); news.setTitle(title); list.add(news); } return list; }}
大功告成
效果图如下
阅读全文
3 0
- PullToRefresh+TabLayout+DrawerLayout+无限轮播集成使用
- DrawerLayout侧滑+TabLayout横向滑动+ViewPager+轮播+PullToRefresh
- 侧拉+pullToRefresh+无限轮播+tabLayout+fragment
- 侧滑+PullToRefresh+无限轮播
- 无限轮播+pulltorefresh刷新
- PullToRefresh+Banner无限轮播
- PullToRefresh+TabLayout+侧滑菜单栏+无限轮播小圆点+Fragment多条目+收藏网页数据到SQLite数据库
- 练习一(轮播+侧滑+TabLayout+PullTorefresh)
- DrawerLayout+TabLayout+ViewPager+RadioButton+Fragment+pullToRefresh+ImageLoader
- Tablayout左右滑动和Banner无限轮播的配合使用
- PullToRefresh刷新的相关代码结合无限轮播
- pullToRefresh+网络监听+多条目+ViewPager无限轮播
- 侧拉 横向滑动tablayout 无限轮播
- 无限轮播的使用
- ConvenientBanner 无限轮播使用
- PullToRefresh,fragment与TabLayout使用
- lastmonthexam——DrawerLayout+TabLayout+ViewPager+PullToRefresh+Fragment+TypeTkken
- TabLayout和DrawerLayout结合使用
- android 圆角边框 textview
- 静态方法
- unity 优化方案
- 么是github
- GridView无条目部分设置点击事件
- PullToRefresh+TabLayout+DrawerLayout+无限轮播集成使用
- DrawerLayout的布局及实现2
- 剑指offer2
- 环信集成流程说明
- String类的不可变性及StringBuilder原理
- QMessageBox
- flume User Guide翻译-logging raw data / plugin
- 如何将eclipse改成英文版
- java 注解的作用及使用方法详解