团队冲刺(六)

一、认领任务

经过团队讨论,我认领到的工作是:分享页面的运动排行的实现

二、任务完成时间估算

页面布局 2h
从数据库提取 5h

 

 

分享页面

展示如下:

主要的实现代码:

shareFragment

package com.example.myapplication5;


import android.app.Fragment;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Toast;

import com.alibaba.fastjson.JSON;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;


/**
* A simple {@link Fragment} subclass.
*/
public class shareFragment extends Fragment {
private View ly3;

private ImageButton imageButton;
private ImageButton imageButton5;
private ImageButton imageButton6;
private ImageButton imageButton7;
ListView nameList;
ListView timeList;
private String[] Name = new String[0];
private String[] Time = new String[0];



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Intent intent = getActivity().getIntent();
final String name2 = intent.getStringExtra("name");
if(ly3 ==null){
ly3 = inflater.inflate(R.layout.tab03,null);
nameList = (ListView) ly3.findViewById(R.id.nameList);
timeList = (ListView) ly3.findViewById(R.id.timeList);

}
class postTask extends AsyncTask {

@Override
protected Object doInBackground(Object[] params) {
String path=params[0].toString();
try {
//获取网络上get方式提交的整个路径
URL url=new URL(path);
//打开网络连接
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
//设置提交方式
conn.setRequestMethod("POST");
//设置网络超时时间
conn.setConnectTimeout(5000);
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");//键和值是固定的
//设置允许对外输出数据
conn.setDoOutput(true);
//把界面上的所有数据写出去
if(conn.getResponseCode()==200){
//用io流与web后台进行数据交互
InputStream is=conn.getInputStream();
//字节流转字符流
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//读出每一行的数据
String str=br.readLine();
//返回读出的每一行的数据
return str;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
//获取Android studio与web后台数据交互获得的值
String s= (String) o;
if(s ==null||s.length()<=0){
Toast.makeText(getActivity(), "无排行", Toast.LENGTH_SHORT).show();
}
else{
List<Zong> shopInfos = JSON.parseArray(s, Zong.class);
List<String> list11 = new ArrayList<>();
List<String> list22 = new ArrayList<>();
for (Zong zong : shopInfos) {

System.out.println(zong.getName());
System.out.println(zong.getZong());

list11.add(new String(zong.getName()));
list22.add(new String(zong.getSzong()));

//
}
Name=list11.toArray(new String[list11.size()]);
Time=list22.toArray(new String[list22.size()]);

// Toast.makeText(SActivity.this, s, Toast.LENGTH_SHORT).show();
dosome();}

}
public void dosome(){
//传递参数
nameList.setAdapter(new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, Name));
timeList.setAdapter(new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, Time));
setListViewOnTouchAndScrollListener(nameList,timeList);
}
}

String path="http://10.0.2.2:8080/testhttp/DateShow.Servlet";//这里是本地web的地址,先运行httptest的Servlet再启动,才不会闪退。而http://120.79.40.20/testhttp/ http://10.0.2.2:8080/testhttp/
//调用postTask,把获取到的数据与路径放入方法中,这里没有放数据。
new postTask().execute(path);
return ly3;
}


public void setListViewOnTouchAndScrollListener(final ListView listView1,final ListView listView2){


//设置listview2列表的scroll监听,用于滑动过程中左右不同步时校正
listView2.setOnScrollListener(new AbsListView.OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//如果停止滑动
if(scrollState == 0 || scrollState == 1){
//获得第一个子view
View subView = view.getChildAt(0);

if(subView !=null){
final int top = subView.getTop();
final int top1 = listView1.getChildAt(0).getTop();
final int position = view.getFirstVisiblePosition();

//如果两个首个显示的子view高度不等
if(top != top1){
listView1.setSelectionFromTop(position, top);
}
}
}

}

public void onScroll(AbsListView view, final int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
View subView = view.getChildAt(0);
if(subView != null){
final int top = subView.getTop();

// //如果两个首个显示的子view高度不等
int top1 = listView1.getChildAt(0).getTop();
if(!(top1 - 7 < top &&top < top1 + 7)){
listView1.setSelectionFromTop(firstVisibleItem, top);
listView2.setSelectionFromTop(firstVisibleItem, top);
}

}
}
});

//设置listview1列表的scroll监听,用于滑动过程中左右不同步时校正
listView1.setOnScrollListener(new AbsListView.OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState == 0 || scrollState == 1){
//获得第一个子view
View subView = view.getChildAt(0);

if(subView !=null){
final int top = subView.getTop();
final int top1 = listView2.getChildAt(0).getTop();
final int position = view.getFirstVisiblePosition();

//如果两个首个显示的子view高度不等
if(top != top1){
listView1.setSelectionFromTop(position, top);
listView2.setSelectionFromTop(position, top);
}
}
}
}

