最近一个做金融的同学问我,能不能写一个小的Demo,得到金十数据网上每周三22:30美国能源信息署发布的原油数据。这里使用Jsoup工具来获取网络数据。
具体思路:
(1):这里写两个Activity,FirstActivity主要使用自定义的ListView显示日期列表,该列表实现了下拉加载更多的日期项的功能,点击每一个Item可以启动SecondActivity,并传递一个日期值,根据日期值获得每周三的数据。
(2):根据当前日期,获取之前的每个周三的日期值,根据日期值,就可以得到网络的URL地址。
(3):SecondActivity用于显示从网络上得到的数据,在内部的 AsyncTask异步类的doInBackground方法中获取HTML页面的字符串。在onPostExecute方法中利用Jsoup解析HTML文档,并将解析出来的数据放入集合中保存。
FirstActivity相关代码:
1,自定义的ListView:
public class MyListView extends ListView implements AbsListView.OnScrollListener
{
View footerView;
private int mTotalItemCount;
private int mLastVisibleItem;
private boolean isLoading;
private LoadMoreDataListener loadMoreDataListener;
public MyListView(Context context)
{
super(context);
initView(context);
}
public MyListView(Context context, AttributeSet attrs)
{
super(context, attrs);
initView(context);
}
public MyListView(Context context , AttributeSet attrs , int defStyle)
{
super(context, attrs , defStyle);
initView(context);
}
private void initView(Context context)
{
LayoutInflater inflater = LayoutInflater.from(context);
footerView = inflater.inflate(R.layout.footer_view , null);
footerView.findViewById(R.id.footer_layout).setVisibility(GONE);
this.addFooterView(footerView);
this.setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState)
{
if (mLastVisibleItem == mTotalItemCount && scrollState == SCROLL_STATE_IDLE)
{
//如果不是正在加载
if (!isLoading)
{
isLoading = true;
footerView.findViewById(R.id.footer_layout).setVisibility(VISIBLE);
loadMoreDataListener.loadMore();
}
}
}
public void loadComplete()
{
isLoading = false;
footerView.findViewById(R.id.footer_layout).setVisibility(GONE);
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
this.mLastVisibleItem = firstVisibleItem + visibleItemCount;
this.mTotalItemCount = totalItemCount;
}
public interface LoadMoreDataListener
{
void loadMore();
}
public void setLoadMoreDataListener(LoadMoreDataListener loadMoreDataListener)
{
this.loadMoreDataListener = loadMoreDataListener;
}
}
2,Bean类(该类可以获取每个星期三的日期值):
public class EveryWen
{
String year;
String month;
String date;
String urlString;
String showString;
String title;
public static Calendar getLastWenDay()
{
Calendar calendar = Calendar.getInstance();
int off = getWednesdayOff(calendar.get(Calendar.DAY_OF_WEEK));
calendar.add(Calendar.DATE , -off);
return calendar;
}
public static int getWednesdayOff(int now)
{
int off = 0;
switch (now)
{
case 1:
off = 4;
break;
case 2:
off = 5;
break;
case 3:
off = 6;
break;
case 4:
off = 0;
break;
case 5:
off = 1;
break;
case 6:
off = 2;
break;
case 7:
off = 3;
break;
default:
break;
}
return off;
}
public EveryWen(int year , int month , int date , String title)
{
this.year = year + "";
if ((month + 1) < 10)
{
this.month = "0" + (month + 1);
}
else
{
this.month = (month + 1) + "";
}
if (date < 10)
{
this.date = "0" + date;
}
else
{
this.date = date + "";
}
this.title = title;
init();
}
private void init()
{
StringBuilder sb = new StringBuilder();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(year).append(month).append(date);
showString = stringBuilder.toString();
sb.append(year).append("年").append(month).append("月").append(date).append("日");
urlString = sb.toString();
}
}
3,自定义的Adapter
public class MyAdapter extends BaseAdapter
{
private LayoutInflater layoutInflater;
private List<EveryWen> datas;
public MyAdapter(Context context , List<EveryWen> listData)
{
layoutInflater = LayoutInflater.from(context);
datas = listData;
}
public void onDataChange(List<EveryWen> dataOfList)
{
this.datas = dataOfList;
this.notifyDataSetChanged();
}
@Override
public int getCount()
{
return datas.size();
}
@Override
public Object getItem(int position)
{
return datas.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder = null;
if (convertView == null)
{
convertView = layoutInflater.inflate(R.layout.list_item , null);
viewHolder = new ViewHolder();
viewHolder.title = (TextView) convertView.findViewById(R.id.item_title);
viewHolder.date = (TextView) convertView.findViewById(R.id.item_date);
convertView.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.title.setText(datas.get(position).title);
viewHolder.date.setText(datas.get(position).urlString);
return convertView;
}
class ViewHolder
{
TextView title;
TextView date;
}
}
FirstActivity类:
public class FirstActivity extends Activity implements MyListView.LoadMoreDataListener , ListView.OnItemClickListener
{
List<EveryWen> wenList = new ArrayList<>();
Calendar calendar = EveryWen.getLastWenDay();
MyAdapter adapter;
private MyListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main_activity);
getData();
initView(wenList);
}
private void initView(List<EveryWen> loadDatas)
{
if (adapter == null)
{
mListView = (MyListView) findViewById(R.id.listView);
mListView.setLoadMoreDataListener(this);
mListView.setOnItemClickListener(this);
adapter = new MyAdapter(this, loadDatas);
mListView.setAdapter(adapter);
}
else
{
adapter.onDataChange(loadDatas);
}
}
private void getData()
{
for (int i = 0 ; i < 15 ; i++)
{
EveryWen wenDay = new EveryWen(calendar.get(Calendar.YEAR) ,
calendar.get(Calendar.MONTH) , calendar.get(Calendar.DATE) , "金石财经数据一览");
wenList.add(wenDay);
calendar.add(Calendar.DATE , -7);
}
}
private void showMoreData()
{
for (int i = 0 ; i < 3 ; i++)
{
EveryWen wenDay = new EveryWen(calendar.get(Calendar.YEAR) ,
calendar.get(Calendar.MONTH) , calendar.get(Calendar.DATE) , "金石财经数据一览");
wenList.add(wenDay);
calendar.add(Calendar.DATE , -7);
}
}
@Override
public void loadMore()
{
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
//加载更多数据
showMoreData();
initView(wenList);
mListView.loadComplete();
}
} , 2500);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
String date = wenList.get(position).showString;
Intent intent = new Intent(FirstActivity.this , SecondActivity.class);
intent.putExtra("extra_date" , date);
startActivity(intent);
}
}
主页面布局比较简单,就是放入一个自定义的ListView,这里给出ListView的item的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp">
<ImageView
android:id="@+id/item_icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_centerVertical="true"
android:background="@drawable/usa"
android:layout_marginLeft="5dp"/>
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_toRightOf="@+id/item_icon"
android:layout_centerInParent="true"
android:text=""
android:textSize="16sp" />
<TextView
android:id="@+id/item_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"
android:layout_marginTop="30dp"
android:layout_marginBottom="10dp"
android:text=""/>
</RelativeLayout>