首页 > 代码库 > 对WebView接口的实现
对WebView接口的实现
MainActivity
package www.wulian1.com.webview;
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
WebView webView=(WebView)findViewById(R.id.wv_zknu); webView.loadUrl("http://10.10.192.58:83/zknu84/index.html");
//webView.getSettings().setUseWideViewPort(true); //webView.getSettings().setLoadWithOverviewMode(true); } }
MyAdapter
package www.wulian1.com.webview;
import android.app.Activity; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView;
import java.util.List;
/** * Created by Administrator on 2017/5/18. */ public class MyAdapter extends BaseAdapter { public List<StuManage> stuList; public Activity activity; public MyAdapter(List<StuManage> stuList,Activity activity){ this.stuList=stuList; this.activity=activity; } public void setList(List<StuManage> stuList) { this.stuList=stuList; } @Override public int getCount() { return this.stuList.size(); }
@Override public Object getItem(int position) { return this.stuList.get(position); }
@Override public long getItemId(int position) { return position; }
@Override public View getView(int position, View convertView, ViewGroup parent) { View view=activity.getLayoutInflater().inflate(R.layout.adapter_item,null); TextView tv_name=(TextView)view.findViewById(R.id.tv_name); TextView tv_age=(TextView)view.findViewById(R.id.tv_age); tv_name.setText(this.stuList.get(position).getName()); tv_age.setText(this.stuList.get(position).getAge()+""); return view; } }
PhpActivity
package www.wulian1.com.webview;
import android.content.SharedPreferences; import android.icu.text.IDNA; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ListView; import android.widget.Toast;
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken;
import org.json.JSONObject; import org.xml.sax.ErrorHandler;
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.util.List;
public class PHPActivity extends AppCompatActivity {
ListView listView; List<StuManage> stuList=null;
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); String abc = (String) msg.obj; Toast.makeText(PHPActivity.this, "我输出的字符:" + abc, Toast.LENGTH_SHORT).show(); switch (msg.what) { case 200: //获取到数据 //List<StuManage> stuList=(List<StuManage>)msg.obj; if(stuList!=null &&stuList.size()>0) { MyAdapter myAdapter = new MyAdapter(stuList, PHPActivity.this); listView.setAdapter(myAdapter); } else { Toast.makeText(PHPActivity.this,"没有数据",Toast.LENGTH_SHORT).show(); } break; case 2: //获取失败 Toast.makeText(PHPActivity.this,"获取数据失败",Toast.LENGTH_SHORT).show(); break; case 0: //获取发生异常 Toast.makeText(PHPActivity.this,"获取数据异常",Toast.LENGTH_SHORT).show(); break; default: //其他情况 Toast.makeText(PHPActivity.this,"获取数据异常",Toast.LENGTH_SHORT).show(); } } };
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_php);
listView=(ListView)findViewById(R.id.lv_1); SharedPreferences sp=this.getSharedPreferences("WebView",MODE_PRIVATE); String dataString=sp.getString("name",""); if (!"".equals(dataString)){ Gson gson=new Gson(); try{ JSONObject jsonObject=new JSONObject(dataString); String timestamp=jsonObject.getString("timestamp"); StuManage stuManage=gson.fromJson(dataString,StuManage.class); Long nowtimestamp=System.currentTimeMillis(); Long offday=(nowtimestamp - stuManage.getTimestamp())/(1000*60*60*24); Log.d("84","offday="+offday); if (offday<30){ //从缓存中获取数据 dataget(); Toast.makeText(PHPActivity.this,"未过期",Toast.LENGTH_SHORT).show(); Log.d("84","距离上次天数为"+offday); }else { getDataFromService(); Toast.makeText(PHPActivity.this,"已过期",Toast.LENGTH_SHORT).show(); Log.d("84","距离上次天数为"+offday); } }catch (Exception e){ e.printStackTrace(); Toast.makeText(PHPActivity.this,"获取时间异常",Toast.LENGTH_SHORT).show(); Log.d("84","获取时间异常"); } }else { //没拿到数据,重新获取数据 getDataFromCache(); }
Button btn_getstring = (Button) findViewById(R.id.btn_1); Button btn_getjson = (Button) findViewById(R.id.btn_2);
btn_getjson.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getDataFromCache()) { //拿到数据,绑定数据 MyAdapter myAdapter=new MyAdapter(stuList,PHPActivity.this); listView.setAdapter(myAdapter);
Log.d("84","cache"); } else { getDataFromService(); Log.d("84","Service"); }
// Toast.makeText(PHPActivity.this,"准备完成",Toast.LENGTH_SHORT).show(); } }); }
private void dataget() { if (getDataFromCache()){ MyAdapter myAdapter=new MyAdapter(stuList,PHPActivity.this); listView.setAdapter(myAdapter); }else { getDataFromService(); } }
public String readInfoStream(InputStream input) throws Exception { if (input == null) { throw new Exception("输入流为null"); } //字节数组 byte[] bcache = new byte[2048]; int readSize = 0;//每次读取的字节长度 int totalSize = 0;//总字节长度 ByteArrayOutputStream infoStream = new ByteArrayOutputStream(); try { //一次性读取2048字节 while ((readSize = input.read(bcache)) > 0) { totalSize += readSize;
//将bcache中读取的input数据写入infoStream infoStream.write(bcache, 0, readSize); } } catch (IOException e1) { throw new Exception("输入流读取异常"); } finally { try { //输入流关闭 input.close(); } catch (IOException e) { throw new Exception("输入流关闭异常"); } }
try { return infoStream.toString("utf-8"); } catch (UnsupportedEncodingException e) { throw new Exception("输出异常"); } }
private boolean getDataFromCache() { try { SharedPreferences sharedPreferences = PHPActivity.this.getSharedPreferences("WebView", MODE_PRIVATE); String data = http://www.mamicode.com/sharedPreferences.getString("data", ""); //JSONObject jsonObject=new JSONObject(data); //String code=jsonObject.get("code").toString(); if (data != "") { // String datas=jsonObject.get("datas").toString(); Gson gson = new Gson(); stuList = gson.fromJson(data, new TypeToken<List<StuManage>>() { }.getType()); return true; } else { stuList = null; return false; } } catch (Exception e) { e.printStackTrace(); stuList = null; return false; } }
private void getDataFromService() { final String path = "http://10.10.192.58:83/Json/Json.php"; new Thread() { @Override public void run() { super.run(); try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); Log.d("84", "try -1"); int code = conn.getResponseCode(); if (code == 200) { Log.d("84", "code==200"); InputStream inputStream = conn.getInputStream(); String abc = readInfoStream(inputStream); Gson gson = new Gson(); stuList = gson.fromJson(abc, new TypeToken<List<StuManage>>() { }.getType()); SharedPreferences sharedPreferences = getSharedPreferences("WebView", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("studata", abc);
//StuManage stuManage=new StuManage(); //stuManage.setTimestamp(System.currentTimeMillis()); //Gson gson=new Gson();
Log.d("84", "stulist 获取数据正常"); Message message = new Message(); message.obj = abc; message.what = 200; handler.sendMessage(message); } else { Message message = new Message(); message.what = 2; handler.sendMessage(message); Log.d("84", "请求失败"); } } catch (Exception e) { Message message = new Message(); message.what = 0; handler.sendMessage(message); Log.d("84", "Exception"); } } }.start(); } }
StudentListactivity
package www.wulian1.com.webview;
import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.ListView; import android.widget.Toast;
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List;
import www.wulian1.com.webview.MyViews.AutoListView;
public class StudentListactivity extends AppCompatActivity implements AutoListView.OnLoadListener,AutoListView.OnRefreshListener { List<StuManage> stuList=null; int pageindex=1; AutoListView autoListView; MyAdapter myAdapter; //定义一个在主线程和子线程直接进行通信的一个**东西 handler private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 200: //完成数据绑定 if(stuList!=null) { //绑定数据 if(myAdapter==null) { myAdapter=new MyAdapter(stuList,StudentListactivity.this); autoListView.setAdapter(myAdapter); Log.d("zh","autoListView.setAdapter 第一绑定 "); } else { myAdapter.setList(stuList); myAdapter.notifyDataSetChanged(); Log.d("zh","加载更多后, notifyDataSetChanged "); }
} else { Toast.makeText(StudentListactivity.this,"没有数据",Toast.LENGTH_SHORT).show(); } autoListView.onRefreshComplete(); autoListView.onLoadComplete();
break; case -1: //获取失败 Toast.makeText(StudentListactivity.this,"获取失败",Toast.LENGTH_SHORT).show(); break; case -2: //获取发生异常 Toast.makeText(StudentListactivity.this,"获取发生异常",Toast.LENGTH_SHORT).show(); break; default: //其他情况 Toast.makeText(StudentListactivity.this,"获取发生异常",Toast.LENGTH_SHORT).show(); }
} };
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_studentlist); autoListView=(AutoListView) findViewById(R.id.lv_stulist); autoListView.setOnRefreshListener(this); autoListView.setOnLoadListener(this); //从缓存获取数据 // if(getDataFromCache()) // { // //绑定数据 // StuAdapter stuAdapter=new StuAdapter(stulist,StudentListactivity.this); // autoListView.setAdapter(stuAdapter); // } // else // { //从服务器获取数据 getDataFromService(1);
//}
} private String inputstream2string(InputStream inputStream) { try { ByteArrayOutputStream baos=new ByteArrayOutputStream(); int length=0; byte[] buffer=new byte[1024]; while((length=inputStream.read(buffer))!=-1){ baos.write(buffer, 0, length); } inputStream.close(); baos.close(); //或者用这种方法 //byte[] result=baos.toByteArray(); //return new String(result); return baos.toString(); } catch (Exception e) { e.printStackTrace(); return "获取失败"; } } ///返回true 说明成功从cache拿到数据 返回false 说明没有拿到 private boolean getDataFromCache() { try { SharedPreferences sp = StudentListactivity.this.getSharedPreferences("person", MODE_PRIVATE); String data = http://www.mamicode.com/sp.getString("studata", ""); //所有信息 JSONObject jsonObject=new JSONObject(data); String studata= http://www.mamicode.com/jsonObject.getString("data"); //是否过期
if (data != "") { Gson gson = new Gson(); stuList = gson.fromJson(data, new TypeToken<List<StuManage>>() { }.getType()); //暂时没有时间过期的判断 return true; } else { stuList=null; return false; } }catch (Exception ex) { ex.printStackTrace(); stuList=null; return false; }
} private void getDataFromService(int pindex ) { final String path="http://10.10.192.58:83/Json/Stu.php?pageindex="+pindex; Log.d("zh","path= "+path); // 开线程 new Thread(){ @Override public void run() { super.run(); //获取数据 try { URL url = new URL(path); HttpURLConnection conn=(HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); //必须大写 conn.setConnectTimeout(5000); Log.d("zh","try -1 "); int code=conn.getResponseCode(); if(code==200) { Log.d("zh","code==200 "); //请求成功 InputStream inputStream=conn.getInputStream(); //然后把输入流转为字符串 。上网找一个把流转为字符串的函数 String abc=inputstream2string(inputStream); //解析json字符串 //先拿到code 。 判断code是否等于200 // {"code":200,"pageindex":10,"isover":1,"data":[{"name":"\u5f20\u5b8f90","age":91},{"name":"\u5f20\u5b8f91","age":92},{"name":"\u5f20\u5b8f92","age":93},{"name":"\u5f20\u5b8f93","age":94},{"name":"\u5f20\u5b8f94","age":95},{"name":"\u5f20\u5b8f95","age":96},{"name":"\u5f20\u5b8f96","age":97},{"name":"\u5f20\u5b8f97","age":98},{"name":"\u5f20\u5b8f98","age":99},{"name":"\u5f20\u5b8f99","age":100}]}
JSONObject jsonObject=new JSONObject(abc); if(jsonObject.getString("code").equals("200")) { //如果等于200。 服务器数据有效的
String studata= http://www.mamicode.com/jsonObject.getString("data"); Gson gson=new Gson();
//studata=http://www.mamicode.com/[{"name":"\u5f20\u5b8f90","age":91},。。。。] List<StuManage> stulist_temp = gson.fromJson(studata, new TypeToken<List<StuManage>>(){}.getType()); // 程序如果走到这个位置 。说明数据符合json格式。这时候我要把数据使用sharedpreference保存起来 //android 内存缓存 SharedPreferences sp=getSharedPreferences("person",MODE_PRIVATE); //person是文件名. SharedPreferences.Editor editor=sp.edit(); editor.putString("studata",abc);//按照关键字 studata。 把字符串保存起来 //修改当前yema pageindex= Integer.parseInt(jsonObject.getString("pageindex")); Log.d("zh","获取的为第"+pageindex+"页的数据"); if(pageindex>1) { stuList.addAll(stulist_temp); Log.d("zh","合并数据"); } else { stuList= new ArrayList<StuManage>(); stuList=stulist_temp; Log.d("zh","新数据"); } //把数据存储到 Log.d("zh","stulist 获取数据正常"); Message message=new Message(); message.obj=abc; //定义带有数据的消息 message.what=200; //200代码获取数据正常 handler.sendMessage(message); Log.d("zh","发送消息正常"); } else { //返回码不是200的情况 Message message=new Message(); message.obj=abc; //定义带有数据的消息 message.what=202; //200代码获取数据正常 handler.sendMessage(message); Log.d("zh","发送消息正常"); } } else { //请求失败 Message message=new Message(); message.what=-1; //-1 代码获取数据失败 handler.sendMessage(message); Log.d("zh","请求失败"); } } catch (Exception ex) { Message message=new Message(); message.what=-2; //-1 代码获取数据时发生异常情况 //发送消息 handler.sendMessage(message); Log.d("zh","Exception");
} } }.start();
}
@Override public void onl oad() { int pageindex_temp= pageindex+1; getDataFromService(pageindex_temp); Log.d("zh","onLoad----加载更多"); }
@Override public void onRefresh() { pageindex=1;
getDataFromService(pageindex); Log.d("zh","onRefresh----下拉刷新");
} }
StuManage
package www.wulian1.com.webview;
/** * Created by Administrator on 2017/5/18. */ public class StuManage { String name; int age; long timestamp;
public long getTimestamp() { return timestamp; }
public void setTimestamp(long timestamp) { this.timestamp = timestamp; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; } }
Utils
package www.wulian1.com.webview;
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale;
/** * Created by Administrator on 2017/5/22. */ public class Utils { public static String getCurrentTime(String format) { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault()); String currentTime = sdf.format(date); return currentTime; }
public static String getCurrentTime() { return getCurrentTime("yyyy-MM-dd HH:mm:ss"); } }
MyViews
AutoListView
package www.wulian1.com.webview.MyViews;
import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import android.widget.AbsListView; import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView;
import www.wulian1.com.webview.R; import www.wulian1.com.webview.Utils;
/** * Created by Administrator on 2017/5/25. */ public class AutoListView extends ListView implements AbsListView.OnScrollListener {
// 区分当前操作是刷新还是加载 public static final int REFRESH = 0; public static final int LOAD = 1;
// 区分PULL和RELEASE的距离的大小 private static final int SPACE = 20;
// 定义header的四种状态和当前状态 private static final int NONE = 0; private static final int PULL = 1; private static final int RELEASE = 2; private static final int REFRESHING = 3; private int state;
private LayoutInflater inflater; private View header; private View footer; private TextView tip; private TextView lastUpdate; private ImageView arrow; private ProgressBar refreshing;
private TextView noData; private TextView loadFull; private TextView more; private ProgressBar loading;
private RotateAnimation animation; private RotateAnimation reverseAnimation;
private int startY;
private int firstVisibleItem; private int scrollState; private int headerContentInitialHeight; private int headerContentHeight;
// 只有在listview第一个item显示的时候(listview滑到了顶部)才进行下拉刷新, 否则此时的下拉只是滑动listview private boolean isRecorded; private boolean isLoading;// 判断是否正在加载 private boolean loadEnable = true;// 开启或者关闭加载更多功能 private boolean isLoadFull; private int pageSize = 10;
private OnRefreshListener onRefreshListener; private onl oadListener onl oadListener;
public AutoListView(Context context) { super(context); initView(context); }
public AutoListView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); }
public AutoListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(context); }
// 下拉刷新监听 public void setOnRefreshListener(OnRefreshListener onRefreshListener) { this.onRefreshListener = onRefreshListener; }
// 加载更多监听 public void setOnLoadListener(OnLoadListener onl oadListener) { this.loadEnable = true; this.onLoadListener = onl oadListener; }
public boolean isLoadEnable() { return loadEnable; }
// 这里的开启或者关闭加载更多,并不支持动态调整 public void setLoadEnable(boolean loadEnable) { this.loadEnable = loadEnable; this.removeFooterView(footer); }
public int getPageSize() { return pageSize; }
public void setPageSize(int pageSize) { this.pageSize = pageSize; }
// 初始化组件 private void initView(Context context) {
// 设置箭头特效 animation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); animation.setInterpolator(new LinearInterpolator()); animation.setDuration(100); animation.setFillAfter(true);
reverseAnimation = new RotateAnimation(-180, 0, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); reverseAnimation.setInterpolator(new LinearInterpolator()); reverseAnimation.setDuration(100); reverseAnimation.setFillAfter(true);
inflater = LayoutInflater.from(context); footer = inflater.inflate(R.layout.listview_footer, null); footer.setTag("footer"); loadFull = (TextView) footer.findViewById(R.id.loadFull); noData = http://www.mamicode.com/(TextView) footer.findViewById(R.id.noData); more = (TextView) footer.findViewById(R.id.more); loading = (ProgressBar) footer.findViewById(R.id.loading);
header = inflater.inflate(R.layout.pull_to_refresh_header, null); header.setTag("header"); arrow = (ImageView) header.findViewById(R.id.arrow); tip = (TextView) header.findViewById(R.id.tip); lastUpdate = (TextView) header.findViewById(R.id.lastUpdate); refreshing = (ProgressBar) header.findViewById(R.id.refreshing);
// 为listview添加头部和尾部,并进行初始化 headerContentInitialHeight = header.getPaddingTop(); measureView(header); headerContentHeight = header.getMeasuredHeight();//获取头布局的的高度 topPadding(-headerContentHeight);//设置头布局的位置 this.addHeaderView(header); this.addFooterView(footer); this.setOnScrollListener(this); }
public void onRefresh() { if (onRefreshListener != null) { onRefreshListener.onRefresh(); } }
public void onl oad() { if (onLoadListener != null) { onl oadListener.onLoad(); } }
public void onRefreshComplete(String updateTime) { lastUpdate.setText(this.getContext().getString(R.string.lastUpdateTime, Utils.getCurrentTime())); state = NONE; refreshHeaderViewByState(); //改变头部的提示信息 }
// 用于下拉刷新结束后的回调 public void onRefreshComplete() { String currentTime = Utils.getCurrentTime(); onRefreshComplete(currentTime); }
// 用于加载更多结束后的回调 public void onl oadComplete() { isLoading = false; }
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { this.firstVisibleItem = firstVisibleItem; }
@Override public void onScrollStateChanged(AbsListView view, int scrollState) { this.scrollState = scrollState; ifNeedLoad(view, scrollState); }
// 根据listview滑动的状态判断是否需要加载更多 private void ifNeedLoad(AbsListView view, int scrollState) { if (!loadEnable) { return; } try { if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && !isLoading && view.getLastVisiblePosition() == view .getPositionForView(footer) && !isLoadFull) { onl oad(); isLoading = true; } } catch (Exception e) { } }
/** * 监听触摸事件,解读手势 */ @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: if (firstVisibleItem == 0) { isRecorded = true; startY = (int) ev.getY(); } break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (state == PULL) { state = NONE; refreshHeaderViewByState(); } else if (state == RELEASE) { state = REFRESHING; refreshHeaderViewByState(); onRefresh(); } isRecorded = false; break; case MotionEvent.ACTION_MOVE: whenMove(ev); break; } return super.onTouchEvent(ev); }
// 解读手势,刷新header状态 private void whenMove(MotionEvent ev) { if (!isRecorded) { return; } int tmpY = (int) ev.getY(); int space = tmpY - startY; int topPadding = space - headerContentHeight; switch (state) { case NONE: if (space > 0) { state = PULL; refreshHeaderViewByState(); } break; case PULL: topPadding(topPadding); if (scrollState == SCROLL_STATE_TOUCH_SCROLL && space > headerContentHeight + SPACE) { state = RELEASE; refreshHeaderViewByState(); } break; case RELEASE: topPadding(topPadding); if (space > 0 && space < headerContentHeight + SPACE) { state = PULL; refreshHeaderViewByState(); } else if (space <= 0) { state = NONE; refreshHeaderViewByState(); } break; }
}
// 调整header的大小。其实调整的只是距离顶部的高度。 private void topPadding(int topPadding) { header.setPadding(header.getPaddingLeft(), topPadding, header.getPaddingRight(), header.getPaddingBottom()); header.invalidate(); }
/** * 这个方法是根据结果的大小来决定footer显示的。 * <p> * 这里假定每次请求的条数为10。如果请求到了10条。则认为还有数据。如过结果不足10条,则认为数据已经全部加载,这时footer显示已经全部加载 * </p> * * @param resultSize */ public void setResultSize(int resultSize,String isover) { if (resultSize == 0) { isLoadFull = true; loadFull.setVisibility(View.GONE); loading.setVisibility(View.GONE); more.setVisibility(View.GONE); noData.setVisibility(View.VISIBLE); } else if (isover.equals("1")) { isLoadFull = true; loadFull.setVisibility(View.VISIBLE); loading.setVisibility(View.GONE); more.setVisibility(View.GONE); noData.setVisibility(View.GONE); } else if (isover.equals("0")) { isLoadFull = false; loadFull.setVisibility(View.GONE); loading.setVisibility(View.VISIBLE); more.setVisibility(View.VISIBLE); noData.setVisibility(View.GONE); } }
// 根据当前状态,调整header private void refreshHeaderViewByState() { switch (state) { case NONE: topPadding(-headerContentHeight); tip.setText(R.string.pull_to_refresh); refreshing.setVisibility(View.GONE); arrow.clearAnimation(); arrow.setImageResource(R.mipmap.pull_to_refresh_arrow); break; case PULL: arrow.setVisibility(View.VISIBLE); tip.setVisibility(View.VISIBLE); lastUpdate.setVisibility(View.VISIBLE); refreshing.setVisibility(View.GONE); tip.setText(R.string.pull_to_refresh); arrow.clearAnimation(); arrow.setAnimation(reverseAnimation); break; case RELEASE: arrow.setVisibility(View.VISIBLE); tip.setVisibility(View.VISIBLE); lastUpdate.setVisibility(View.VISIBLE); refreshing.setVisibility(View.GONE); tip.setText(R.string.pull_to_refresh); tip.setText(R.string.release_to_refresh); arrow.clearAnimation(); arrow.setAnimation(animation); break; case REFRESHING: topPadding(headerContentInitialHeight); refreshing.setVisibility(View.VISIBLE); arrow.clearAnimation(); arrow.setVisibility(View.GONE); tip.setVisibility(View.GONE); lastUpdate.setVisibility(View.GONE); break; } }
// 用来计算header大小的。比较隐晦。因为header的初始高度就是0,貌似可以不用。 private void measureView(View child) { ViewGroup.LayoutParams p = child.getLayoutParams(); if (p == null) { p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width); int lpHeight = p.height; int childHeightSpec; if (lpHeight > 0) { childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); } else { childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } child.measure(childWidthSpec, childHeightSpec); }
/* * 定义下拉刷新接口 */ public interface OnRefreshListener { public void onRefresh(); }
/* * 定义加载更多接口 */ public interface onl oadListener { public void onl oad(); } public boolean isFooter(View view) { Object tag=view.getTag(); if(tag!=null) { if (view.getTag().equals(footer.getTag())) { return true; } else { return false; } } else { return false; } } public boolean isHeader(View view) { Object tag=view.getTag(); if(tag!=null) { if (view.getTag().equals(header.getTag())) { return true; } else { return false; } } else { return false; } }
}
对WebView接口的实现