@Override
public void onScroll(AbsListView view, final int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
View subView = view.getChildAt(0);
if(subView != null){
final int top = subView.getTop();
listView1.setSelectionFromTop(firstVisibleItem, top);
listView2.setSelectionFromTop(firstVisibleItem, top);

}
}
});
}

}

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="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:gravity="top"
android:orientation="vertical">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="240dp"
android:background="@drawable/runbg">

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.59" />

<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="运动排行"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.076" />

<ListView
android:id="@+id/nameList"
android:layout_width="206dp"
android:layout_height="140dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline6" />

<ListView
android:id="@+id/timeList"
android:layout_width="93dp"
android:layout_height="140dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline5"
app:layout_constraintStart_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="@+id/guideline6" />

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.89" />

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="62dp" />

<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="运动时长"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@+id/guideline6"
app:layout_constraintEnd_toStartOf="@+id/guideline5"
app:layout_constraintStart_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.47000003" />

</androidx.constraintlayout.widget.ConstraintLayout>


</LinearLayout>

下面是后台的实现:

bean层:


public class Date {
private String type;
private String time;
private String date;
private String name;

public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}

dao层:


public class DateShowDao {
public List<Date> select(){
Connection conn = DBUtil.getConn(); //连接数据库
List<Date> list = new ArrayList<Date>();
try {
String sql="select * from date";
Statement pstmt = (Statement) conn.createStatement();
ResultSet rs = (ResultSet) pstmt.executeQuery(sql);
while(rs.next()) {
Date Date=new Date();
Date.setType(rs.getString("type"));
Date.setTime(rs.getString("time"));
Date.setDate(rs.getString("date"));
Date.setName(rs.getString("name"));
list.add(Date);
}
rs.close();
pstmt.close();
conn.close();

}catch(SQLException e) {
e.printStackTrace();
}
return list;
}
public List<Date> select1(String name){
Connection conn = DBUtil.getConn(); //连接数据库
List<Date> list = new ArrayList<Date>();
try {
String sql="select * from date where name like '%"+name+"%' ";
Statement pstmt = (Statement) conn.createStatement();
ResultSet rs = (ResultSet) pstmt.executeQuery(sql);
while(rs.next()) {
Date Date=new Date();
Date.setType(rs.getString("type"));
Date.setTime(rs.getString("time"));
Date.setDate(rs.getString("date"));
Date.setName(rs.getString("name"));
list.add(Date);
}
rs.close();
pstmt.close();
conn.close();

}catch(SQLException e) {
e.printStackTrace();
}
return list;
}
}

servlet层:


import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;

import com.test.dao.DateShowDao;
import com.test.bean.Date;
import com.test.bean.Shiwu;
import com.test.bean.Zong;

/**
* Servlet implementation class DateShowServlet
*/
@WebServlet("/DateShowServlet")
public class DateShowServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public DateShowServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
DateShowDao dsd=new DateShowDao();
// int t=0;
List<Date> list = dsd.select();
System.out.println(list);
int j=0;
List<String> list1 = new ArrayList<>();
List<Date> list2 = new ArrayList<>();
List<Zong> list3 = new ArrayList<Zong>();
for(Date date: list){
if(!list1.contains(date.getName())) {
list1.add(date.getName());
}
// j++;
}
// System.out.println("j:"+j);
for(String s:list1) {
Zong z= new Zong(s, j);
z.setName(s);
z.setZong(0);
list3.add(z);
}
for(Zong z:list3) {
int t=0;
for(Date date:list) {
if(date.getName().equals(z.getName())) {
String[] my =date.getTime().split(":");
int hour =Integer.parseInt(my[0]);
int min =Integer.parseInt(my[1]);
int sec =Integer.parseInt(my[2]);
int zong =hour*3600+min*60+sec;
t=t+zong;
// System.out.println(date.getName()+zong+" "+t);
}
}
// System.out.println("t:"+t);

String str = String.valueOf(t);
str = str+"秒";
z.setZong(t);
z.setSzong(str);
}
Collections.sort(list3, new Comparator<Zong>() {
public int compare(Zong o1, Zong o2) {
//升序
return o1.getZong().compareTo(o2.getZong());
}
});
System.out.println("升序排序后--:"+list3.toString());

Collections.sort(list3, new Comparator<Zong>() {
public int compare(Zong o1, Zong o2) {
//升序
return o2.getZong().compareTo(o1.getZong());
}
});
System.out.println("降序排序后--:"+list3.toString());


int i=1;
for(Zong z:list3) {
String ss = String.valueOf(i);
String rr =ss+"."+z.getName();
z.setName(rr);
i++;
System.out.println(z.getName()+":"+z.getZong()+" "+z.getSzong());
}

String json = JSON.toJSONString(list3);
System.out.println(json);
PrintWriter pw=response.getWriter();
pw.write(json);
pw.close();
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

这样子运动排行功能就能实现了。

期间遇到的困难有:

对于时间格式的转换进行排序。在这里花费的时间较多。

posted @ 2020-04-20 23:41  ziyuliu  阅读(131)  评论(0编辑  收藏  举报