一个Android项目的总结
2019-05-23 本文已影响0人
csr_yang
从上周六开始准备开发,到今天测试通过正式验收。一共6天时间,完成了一个Android项目的开发。虽然这个项目比较简单,但是因为很久没有做Android开发了,还是多多少少碰到了一些技术问题并解决。这篇文章总结一下技术点,一些发现的问题以及解决的办法。
RecyclerView相关
- RecyclerView添加FooterView。
思路:把footerview当做recycleView的一个item。在Adapter中重写getItemViewType(int position)
方法getItemCount()
。定义FooterViewHolder extends RecyclerView.ViewHolder
然后在onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)
中针对footerview进行单独处理。
关键代码如下:
//为footerview设置单独的一种type
public static final int TYPE_FOOTER = 1;
@Override
public int getItemViewType(int position) {
if (position + 1 == mDatas.size() + 1){
return TYPE_FOOTER;
}
return super.getItemViewType(position);
}
//item的数量+1,把footerview当做最后一个item
@Override
public int getItemCount() {
return mDatas.size() + 1;
}
//创建一个单独的FooterViewHolder
public class FooterViewHolder extends RecyclerView.ViewHolder{
}
//根据type不同分别处理
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_FOOTER){
final View footerView = LayoutInflater.from(mContext).inflate(R.layout.adapter_foot_view,parent,false);
return new FooterViewHolder(footerView);
}else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_home_product,null);
ViewHolder viewHolder = new ViewHolder(view);
view.setOnClickListener(this);
return viewHolder;
}
}
//对不同的holder进行处理
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder != null){
if (holder instanceof FooterViewHolder){
((FooterViewHolder)holder).ll_shop_entrance.setVisibility(mShop ? View.GONE : View.VISIBLE);
}else{
//其他item的处理
......
}
}
}
- RecyclerView item的点击事件处理。
思路:使用代理设计模式。将处理事件放在要处理的代理对象那里处理。比如所在的Activity中处理。代码如下:
//定义一个接口
private OnItemClickListener mOnItemClickListener = null;
public static interface OnItemClickListener {
void onItemClick(View view , int position);
}
//对整个itemView注册点击事件
@Override
public void onClick(View view) {
if (mOnItemClickListener != null){
mOnItemClickListener.onItemClick(view,(int)view.getTag());
}
}
//对外部保暴露一个设置监听器的方法
public void setOnItemClickListener(OnItemClickListener listener){
this.mOnItemClickListener = listener;
}
//然后在adapter创建的地方,使用监听器。
//列表item跳转
adapter.setOnItemClickListener(new HomeProductAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//点击要做的事情..
}
});
- 为recyclerview item添加边距
思路:创建一个RecyclerView.ItemDecoration
的子类,然后重写getItemOffsets
方法
//设置item的下边距为20
recyclerview.addItemDecoration(new SpacesItemDecoration(20));
//SpacesItemDecoration.java
private int bottom;
public SpacesItemDecoration(int bottom) {
this.bottom = bottom;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
if (layoutManager.getOrientation() == LinearLayoutManager.VERTICAL){
outRect.bottom = bottom;
}
}
- RecyclerView下拉刷新加载更多
使用第三方控件UltimateRecyclerView
recyclerView.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
}
});
recyclerView.setOnLoadMoreListener(new UltimateRecyclerView.OnLoadMoreListener() {
@Override
public void loadMore(int itemsCount, int maxLastVisiblePosition) {
}
});
Webview相关
- 加载url 出现空白,图片显示不全等问题。
解决方法:初始化webview时需要进行一些设置,不能使用默认的设置。
WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
settings.setJavaScriptEnabled(true);
settings.setBlockNetworkImage(false);
settings.setLoadsImagesAutomatically(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ){
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
- webview加载本地html
主要就是从assets文件夹加载content 然后webview加载内容
String content = getFromAssets(String.format("%s.html",fileName));
webView.loadDataWithBaseURL(null, content, "text/html", "utf-8", null);