1. 程式人生 > >簡單基類抽取+http服務+上拉載入下拉重新整理

簡單基類抽取+http服務+上拉載入下拉重新整理

//BaseActivity

public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(initLayout());
        //初始化控制元件
        initView();
        //設定資料
        getNews();
    }
    /**
     * 設定佈局
     *
     * @return 佈局檔案
     */
    protected abstract int initLayout();

    /**
     * 初始化控制元件
     */
    protected abstract void initView();

    /**
     * 設定資料
     */
    protected abstract void getNews();
}

//主Activity

public  class MainActivity extends BaseActivity implements View.OnClickListener {

    private ViewPager view_pager;
    private ArrayList<Fragment> fragmentlist;
    private Button btn_1,btn_2,btn_3,btn_4,btn_5;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //建立集合
        fragmentlist = new ArrayList<>();
        OneFragment oneFragment = new OneFragment();
        TwoFragment twoFragment = new TwoFragment();
        ThreeFragment threeFragment = new ThreeFragment();
        FourFragment fourFragment = new FourFragment();
        FiveFragment fiveFragment = new FiveFragment();
        fragmentlist.add(oneFragment);
        fragmentlist.add(twoFragment);
        fragmentlist.add(threeFragment);
        fragmentlist.add(fourFragment);
        fragmentlist.add(fiveFragment);
        //設定監聽
        view_pager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int i) {
                return fragmentlist.get(i);
            }

            @Override
            public int getCount() {
                return fragmentlist.size();
            }
        });
        btn_1.setOnClickListener(this);
        btn_2.setOnClickListener(this);
        btn_3.setOnClickListener(this);
        btn_4.setOnClickListener(this);
        btn_5.setOnClickListener(this);
    }

    @Override
    protected int initLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void initView() {
        //初始化控制元件
        view_pager = findViewById(R.id.view_pager);
        btn_1 = findViewById(R.id.bnt_1);
        btn_2=findViewById(R.id.bnt_2);
        btn_3=findViewById(R.id.bnt_3);
        btn_4=findViewById(R.id.bnt_4);
        btn_5=findViewById(R.id.bnt_5);
        //初始化資料
        view_pager.setOffscreenPageLimit(4);
    }

    @Override
    protected void getNews() {
        //
    }

    @Override
    public void onClick(View v) {
         switch (v.getId()){
             case R.id.bnt_1:
                 view_pager.setCurrentItem(0);
                 break;
             case R.id.bnt_2:
                 view_pager.setCurrentItem(1);
                 break;
             case R.id.bnt_3:
                 view_pager.setCurrentItem(2);
                 break;
             case R.id.bnt_4:
                 view_pager.setCurrentItem(3);
                 break;
             case R.id.bnt_5:
                 view_pager.setCurrentItem(4);
                 break;
         }
    }
}

//BaseFragment

public abstract class BaseFragment extends Fragment {


    //view 建立完成回撥
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        initView(view);
        getDatas();
    }


    abstract void initView(View view);
    abstract void getDatas();
}

//ImageLoader

public class BaseApplication extends Application {
    private File file;
    private DiskCache diskCache;

    @Override
    public void onCreate() {
        super.onCreate();

        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            File rootSD = Environment.getExternalStorageDirectory();
            file = new File(rootSD, "imagefile");
            if (!file.exists()){
                file.mkdirs();
            }
        }

        try {
            diskCache = new LruDiskCache(file, new Md5FileNameGenerator(), 50 * 1024 * 1024);
        } catch (IOException e) {
            e.printStackTrace();
        }
        BitmapDisplayer displayer = new RoundedBitmapDisplayer(10);

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .bitmapConfig(Bitmap.Config.ARGB_4444)
                .displayer(displayer)
                .showImageForEmptyUri(R.mipmap.ic_launcher)
                .showImageOnFail(R.mipmap.ic_launcher)
                .showImageOnLoading(R.mipmap.ic_launcher)
                .build();

        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
                .diskCache(diskCache)
                .memoryCache(new LruMemoryCache(12*1024*1024))
                .threadPoolSize(3)
                .defaultDisplayImageOptions(options)
                .build();

        ImageLoader.getInstance().init(configuration);
    }
}

//http工具類

