The knowledge points involved are
1. Customize the control and rewrite the related methods of the control
accomplish:
(1) Channel management (with drag and drop, animation) Android high imitation channel management ---- NetEase, Toutiao, Tencent Video (GridView that can be dragged) with source code DEMO
(2) Each field in the news list is arranged according to time, and has a floating effect
(3) The city information in the city selection list is arranged according to the first letter, and has a floating effect
Note : (1) By rewriting GridView. (2) and (3) By rewriting the ListView, and then judging whether it is at the top through the interface, and changing the state, the code of the DEMO can be clearly understood
2. Use of SQLITE database
Implementation: Save the channel information set by the user
3. Animation jump method between activities
4. Knowledge about animation animation
Implementation: channel movement animation in channel management
5. WebView related knowledge and jsoup library to parse HTML
Realization: viewing and layout of news details, extraction of picture information. (This piece has not been studied in depth, the knowledge has been borrowed from others and put in)
6. Rewrite ViewPager and ImageView
Implementation: picture browsing and zooming in and out through gestures
7. Use of GestureDetector gesture class and OnGestureListener gesture monitoring class
Implementation: The news details page is closed according to gesture sliding
------------------------------ The main Activity is a picture and jumps after a few seconds
public class MainActivity extends AppCompatActivity { private TextView text_view; private Button button_tiyan; int time = 3; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0){ if (time > 0){ time --; text_view.setText(time + "秒后进入"); handler.sendEmptyMessageDelayed(0 , 1000); }else{ Intent intent = new Intent(MainActivity.this , SecondActivity.class); startActivity(intent); finish(); } } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text_view = (TextView) findViewById(R.id.text_view); button_tiyan = (Button) findViewById(R.id.button_tiyan);
//点击按钮跳转 button_tiyan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this , SecondActivity.class); startActivity(intent); finish(); } });
//发送 handler.sendEmptyMessageDelayed(0 , 1000); } @Override protected void onPause() { super.onPause(); handler.removeMessages(0); } }------------------------------ The second Activity is mainly switching between fragments (click the button, fragment switching, no sliding effect note)
Layout this radio_group button, (the button here is a picture) change the background xml
public class SecondActivity extends AppCompatActivity { private RadioGroup group; private List<Fragment> list = new ArrayList<>(); private FragmentManager manager; private Fragment_shou fragment_shou; private Fragment_two fragment_two; private Fragment_my fragment_my; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); group = (RadioGroup) findViewById(R.id.radio_group); manager = getSupportFragmentManager(); fragment_shou = new Fragment_shou(); manager.beginTransaction().add(R.id.fragme_layout , fragment_shou).commit(); group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int i) { FragmentTransaction transaction = manager.beginTransaction(); if (fragment_shou != null){ transaction.hide(fragment_shou); } if (fragment_two != null){ transaction.hide(fragment_two); } if (fragment_my != null){ transaction.hide(fragment_my); } switch (i){ case R.id.button_01: if (fragment_shou == null){ fragment_shou = new Fragment_shou(); transaction.add(R.id.fragme_layout , fragment_shou); }else{ transaction.show(fragment_shou); } break; case R.id.button_02: if (fragment_two == null){ fragment_two = new Fragment_two(); transaction.add(R.id.fragme_layout , fragment_two); }else{ transaction.show(fragment_two); } break; case R.id.button_03: if (fragment_my == null){ fragment_my = new Fragment_my(); transaction.add(R.id.fragme_layout , fragment_my); }else{ transaction.show(fragment_my); } break; default: break; } transaction.commit(); } }); } }-------------------------------------------------- ----------------------------- The first fragment is also the home page
This is the layout of the fragment,
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:background="#D43D3D" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="今日头条" android:textStyle="bold" android:textSize="25dp" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:textColor="#ffffff"/> <ImageView android:onClick="sousuo" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@mipmap/sousuokuang" android:layout_marginLeft="10dp" /> </LinearLayout> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="50dp" app:tabMode="scrollable" app:tabGravity="center" app:tabIndicatorColor="#E46262" app:tabTextColor="#000000" app:tabSelectedTextColor="#E46262"> </android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager android:id="@+id/view_pager_shou" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> </LinearLayout>
public class Fragment_shou extends Fragment { private TabLayout tabLayout; private List<String> list = new ArrayList<>(); private ViewPager pager; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_shou , container , false); tabLayout = (TabLayout) view.findViewById(R.id.tab_layout); pager = (ViewPager) view.findViewById(R.id.view_pager_shou); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); list.add("头条"); list.add("社会"); list.add("国内"); list.add("国际"); list.add("娱乐"); list.add("体育"); list.add("军事"); list.add("科技"); list.add("财经"); list.add("时尚"); //解决tablayout的空数据问题 pager.setOffscreenPageLimit(list.size());
pager.setAdapter(new FragmentPagerAdapter(getFragmentManager()) { @Override public CharSequence getPageTitle(int position) { return list.get(position); } @Override public Fragment getItem(int position) { NewsFragment newsFragment = new NewsFragment(); Bundle bundle = new Bundle(); if (list.get(position).equals("头条")){
-=-=-不行的话就用这行转码,再传过去就能使用了
String s = URLEncoder.encode("福利");bundle.putString("name" , "top");
}else if (list.get(position).equals("社会")){
bundle.putString("name" , "shehui");
}else if (list.get(position).equals("国内")){
bundle.putString("name" , "guonei");
}else if (list.get(position).equals("国际")){
bundle.putString("name" , "guoji");
}else if (list.get(position).equals("娱乐")){
bundle.putString("name" , "yule");
}else if (list.get(position).equals("体育")){
bundle.putString("name" , "tiyu");
}else if (list.get(position).equals("军事")){
bundle.putString("name" , "junshi");
}else if (list.get(position).equals("科技")){
bundle.putString("name" , "keji");
}else if (list.get(position).equals("财经")){
bundle.putString("name" , "caijing");
}else if (list.get(position).equals("时尚")){
bundle.putString("name" , "shishang");
}
newsFragment.setArguments(bundle);
return newsFragment;
}
@Override
public int getCount() {
return list.size();
}
});
//tablayout should be associated with viewpager
tabLayout.setupWithViewPager(pager);
}
// search click event
public void sousuo(View view){
}
}----------------------------------------- NewsFragment Xlistview used by tablayout pulls up, pulls down
Layout below
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment.bwie.com.newstopandnewswy.view.XListView android:id="@+id/xlist_view" android:layout_width="match_parent" android:layout_height="match_parent"> </fragment.bwie.com.newstopandnewswy.view.XListView> </LinearLayout>
public class NewsFragment extends Fragment implements XListView.IXListViewListener { private XListView xListView; private List<UserBean.ResultBean.DataBean> list = new ArrayList<>(); private MyAdapter adapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.news_fragment , container , false); xListView = (XListView) view.findViewById(R.id.xlist_view); //点击事件 xListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Intent intent = new Intent(getActivity() , WebActivity.class); intent.putExtra("url" , list.get(i).getUrl()); getActivity().startActivity(intent); } }); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //获取,传来的值 Bundle bundle = getArguments(); String string = bundle.getString("name" , "top"); getazong(string); //上拉 xListView.setPullLoadEnable(true); //下拉 xListView.setPullRefreshEnable(true); xListView.setXListViewListener(this); getLoadEnable(); } //获取总的数据 public void getazong(final String string) { AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { String paht = "http://v.juhe.cn/toutiao/index?type="+string+"&key=c4479ad58f41e7f78a8fa073d0b1f1b5"; try { URL url = new URL(paht); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); String json = StreamToString(inputStream, "utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Gson gson = new Gson(); UserBean userBean = gson.fromJson(s, UserBean.class); //list = null; Log.i("-------" , "list" + list); list.addAll(userBean.getResult().getData()); //设置适配器 getadapter(); } }; asyncTask.execute(); } //上拉 public void getLoadEnable() { } //下拉 public void getRefreshEnable() { } //设置适配器 private void getadapter() { if (adapter == null){ adapter = new MyAdapter(getActivity(), list); xListView.setAdapter(adapter); }else{ adapter.notifyDataSetChanged();; } } //解析 private String StreamToString(InputStream inputStream, String s) { try { InputStreamReader inputStreamReader = new InputStreamReader(inputStream, s); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder builder = new StringBuilder(); String string = ""; while ((string = bufferedReader.readLine()) != null){ builder.append(string); } bufferedReader.close(); Log.i("builder" , "builder---->" + builder.toString()); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } @Override public void onRefresh() { getRefreshEnable(); } @Override public void onLoadMore() { getLoadEnable(); } }
-------------------------------------pulltorefreshlistview 上拉,下拉
布局
<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:layout_height="match_parent" android:layout_width="match_parent" android:id="@+id/refresh_list_view" ptr:ptrDrawable="@drawable/default_ptr_flip" ptr:ptrAnimationStyle="flip" ptr:ptrHeaderBackground="#383838" ptr:ptrHeaderTextColor="#FFFFFF" > </com.handmark.pulltorefresh.library.PullToRefreshListView> </LinearLayout>
public class NewsFragment extends Fragment { private PullToRefreshListView pullToRefreshListView; private ILoadingLayout startLabels; private ILoadingLayout endLabels; int num = 1; List<Bean.ResultsBean> list = new ArrayList<>(); private MyAdapter myAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.news_fragment, container, false); pullToRefreshListView = (PullToRefreshListView) view.findViewById(R.id.refresh_list_view); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Bundle bundle = getArguments(); final String string = bundle.getString("name","fuli"); getDataFromNet(string); pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH); startLabels = pullToRefreshListView.getLoadingLayoutProxy(true, false); startLabels.setPullLabel("上拉刷新"); startLabels.setRefreshingLabel("正在载入..."); startLabels.setReleaseLabel("放开刷新"); endLabels = pullToRefreshListView.getLoadingLayoutProxy(false, true); endLabels.setPullLabel("下拉刷新"); endLabels.setRefreshingLabel("正在载入..."); endLabels.setReleaseLabel("放开刷新..."); pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { num ++; getRefreshData(string); } @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { num = 1; getData(string); } }); pullToRefreshListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Intent intent = new Intent(getActivity() , WebActivity.class); intent.putExtra("url" , list.get(i-1).getUrl()); startActivity(intent); } }); } private void getDataFromNet(final String string) { AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { String path = "http://gank.io/api/data/"+string+"/10/1"; try { URL url = new URL(path); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setConnectTimeout(5000); urlConnection.setReadTimeout(5000); int responseCode = urlConnection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = urlConnection.getInputStream(); String json = streamTostring(inputStream, "utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Gson gson = new Gson(); Bean bean = gson.fromJson(s, Bean.class); list.addAll(0 , bean.getResults()); myAdapter = new MyAdapter(list, getActivity()); pullToRefreshListView.setAdapter(myAdapter); } }; asyncTask.execute(); } private String streamTostring(InputStream inputStream, String s) { try { InputStreamReader inputStreamReader = new InputStreamReader(inputStream, s); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder builder = new StringBuilder(); String string = null; while ((string = bufferedReader.readLine()) != null) { builder.append(string); } bufferedReader.close(); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } private void getRefreshData(final String string) { //1.创建异步任务的对象..第一个参数url路径Void,第二个参数表示进度Void,第三个参数返回值类型String(可以为空) AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { //执行耗时的网络操作 @Override protected String doInBackground(Void... voids) { String path = "http://gank.io/api/data/"+string+"/10/" + num; //1.url try { URL url = new URL(path); //2.打开 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //设置 connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); //获取 int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = connection.getInputStream(); //字节流转为字符串 String json = streamToString(inputStream, "utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } //主线程,,,解析返回的数据 @Override protected void onPostExecute(String json) { //解析 Gson gson = new Gson(); Bean bean = gson.fromJson(json, Bean.class); //dataDataBean.getNewslist(); //把解析的数据添加到集合中 list.addAll(0, bean.getResults()); setAdapter(); //刷新停止 pullToRefreshListView.onRefreshComplete(); //设置本次刷新的时间 Date date = new Date(System.currentTimeMillis()); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm"); startLabels.setLastUpdatedLabel("上次刷新时间:" + simpleDateFormat.format(date)); } }; //2.执行任务 asyncTask.execute(); } public void getData(final String string) { //1.创建异步任务的对象..第一个参数url路径Void,第二个参数表示进度Void,第三个参数返回值类型String(可以为空) AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { //执行耗时的网络操作 @Override protected String doInBackground(Void... voids) { String path = "http://gank.io/api/data/"+string+"/10/" + num; //1.url try { URL url = new URL(path); //2.打开 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //设置 connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); //获取 int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); //字节流转为字符串 String json = streamToString(inputStream, "utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } //主线程,,,解析返回的数据 @Override protected void onPostExecute(String json) { //解析 Gson gson = new Gson(); Bean dataDataBean = gson.fromJson(json, Bean.class); //dataDataBean.getNewslist(); //把解析的数据添加到集合中 list.addAll(dataDataBean.getResults()); setAdapter(); //刷新停止 pullToRefreshListView.onRefreshComplete(); } }; //2.执行任务 asyncTask.execute(); } private String streamToString(InputStream inputStream,String charset) { try { InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String s = null; StringBuilder builder = new StringBuilder(); while ((s = bufferedReader.readLine()) != null){ builder.append(s); } bufferedReader.close(); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } private void setAdapter() { if (myAdapter == null){ myAdapter = new MyAdapter(list, getActivity()); pullToRefreshListView.setAdapter(myAdapter); }else { myAdapter.notifyDataSetChanged(); } } }
--------------------------跳转到的WebAtivity
布局
<?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"> <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent"></WebView> </LinearLayout>
public class WebActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.web_activity); webView = (WebView) findViewById(R.id.web_view); Intent intent = getIntent(); String url = intent.getStringExtra("url"); //加载 webView.loadUrl(url); //设置 webView.setWebViewClient(new WebViewClient()); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); } }
---------------------------------------第二个fragment
布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#EB413D"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="今日要闻" android:textSize="20dp" android:padding="10dp" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:textColor="#ffffff"/> </LinearLayout> <android.support.v4.view.ViewPager android:layout_below="@id/layout" android:id="@+id/view_pager_two" android:layout_width="match_parent" android:layout_height="200dp"> </android.support.v4.view.ViewPager> <TextView android:id="@+id/text_view" android:layout_alignBottom="@id/view_pager_two" android:layout_width="wrap_content" android:text="sdasda" android:textSize="20sp" android:padding="10dp" android:layout_height="wrap_content" /> <LinearLayout android:id="@+id/linear_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/view_pager_two" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" android:orientation="horizontal" android:layout_alignParentRight="true"> </LinearLayout> <fragment.bwie.com.newstopandnewswy.view.XListView android:layout_below="@id/text_view" android:id="@+id/xlist_view_two" android:layout_width="match_parent" android:layout_height="match_parent"> </fragment.bwie.com.newstopandnewswy.view.XListView> </RelativeLayout>
==============================================小圆点的布局选中和未选中的布局
---------------------doc_select
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ff0000"/> <corners android:radius="5dp"/> <size android:height="10dp" android:width="10dp"/> </shape>-----------------------doc_select_no
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#00ff00"/> <corners android:radius="5dp"/> <size android:height="10dp" android:width="10dp"/> </shape>
public class Fragment_two extends Fragment implements XListView.IXListViewListener { private ViewPager pager; private XListView xListView; private TextView textView; private LinearLayout linearLayout; private List<ImageView> images; private List<String> lists = new ArrayList<>(); private List<UserBean02.NewslistBean> list; private int page = 1; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0){ int currentItem = pager.getCurrentItem(); pager.setCurrentItem(currentItem+1); handler.sendEmptyMessageDelayed(0 , 2000); } } }; private MyAdapter_Two adapter_two; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_two , container , false); pager = (ViewPager) view.findViewById(R.id.view_pager_two); xListView = (XListView) view.findViewById(R.id.xlist_view_two); textView = (TextView) view.findViewById(R.id.text_view); linearLayout = (LinearLayout) view.findViewById(R.id.linear_layout); //点击事件 xListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Intent intent = new Intent(getActivity() , WebActivity.class); intent.putExtra("url" , list.get(i).getUrl()); getActivity().startActivity(intent); } }); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //无限轮播 wuxianviewpager(); //上拉 xListView.setPullLoadEnable(true); //下拉 xListView.setPullRefreshEnable(true); xListView.setXListViewListener(this); getRefreshEnable(); } private void wuxianviewpager() { AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { String path = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=6&page=1"; try { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); String json = StreamToString(inputStream, "utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Gson gson = new Gson(); UserBean02 userBean02 = gson.fromJson(s, UserBean02.class); list = userBean02.getNewslist(); for (int i = 0; i < list.size() ; i ++){ lists.add(list.get(i).getPicUrl()); } //初始化小圆点 MyPagerAdapter adapter = new MyPagerAdapter(getActivity(), list, handler); pager.setAdapter(adapter); //初始化小圆点 initDoc(); //设置ViewPager初始展示的位置 pager.setCurrentItem(lists.size()*10000); //发送延时消息 handler.sendEmptyMessageDelayed(0 , 2000); //viewPager页面改变的监听事件 pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { textView.setText(list.get(position% list.size()).getTitle()); //如果选中了这一页,,,当前小圆点红色,,,否则绿色 for (int i = 0;i<images.size();i++){ if (i== position%images.size()){ images.get(i).setImageResource(R.drawable.doc_select); }else { images.get(i).setImageResource(R.drawable.doc_select_no); } } } @Override public void onPageScrollStateChanged(int state) {
} }); } }; asyncTask.execute(); } private String StreamToString(InputStream inputStream, String s) { try { InputStreamReader inputStreamReader = new InputStreamReader(inputStream, s); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder builder = new StringBuilder(); String string = ""; while ((string=bufferedReader.readLine()) != null){ builder.append(string); } bufferedReader.close(); Log.i("builder" , "builder---->" + builder.toString()); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } //初始化小圆点 private void initDoc() { //首先需要一个集合记录这些小圆点的图片,,,,当页面切换的时候,可以从集合中取出imageView进行显示图片的设置 images = new ArrayList<>(); linearLayout.removeAllViews();//清空/移除所有的view for (int i = 0;i<lists.size();i++){ ImageView imageView = new ImageView(getActivity()); if (i==0){ //显示第一页,,,红的 imageView.setImageResource(R.drawable.doc_select); }else { //绿的 imageView.setImageResource(R.drawable.doc_select_no); } //添加到集合 images.add(imageView); //加入到线性布局中显示 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(5,0,5,0); linearLayout.addView(imageView,params); } } //设置适配器 private void getadapter() { if (adapter_two == null){ adapter_two = new MyAdapter_Two(getActivity(), list); xListView.setAdapter(adapter_two); }else{ adapter_two.notifyDataSetChanged();; } } //下拉 public void getRefreshEnable() { AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { String paht = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=6&page=" + page; try { URL url = new URL(paht); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); String json = StreamToString(inputStream, "utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Gson gson = new Gson(); UserBean02 userBean02 = gson.fromJson(s, UserBean02.class); list.addAll(0 , userBean02.getNewslist()); //设置适配器 getadapter(); //停止 xListView.stopRefresh(); Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm"); //设置时间 xListView.setRefreshTime(dateFormat.format(date)); } }; asyncTask.execute(); } //上拉 public void getLoadEnable() { AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { String paht = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=6&page=" + page; try { URL url = new URL(paht); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); String json = StreamToString(inputStream, "utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Gson gson = new Gson(); UserBean02 userBean02 = gson.fromJson(s, UserBean02.class); list.addAll(userBean02.getNewslist()); //设置适配器 getadapter(); //停止刷新 xListView.stopLoadMore(); } }; asyncTask.execute(); } //下拉 @Override public void onRefresh() { page ++; Log.i("num" , "下拉num---->" + page); getRefreshEnable(); } //上拉 @Override public void onLoadMore() { page = 1; Log.i("num" , "上拉num---->" + page); getLoadEnable(); } }
---------------------------第三个Fragment
布局
public class Fragment_my extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my , container , false); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } }--------------------------所有用到的adapter----------------------------xlistview所需的string.xml里的东西****FragmentViewPagerAdapter fragment的适配器
public class FragmentViewPagerAdapter extends FragmentPagerAdapter { Context context; List<Fragment> list; public FragmentViewPagerAdapter(FragmentManager context, List<Fragment> list) { super(context); this.list = list; } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } }****MyAdapter 多条目加载的适配器
public class MyAdapter extends BaseAdapter { Context context; List<UserBean.ResultBean.DataBean> list; private static final int IMAGE_ITEM_LEFT = 0; private static final int IMAGE_ITEM_RIGHT = 1; public MyAdapter(Context context, List<UserBean.ResultBean.DataBean> list) { this.context = context; this.list = list; ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context)); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { if ((position%2) == 0){ return IMAGE_ITEM_LEFT; } return IMAGE_ITEM_RIGHT; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if (getItemViewType(i) == IMAGE_ITEM_LEFT){ ViewHolderLeft holderLeft; if (view == null){ holderLeft = new ViewHolderLeft(); view = View.inflate(context , R.layout.image_left , null); holderLeft.textView = (TextView) view.findViewById(R.id.text_title); holderLeft.imageView = (ImageView) view.findViewById(R.id.iamge_01); view.setTag(holderLeft); }else{ holderLeft = (ViewHolderLeft) view.getTag(); } holderLeft.textView.setText(list.get(i).getTitle()); ImageLoader.getInstance().displayImage(list.get(i).getThumbnail_pic_s() , holderLeft.imageView); }else{ ViewHolderRight holderRight; if (view == null){ holderRight = new ViewHolderRight(); view = View.inflate(context , R.layout.image_right , null); holderRight.textView = (TextView) view.findViewById(R.id.text_title); holderRight.imageView = (ImageView) view.findViewById(R.id.iamge_02); view.setTag(holderRight); }else{ holderRight = (ViewHolderRight) view.getTag(); } holderRight.textView.setText(list.get(i).getTitle()); ImageLoader.getInstance().displayImage(list.get(i).getThumbnail_pic_s() , holderRight.imageView); } return view; } class ViewHolderLeft{ ImageView imageView; TextView textView; } class ViewHolderRight{ TextView textView; ImageView imageView; } }****MyPagerAdapter 无线轮播的适配器public class MyPagerAdapter extends PagerAdapter { Context context; List<UserBean02.NewslistBean> list; Handler handler; public MyPagerAdapter(Context context, List<UserBean02.NewslistBean> list, Handler handler) { this.context = context; this.list = list; this.handler = handler; ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(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, final int position) { ImageView imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.FIT_XY); ImageLoader.getInstance().displayImage(list.get(position%list.size()).getPicUrl() , imageView); //imageView触摸的监听事件 imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { boolean isTiaozhuan = true; switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN://按下 Log.i("-----" , "ACTION_DOWN"); handler.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_MOVE://移动 Log.i("-----" , "ACTION_MOVE"); isTiaozhuan = false; handler.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_CANCEL://取消 Log.i("-----" , "ACTION_CANCEL"); isTiaozhuan = false; handler.sendEmptyMessageDelayed(0 , 2000); break; case MotionEvent.ACTION_UP://抬起 Log.i("-----" , "ACTION_UP"); if (isTiaozhuan){ Toast.makeText(context , "跳转页面" , Toast.LENGTH_SHORT).show(); Intent intent = new Intent(context , WebActivity.class); intent.putExtra("url" , list.get(position%list.size()).getUrl()); context.startActivity(intent); } handler.sendEmptyMessageDelayed(1 , 2000); break; default: break; } //自己处理触摸事件....如果当前位置返回了true,,,点击事件将不会执行,,,表示动作自己处理,不会传递 return true; } }); //添加到容器 container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }----------------------------------imageloader自定义的分类 在清单文件要添加name=".BaseApplicent"
**----BaseApplicent
public class BaseApplicent extends Application { @Override public void onCreate() { super.onCreate(); ImafeLoaderUtil.initConfig(this); } }**----ImafeLoaderUtil
public class ImafeLoaderUtil { public static void initConfig(Context context) { File cacheDir = StorageUtils.getCacheDirectory(context); //缓存文件夹路径 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .threadPoolSize(3) // default 线程池内加载的数量 .threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级 .tasksProcessingOrder(QueueProcessingType.FIFO) // default .denyCacheImageMultipleSizesInMemory() .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现 .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值 .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiskCache(cacheDir)) // default 可以自定义缓存路径 .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值 .diskCacheFileCount(100) // 可以缓存的文件数量 // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密 .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) .imageDownloader(new BaseImageDownloader(context)) // default .imageDecoder(new BaseImageDecoder(true)) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .writeDebugLogs() // 打印debug log .build(); //开始构建 ImageLoader.getInstance().init(config); } }
<string name="xlistview_header_hint_normal">下拉刷新</string> <string name="xlistview_header_hint_ready">松开刷新数据</string> <string name="xlistview_header_hint_loading">正在加载...</string> <string name="xlistview_header_last_time">上次更新时间:</string> <string name="xlistview_footer_hint_normal">查看更多</string> <string name="xlistview_footer_hint_ready">松开载入更多</string>************build.gradle的一部分 只供参考 注意要把26改为25
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.+' compile 'com.android.support:design:25.3.1' <--!tablayout--> compile 'com.google.code.gson:gson:2.8.1' <--!gson--> compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' <--!imageload--> }
*1.去标题 在style里面建一个
<style name="NoTitleTheme" parent="Theme.AppCompat.Light.NoActionBar"> </style>*2.然后在清单里调用,这样是全部都去标题,可以谁去谁调用他android:theme="@style/NoTitleTheme"