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;    }}

大功告成

效果图如下

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

原创粉丝点击