Android SwipeRefreshLayout 下拉刷新

Posted on Leave a commentPosted in Android

以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆。感觉麻烦死了。今天学习了SwipeRefreshLayout 的用法,来分享一下,有说的不对的地方请大家指点。

SwipeRefreshLayout 是Google在support v4 19.1版本的library更新的一个下拉刷新组件,也就是说 开发的时候把Android版本调到4.4或者以上才会有这个。

先来看看效果图

再来看看布局文件里的代码(我这里放的是一个ListView 当然也可以放其他控件 只要你高兴就好)

 <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/main_srl_bloglist"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <ListView
            android:id="@+id/main_lv_bolg_list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:divider="#00000000"
            android:dividerHeight="5dp"></ListView>

    </android.support.v4.widget.SwipeRefreshLayout>

最后来看看Activiy里的代码吧(这里我用的AndroidAnnotations 所以没有写 findViewById 哈哈)

 //设置刷新时动画的颜色,可以设置4个
        mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mIndex=1;
                mBlogList.clear();
                loadBlogData();
            }
        });

在onRefresh 里调用获取数据的方法就好了 数据获取完毕 别忘了 修改状态

mSwipeRefreshLayout.setRefreshing(false);

哈哈 以前要写成吨的代码 用SwipeRefreshLayout 就这几行代码 是不是很方便。

Android通过Volley请求WebApi共通

Posted on Leave a commentPosted in Android

思路:

1.把请求网络的方法放到一个类里面

2.创建一个接口将数据发给Activity

3.Activity 实现接口获得服务器返回的数据

4.解析数据

 

来我们一先来看第一步

请求网络

在这里请求网络我们用Volley 。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。当然Volley对加载图片的时候内存控制的很好,后面加载图片还会用到。

创建一个CallWebservice 类

package org.shuaibi.hi_blog.utils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import org.json.JSONObject;

import android.content.Context;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

public class CallWebservice  {

    private final String HTTPHOST="http://blog.haojima.net/api/home/";  //主机地址
    public static RequestQueue requestQueue;
    private Context mContnxt; 
    private int mMark;
    private ServiceCallBack mServiceCallBack; 

    public CallWebservice(Context context,String function,HashMap&lt;String, String&gt; params,int mark)
    {
        this.mContnxt=context;
        this.mMark=mark;
        this.mServiceCallBack=(ServiceCallBack) context;
        createUrl(function,params);
    }

    public void createUrl(String function,HashMap&lt;String, String&gt; params)
    {
        //拼主机名和方法名

        String url=this.HTTPHOST+function;
        //拼参数

        if(params!=null){
            url+="?";
            Iterator&lt;Entry&lt;String, String&gt;&gt; iterator = params.entrySet().iterator();
            while (iterator.hasNext()) {
                Entry&lt;String, String&gt; obj = (Entry&lt;String, String&gt;) iterator.next();
                url+=obj.getKey().toString()+"="+obj.getValue().toString()+"&amp;";
            }
            url=url.substring(0, url.length()-1); //去掉最后一个 &amp;
        }
        //请求服务器

        getJsonResult(url);

    }