public class HttpUtil {
    public static String getHttpUrlConnection(String urlString){
        String result = "";
        try {
            URL url = new URL(urlString);
            //連線
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //優化
            //請求型別
            connection.setRequestMethod("GET");
            connection.setDoInput(true);
            connection.setDoOutput(false);
            connection.setUseCaches(false);
            //超時時間
            connection.setConnectTimeout(3000);
            connection.connect();

            //獲取狀態碼   200 成功
            if(connection.getResponseCode() == 200){
                InputStream is = connection.getInputStream();
                result = getInputStream(is);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    private static String getInputStream(InputStream is) {
        String result = "";
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int count = -1;
            byte[] buffer = new byte[1024];
            while ((count = is.read(buffer,0,buffer.length)) != -1){
                baos.write(buffer,0,count);
                baos.flush();
            }
            result = baos.toString();
            baos.close();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

//fragment碎片

public class TwoFragment extends BaseFragment {

    private ViewPager view_p;
    private TabLayout tab_layout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //初始化控制元件
        View view = inflater.inflate(R.layout.fragment_two, container, false);
        return view;
    }

    @Override
    void initView(View view) {
        view_p= view.findViewById(R.id.viewpager);
        tab_layout=view.findViewById(R.id.tab_layout);
        initVIewPager();
    }
    //初始DrawerLayout,ViewPager,Fragment
    private void initVIewPager() {
        ArrayList<Fragment> fragments = new ArrayList<>();
        fragments.add(new ListFragment());
        fragments.add(new ListtFragment());
        MyPagerAdapter adapter = new MyPagerAdapter(getFragmentManager());
        adapter.setFragments(fragments);
        view_p.setAdapter(adapter);
        //tabLayout指示器有幾個,建立幾個
        tab_layout.addTab(tab_layout.newTab());
        tab_layout.addTab(tab_layout.newTab());
        //是tablayout和VIewPager
        tab_layout.setupWithViewPager(view_p);
        //給TabLayout指示器設定文字,萬物從0開始
        tab_layout.getTabAt(0).setText("正在上映");
        tab_layout.getTabAt(1).setText("即將上映");
    }

    @Override
    void getDatas() {
      //
    }
}

//資料碎片

public class ListFragment extends BaseFragment {
    public static final String NEWS_URL="http://172.17.8.100/movieApi/movie/v1/findHotMovieList?count=10&page=";
    private int page=1;
    private boolean isLoadMore= false;
    public ArrayList<News.ResultBean> list;
    public MyAdpater adpater;
    private XListView list_one;
    private Handler handler = new Handler(){};
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
         View view=inflater.inflate(R.layout.fragment_list, container, false);
        return view;
    }

    @Override
    void initView(View view) {
         list_one=view.findViewById(R.id.list_viewone);
         //建立集合
        list=new ArrayList<>();
        adpater=new MyAdpater(list,getActivity());
        list_one.setAdapter(adpater);
        //設定上拉載入下拉重新整理
        list_one.setPullLoadEnable(true);
        list_one.setPullRefreshEnable(true);
        //設定Xlistview監聽事件
        list_one.setXListViewListener(new XListView.IXListViewListener() {
            @Override
            public void onRefresh() {
                if (page>1){
                    page--;
                }else {
                    Toast.makeText(getActivity(),"給不了親更多資訊了!!!",Toast.LENGTH_LONG).show();
                }
                isLoadMore=false;
                getDatas();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        list_one.stopRefresh();
                    }
                },1000);
                long l = System.currentTimeMillis();
                Date date = new Date(l);
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                list_one.setRefreshTime(format.format(date));
            }

            @Override
            public void onLoadMore() {
                page ++;
                isLoadMore = true;
                getDatas();
                News news = new News();
                ArrayList<News.ResultBean> result = (ArrayList<News.ResultBean>) news.getResult();
                if (result == null){
                    Toast.makeText(getActivity(),"沒有更多的資料了",Toast.LENGTH_SHORT).show();
                }
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        list_one.stopLoadMore();
                    }
                },1000);
            }
        });
    }

    @Override
    void getDatas() {
        new AsyncTask<String,Integer,String>(){
            @Override
            protected String doInBackground(String... strings) {
                return HttpUtil.getHttpUrlConnection(strings[0]);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                Gson gson = new Gson();
                News news = gson.fromJson(s, News.class);
                if (news != null){
                    ArrayList<News.ResultBean> result = (ArrayList<News.ResultBean>) news.getResult();
                    if (result != null){
                        if (!isLoadMore){
                            list.clear();
                        }
                        list.addAll(result);
                        adpater.notifyDataSetChanged();
                    }
                }
            }
        }.execute(NEWS_URL+page);
    }
}

//介面卡

public class MyAdpater extends BaseAdapter {
    private ArrayList<News.ResultBean> list;
    private Context context;

    public MyAdpater(ArrayList<News.ResultBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @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) {
        ViewHouder houder =null;
        if (convertView==null){
            houder = new ViewHouder();
            convertView=View.inflate(context ,R.layout.list_time,null);
            houder.img_view=convertView.findViewById(R.id.img_view);
            houder.name=convertView.findViewById(R.id.text_name);
            houder.title=convertView.findViewById(R.id.text_title);
            convertView.setTag(houder);
        }else {
            houder=(ViewHouder) convertView.getTag();
        }
        houder.name.setText(list.get(position).getName());
        houder.title.setText(list.get(position).getSummary());
        ImageLoader.getInstance().displayImage(list.get(position).getImageUrl(),houder.img_view);
        return convertView;
    }
    class ViewHouder{
        ImageView img_view;
        TextView name;
        TextView title;
    }
}
public class MyPagerAdapter extends FragmentPagerAdapter {
    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    private List<Fragment> mFragments;
    //建立一個方法,接收外界傳來的Fragment的集合
    public void setFragments(List<Fragment> fragments){
        mFragments =fragments;
    }
    @Override
    public Fragment getItem(int i) {
        Fragment fragment = mFragments.get(i);
        return fragment;
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }
}

//清單檔案

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bawei.activity">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name=".BaseApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".BaseActivity"></activity>
    </application>

</manifest>