【小墩墩学Android】(练习)财经数据收集(五)

目录

1.前言

2.开发环境

3.数据接口

4.主界面

5.部分代码

后续


1.前言

“君不见,高堂明镜悲白发,朝如青丝暮成雪。人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。”

2.开发环境

android studio开发版本:

此app的开发模板:

3.数据接口

使用财经网站接口,主要有雅虎,腾讯,新浪,搜狐,网易等。

这里以新浪为例。

方法1:HTTP://HQ.SINAJS.CN/LIST=[股票代码]

返回结果:JSON实时数据,以逗号隔开相关数据,数据依次是“股票名称、今日开盘价、昨日收盘价、当前价格、今日最高价、今日最低价、竞买价、竞卖价、成交股数、成交金额、买1手、买1报价、买2手、买2报价、…、买5报价、…、卖5报价、日期、时间”。

获取当前的股票行情,如http://hq.sinajs.cn/list=sh601006,注意新浪区分沪深是以sh和sz区分。

方法2:获取各个时间段行情图。

查看日K线图:http://image.sinajs.cn/newchart/daily/n/sh601006.gif分时线的查询:http://image.sinajs.cn/newchart/min/n/sh000001.gif日K线查询:http://image.sinajs.cn/newchart/daily/n/sh000001.gif周K线查询:http://image.sinajs.cn/newchart/weekly/n/sh000001.gif月K线查询:http://image.sinajs.cn/newchart/monthly/n/sh000001.gif

方法3:http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=[市场][股票代码]&scale=[周期]&ma=no&datalen=[长度]

返回结果:获取5、10、30、60分钟JSON数据;day日期、open开盘价、high最高价、low最低价、close收盘价、volume成交量;向前复权的数据。

注意,最多只能获取最近的1023个数据节点。

例如,http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=sz002095&scale=60&ma=no&datalen=1023,获取深圳市场002095股票的60分钟数据,获取最近的1023个节点。

方法4:http://finance.sina.com.cn/realstock/company/[市场][股票代码]/[复权].js?d=[日期]

[复权]:qianfuquan-前复权;houfuquan-后复权。

返回结果:股票日期的股价JSON数据。

例如,http://finance.sina.com.cn/realstock/company/sz002095/qianfuquan.js?d=2015-06-16,获取深圳市场002095股票的前复权2015-06-16的数据。

注意,无法获取未复权的数据。

注意,需要对返回数据进行处理才能使用,新浪会在末尾加入注释语句,打乱日期数据,key值需要自行加入双引号,否则无法解析JSON。

注意,由于新浪的周线和月线数据,是以股票日线所有数据直接计算得到的,所以无法直接通过API获取周线和月线数据,需要自行处理。

方法5:http://market.finance.sina.com.cn/downxls.php?date=[日期]&symbol=[市场][股票代码]

返回数据:XLS文件;股票历史成交明细。

例如,http://market.finance.sina.com.cn/downxls.php?date=2015-06-15&symbol=sz002095,获取2015-06-15日期的深圳市长002095数据。

方法6:http://market.finance.sina.com.cn/pricehis.php?symbol=[市场][股票代码]&startdate=[开始日期]&enddate=[结束日期]

返回数据:HTML文本;指定日期范围内的股票分价表。

例如,http://market.finance.sina.com.cn/pricehis.php?symbol=sh600900&startdate=2011-08-17&enddate=2011-08-19,获取上证600900股票2011-08-17到2011-08-19日期的分价数据。

4.主界面

   

5.部分代码

public class HorizontalListViewAdapter extends BaseAdapter{
    private List<Map<String, Object>> mListData = null;
    private Context mContext = null;
    private LayoutInflater mInflater;
    Bitmap iconBitmap;
    private int selectIndex = -1;

    HorizontalListViewAdapter(Context context, List<Map<String, Object>> data){
        this.mContext = context;
        this.mListData = data;
        this.mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//LayoutInflater.from(mContext);
    }

    @Override
    public int getCount() {
        if(mListData == null)
            return 0;

        return mListData.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @SuppressLint({"InflateParams", "SetTextI18n", "DefaultLocale"})
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        if(convertView==null){
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.listitem_quotation, null);
            holder.tv_name=(TextView)convertView.findViewById(R.id.tv_name);
            holder.tv_price=(TextView)convertView.findViewById(R.id.tv_price);
            holder.tv_change=(TextView)convertView.findViewById(R.id.tv_change);
            convertView.setTag(holder);

            WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
            int width = wm.getDefaultDisplay().getWidth();
            ViewGroup.LayoutParams para;
            para = holder.tv_price.getLayoutParams();
            para.width = width/4;
            holder.tv_price.setLayoutParams(para);

        }else{
            holder=(ViewHolder)convertView.getTag();
        }

        if(position == selectIndex){
            convertView.setSelected(true);
        }else{
            convertView.setSelected(false);
        }

        Map<String, Object> map = this.mListData.get(position);
        float f1 = Float.valueOf((String) Objects.requireNonNull(map.get("price")));
        float f2 = Float.valueOf((String) Objects.requireNonNull(map.get("price_diff")));
        float f3 = Float.valueOf((String) Objects.requireNonNull(map.get("price_percent")));
        String sign = "";
        if(f2>0) {
            sign = "+";
        }
        holder.tv_name.setText((String)map.get("name"));
        holder.tv_price.setText(String.format("%.2f", f1));
        holder.tv_change.setText(sign+String.format("%.2f", f2)
                + "     [" +sign + String.format("%.2f%%", f3) + "]");

        if(f2 < 0) {
            convertView.setBackgroundColor(Color.rgb(0, 150, 0));
        }
        else if(f2 >0) {
            convertView.setBackgroundColor(Color.rgb(255, 0, 0));
        }
        else {
            convertView.setBackgroundColor(Color.rgb(128, 128, 128));
        }
        return convertView;
    }

    private static class ViewHolder {
        private TextView tv_name;
        private TextView tv_price;
        private TextView tv_change;

        private ImageView mImage;
    }

    public void setSelectIndex(int i){
        selectIndex = i;
    }
}

后续

如果你觉得该方法或代码有一点点用处,可以给作者点个赞;╮( ̄▽ ̄)╭
如果你感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进。o_O???
谢谢各位童鞋们啦( ´ ▽ ` )ノ ( ´ ▽ ` )っ!!!

おすすめ

転載: blog.csdn.net/hhy321/article/details/120396065