    public void getJsonResult(String url)
    {
        if(CallWebservice.requestQueue==null)
        {
            requestQueue=Volley.newRequestQueue(mContnxt);
        }
        JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(url, null, new Listener&lt;JSONObject&gt;() {
            @Override
            public void onResponse(JSONObject response) {
                mServiceCallBack.serviceResult(response, mMark);
            }
        }, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
             Toast.makeText(mContnxt, error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
        requestQueue.add(jsonObjectRequest);
    }
}

下面来写接口

package org.shuaibi.hi_blog.utils;

import org.json.JSONObject;

/**

 * 

 * @描述: 服务器返回值回调

 * @作者: ZeroX

 * @时间: 2015-9-16

 * @参数: 

 * @接口: 

 *

 */
public interface ServiceCallBack {
    void serviceResult(JSONObject jsonObject,int mark);
}

看见了接口的代码很简单就几句话, 里面的jsonObject 就是服务器返回值 mark 是标记当一个Activity里有多个请求网络的地方 我们就可以用mark 区分哈哈 。

这样请求网络就算完成了,下面介绍用法

HashMap<String, String> params=new HashMap<String, String>();
        params.put("idex",mIndex+"");
        params.put("sizePage", mPageSize+"");
        params.put("ContentLength", "80");
        new CallWebservice(this,"get",params,GETBLOGLIST);

上面代码就是调用一个 方法的写法  里面的GETBLOGLIST 是定义的一个常量我写的1,用来区分多个网络请求的这个数就是 上面接口里的mark

最后就是Activity实现 ServiceCallBack 这个接口了 实现一下serviceResult 这个方法

public class MainActivity extends Activity implements ServiceCallBack
@Override
    public void serviceResult(JSONObject jsonObject, int mark) {
        try {
            switch (mark) {
            case GETBLOGLIST:
                 blogResultHander(jsonObject.getJSONArray("blog"));
mPageCount=jsonObject.getInt("total");
                break;
            default:
                break;
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        }

    }

最后就是解析Json了

 /**

     * 博客列表返回值处理

     * @param jsonArray 博客列表

     */
    public void blogResultHander(JSONArray jsonArray) throws Exception
    {
        for (int i = 0; i &lt; jsonArray.length(); i++) {
            JSONObject jsonObject=jsonArray.getJSONObject(i);
            HashMap&lt;String, String&gt; itemHashMap=new HashMap&lt;String, String&gt;();
            itemHashMap.put("UserName", jsonObject.getJSONObject("BlogUsersSet").getString("UserNickname"));
            itemHashMap.put("CreateTime", jsonObject.getString("BlogCreateTime"));
            itemHashMap.put("Title", jsonObject.getString("BlogTitle"));
            itemHashMap.put("Content", jsonObject.getString("BlogContent"));
            itemHashMap.put("Comment", jsonObject.getString("BlogCommentNum"));
            itemHashMap.put("Visibility", jsonObject.getString("BlogReadNum"));
            mBlogList.add(itemHashMap); //这是一个List&lt;HashMap&lt;String,String&gt;&gt;
        }

    

    }

哈哈我们已经把 重服务器返回的数据放到List里了。

上面代码只是提共参考哟 完整代码请点击这里 

Android Studio配置 AndroidAnnotations

Posted on Leave a commentPosted in Android

以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置。

AndroidAnnotations是一个能够让你快速进行Android开发的开源框架,它能让你专注于真正重要的地方。使代码更加精简,使项目更加容易维护,它的目标就是“Fast Android Development.Easy maintainance”。 说白了 就是可以少写很多代码,哈哈。

AndroidAnnotations是一个开源项目 项目地址 有兴趣的朋友可以去研究一下。好了 废话不多说了。

1 我们需要把 AndroidAnnotations下载下来

2 新建文件夹 compile-libs

3 将androidannotations-3.2.jar 复制到 compile-libs 将 androidannotations-api-3.2.jar 复制到libs下

如:

4 在项目的build.gradle 添加 classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.4’

如:

5 在Model 的build.gradle  添加

5.1 apply plugin: ‘android-apt’

def AAVersion = ‘3.2+’

5.2  apt “org.androidannotations:androidannotations:$AAVersion”
compile “org.androidannotations:androidannotations-api:$AAVersion”
compile ‘com.android.support:support-v4:22.1.1’

5.3 apt {

arguments {

androidManifestFile variant.outputs[0].processResources.manifestFile

resourcePackageName ‘org.shuaibi.hi_blog’

}

}

如:

到这里配置就算完成了 下面来看一下 怎么使用

package org.shuaibi.hi_blog.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;
import org.shuaibi.hi_blog.R;

@EActivity(R.layout.activity_main)  //指定视图
public class MainActivity extends Activity {

    @ViewById(R.id.main_tv_hello)
    TextView mHelloWord; //绑定控件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Click(R.id.main_tv_hello) //点击事件按
    public void hello_Click() {
        Intent intent = new Intent(this, BlogDetailActivity_.class);
        startActivity(intent);
    }


    @AfterViews //视图加载完毕后执行
    public void init() {

        Toast.makeText(this, "视图加载完毕", Toast.LENGTH_SHORT).show();

    }

}

最后 要在 AndroidManifest 文件中 给Activity加上 _ (这是一个下横杠)

如果要在 Eclipse 中配置请 移步到这里–> 传送

对Android Studio 不是很熟 有什么不对的地方请多多指教