一个简单的生活服务类的小项目,为了方便以后的使用,总结一下。
主页面:
多人合作开发,三天的时间,赶出来的项目,本人主要负责的是搜索功能,所以在此整理一下,以方便日后遇到类似的项目,做为使用。
常见注意点:
自动以Application集成Application,在清单文件里面引用
去除ActionBar,一般也在清单文件里面直接修改android:theme=”@style/AppTheme”里面的属性,点进去,
改成parent=”Theme.AppCompat.Light.NoActionBar”取消ActionBar。
页面的标题,一般也常用一个XML布局,通过include引用,统一样式。
布局都没什么说的了。主要是自定义BaseActivity继承AutoLayout,适配布局。使用px布局。其他类继承BaseActivity。
AutoLayout适配的格式:
<meta-data
android:name="design_width"
android:value="768" />
<meta-data
android:name="design_height"
android:value="1280" />
然后就是权限的注意点,不要忘记添加用到的权限,例如联网权限。
Activity的模式,常用的就是默认模式和单例模式(清单文件里面,在activity里添加 android:launchMode=”singleTask”)
针对接口进行网络请求,用的是一个封装好的okHttp工具类,直接粘贴进去,调用方法使用
这里小飞机:okHttp封装的工具类
在成功方法里面,
这里正常接口的请求,用Gson解析数据,直接在AS里面下载导入的Jar包。
Gson gson=new Gson();
Bean bean= gson.fromJson(结果集, Bean.class);
这次的接口最外层没有集合名字,所以改成请求数组的方式,遍历数组对象,添加到集合中:
//Gson解析
Gson gson = new Gson();
//返回数组对象,用SearchBean[],用最外层Bean对象解析,无法使用数据,根据接口数据更改了解析方式
bean = gson.fromJson(result, SearchBean[].class);
//遍历解析获取的数组对象,添加到到集合对象中
for (SearchBean sb : bean) {
listBean.add(sb);
}
接口展示的数据有page分页,所以在写代码的时候,也引用了一个全局变量,拼接URL展示数据和加载数据。
上拉加载下拉刷新用的是XlistView,也是直接粘贴工具类,添加图片,添加其他res-values-string里面的string值。
这里小飞机下载:XlistViewTest上拉加载下拉刷新
<com.shaoshan.play.goeat.fragment.seachfragment.xlistview.XListView
android:id="@+id/list_search"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#00000000"
android:dividerHeight="30px"> </com.shaoshan.play.goeat.fragment.seachfragment.xlistview.XListView>
Adapter适配器的一些:
需要更新适配器的地方用上: 适配器.notifyDataSetChanged();
适配器里面通过简单的条目位置判断,赋值不同的效果序号原点
//判断条目位置,设置不同图片显示,让1,2,3位置的条目显示亮色序号
//通过对TextView设置背景实现
if(i==0||i==1||i==2){
vh.item_search_number.setBackgroundResource(R.drawable.bg_1);
}else {
vh.item_search_number.setBackgroundResource(R.drawable.bg_2);
}
//序号显示为角标+1
vh.item_search_number.setText(i + 1 + "");
vh.item_search_str.setText(listBean.get(i).getStr());
vh.item_search_click.setText(listBean.get(i).getClick());
适配器里面设置条件,控制显示的数据:
//获取内容数据
des = listBean.get(position).getDes();
//声明一个新字符串,用来接收内容数据
desNew = null;
//判断长度,字符串截取substring(0, 54),控制显示的内容长度
if (des.length() > 55) {
desNew = des.substring(0, 54) + "...";
} else {
desNew = des;
}
titleViewHolder.item_search_title.setText(listBean.get(position).getTitle());
titleViewHolder.item_search_details.setText(desNew);
适配器里面,多种条目的加载和显示:
主要代码:
public class SearchListAdapter extends BaseAdapter {
//创建类,继承BaseAdapter,重写方法:
private Context context;
private List<SearchListBean> listBean;
public SearchListAdapter(Context context, List<SearchListBean> listBean) {
this.context = context;
this.listBean = listBean;
}
//设置常量值,区分两种不同的条目的标识
public static final int TYPE_TITLE = 0;
public static final int TYPE_IMAGE = 1;
@Override
public int getCount() {
//返回长度
return listBean.size();
}
@Override
public Object getItem(int i) {
// return listBean.get(i);
//返回空
return null;
}
@Override
public long getItemId(int i) {
// return i;
//返回0
return 0;
}
/**
* 重写getItemViewType方法,识别的是条目选项,在这里区分格式
*/
@Override
public int getItemViewType(int position) {
//通过判断集合数据的Des是否为空,区分不同条目
if (listBean.get(position).getLogo().equals("0.gif")) {
//按不同类型返回类型标识
return TYPE_TITLE;
} else {
return TYPE_IMAGE;
}
}
/**
* 重写getViewTypeCount方法,返回的是不同条目的类型数量
*/
@Override
public int getViewTypeCount() {
return 2;
}
//自定义内部类优化类
class TitleViewHolder {
TextView item_search_title;
TextView item_search_details;
}
//自定义内部类优化类
class ImageViewHolder {
TextView item_search_title;
TextView item_search_date;
TextView item_search_details;
ImageView item_search_image;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
//声明类对象
ImageViewHolder imageViewHolder;
TitleViewHolder titleViewHolder;
//通过得到返回的不同条目类型的标识来分别加载数据
switch (getItemViewType(position)) {
case TYPE_TITLE:
if (convertView == null) {
convertView = View.inflate(context, R.layout.item_search_list1, null);
titleViewHolder = new TitleViewHolder();
titleViewHolder.item_search_title = (TextView) convertView.findViewById(R.id.item_search_title);
titleViewHolder.item_search_details = (TextView) convertView.findViewById(item_search_details);
convertView.setTag(titleViewHolder);
} else {
titleViewHolder = (TitleViewHolder) convertView.getTag();
}
//获取内容数据
des = listBean.get(position).getDes();
//声明一个新字符串,用来接收内容数据
desNew = null;
//判断长度,字符串截取substring(0, 54),控制显示的内容长度
if (des.length() > 55) {
desNew = des.substring(0, 54) + "...";
} else {
desNew = des;
}
titleViewHolder.item_search_title.setText(listBean.get(position).getTitle());
titleViewHolder.item_search_details.setText(desNew);
break;
//另一个条目的加载
case TYPE_IMAGE:
if (convertView == null) {
convertView = View.inflate(context, R.layout.item_search_list2, null);
imageViewHolder = new ImageViewHolder();
imageViewHolder.item_search_title = (TextView) convertView.findViewById(R.id.item_search_title);
imageViewHolder.item_search_details = (TextView) convertView.findViewById(R.id.item_search_details);
imageViewHolder.item_search_date = (TextView) convertView.findViewById(R.id.item_search_date);
imageViewHolder.item_search_image = (ImageView) convertView.findViewById(R.id.item_search_image);
convertView.setTag(imageViewHolder);
} else {
imageViewHolder = (ImageViewHolder) convertView.getTag();
}
//拼接图片地址
logo = listBean.get(position).getLogo();
//网络图片资源地址
String url = "http://appserver.1035.mobi/MobiSoftManage/upload/" + logo;
//获取内容数据
des = listBean.get(position).getDes();
//声明一个新字符串,用来接收内容数据
desNew = null;
//判断长度,字符串截取substring(0, 54),控制显示的内容长度
if (des.length() > 30) {
desNew = des.substring(0, 29) + "...";
} else if(des.length()>2){
desNew = des;
}else {
desNew=listBean.get(position).getRegtime();
}
imageViewHolder.item_search_title.setText(listBean.get(position).getTitle());
imageViewHolder.item_search_details.setText(desNew);
// imageViewHolder.item_search_date.setText(listBean.get(position).getRegtime());
//通过Glide加载网络图片资源
//添加依赖:compile 'com.github.bumptech.glide:glide:3.5.2'
Glide.with(context).load(url).into(imageViewHolder.item_search_image);//加载网络图片
Glide.with(context).load(url).skipMemoryCache(true).into(imageViewHolder.item_search_image);//跳过内存缓存
Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageViewHolder.item_search_image);//跳过硬盘缓存
break;
}
return convertView;
}}
附上两个搜索页面的代码;
上面显示的搜索页面代码:
package com.shaoshan.play.goeat.fragment.seachfragment;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.shaoshan.play.goeat.R;
import com.shaoshan.play.goeat.fragment.seachfragment.adapter.SearchAdapter;
import com.shaoshan.play.goeat.fragment.seachfragment.bean.SearchBean;
import com.shaoshan.play.goeat.fragment.seachfragment.xlistview.XListView;
import com.shaoshan.play.goeat.utils.OkHttp;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Request;
/**
* Created by DELL on 2016/12/5.
*/
public class SeachFragment extends Fragment implements View.OnClickListener {
//声明控件
private ImageView back;
private TextView title_name;
private ImageView title_img;
private LinearLayout linconent;
private TextView textView_search;
private EditText editText_search;
private Button button_search;
//XListView
// android:divider="#00000000",布局文件里面,设置间隔为透明色
// android:dividerHeight="30px",设置间隔高度
private XListView list_search;
//SearchBean对象的集合
private List<SearchBean> listBean = new ArrayList<SearchBean>();
//EditText获取的输入信息
private String editTextSearch;
//适配器
private SearchAdapter searchAdapter;
//解析数据的对象数组集合
private SearchBean[] bean;
//全部变量,默认1,用来判断page页
private int i = 1;
private View view;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.seachfragment, null);
initView(view);
initData();
return view;
}
/**
* 加载热点搜索排行列表数据
*/
private void initData() {
//拼接接口地址
String url = "http://appserver.1035.mobi/MobiSoft/SchKey_Cid?id=2024&size=12&page=" + i;
//调用工具类,进行网络请求
OkHttp.getAsync(url, new OkHttp.DataCallBack() {
//失败的方法
@Override
public void requestFailure(Request request, IOException e) {
}
//成功的方法
@Override
public void requestSuccess(String result) throws Exception {
//Gson解析
Gson gson = new Gson();
//返回数组对象,用SearchBean[],用最外层Bean对象解析,无法使用数据,根据接口数据更改了解析方式
bean = gson.fromJson(result, SearchBean[].class);
//通过判断集合长度,判断是否还有数据
if (bean.length < 2) {
//吐司无更多消息
Toast.makeText(getActivity(), "无更多信息", Toast.LENGTH_SHORT).show();
//return自我消耗
return;
}
//遍历解析获取的数组对象,添加到到集合对象中
for (SearchBean sb : bean) {
listBean.add(sb);
}
//通过判断全局变量,判断是否绑定一次适配器,之后结合上拉加载等,防止重新多次的绑定适配器
if (i < 2) {
list_search.setAdapter(searchAdapter);
}
}
});
}
/**
* 加载控件对象
*
* @param view
*/
private void initView(View view) {
//因为是Fragment所以从当前的View对象获取资源对象
back = (ImageView) view.findViewById(R.id.back);
title_name = (TextView) view.findViewById(R.id.title_name);
title_img = (ImageView) view.findViewById(R.id.title_img);
linconent = (LinearLayout) view.findViewById(R.id.linconent);
editText_search = (EditText) view.findViewById(R.id.editText_search);
button_search = (Button) view.findViewById(R.id.button_search);
textView_search = (TextView) view.findViewById(R.id.textView_search);
list_search = (XListView) view.findViewById(R.id.list_search);
//创建适配器,传值,
searchAdapter = new SearchAdapter(listBean, getActivity());
//list_search.setAdapter(searchAdapter);
//设置XlistView对象,和方法,重写数据和功能
setSXlistView();
//设置监听
setSListener();
}
private void setSXlistView() {
//设置激活上拉加载更多
list_search.setPullLoadEnable(true);
//设置XListView监听状态
list_search.setXListViewListener(new XListView.IXListViewListener() {
@Override//刷新
public void onRefresh() {
//1.清空之前集合的数据
//2.加载新数据
//3.通知适配器刷新
//4.停止刷新
stopXlistView();
}
@Override//加载更多
public void onLoadMore() {
//加载一次,计数一次+1,结合接口的page页面加载第二页面数据,并且追加进集合中
i = i + 1;
//1.加载新数据
//2.把新数据追加到集合里
initData();
//3.通知适配器刷新
searchAdapter.notifyDataSetChanged();
//4.停止加载更多
stopXlistView();
}
});
}
/**
* 设置XlistView()停止刷新
*/
public void stopXlistView() {
//设置刷新时间
// list_search.setRefreshTime("0000-00-00");
//停止加载更多
list_search.stopLoadMore();
//停止刷新
list_search.stopRefresh();
}
/**
* 设置监听
*/
private void setSListener() {
editText_search.setOnClickListener(this);
// list_search_look.setOnClickListener(this);
button_search.setOnClickListener(this);
//监听点击的当前条目,执行EditText赋值功能
list_search.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//声明一个字符串
private String str;
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//获取当前点击的条目信息
str = listBean.get(i - 1).getStr();
//设置信息到EditText
editText_search.setText(str);
//设置EditText的文字颜色
editText_search.setTextColor(Color.BLACK);
}
});
}
//点击监听
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_search:
//判断EditText是否为空,否则获取EditText输入的数据,跳转传值
submit();
//跳转传值
Intent intent = new Intent(getActivity(), SearchList.class);
intent.putExtra("editTextSearch", editTextSearch);
startActivity(intent);
break;
//填写数据的时候,刷新一下适配器,显示“热门搜索”数据
case R.id.editText_search:
searchAdapter.notifyDataSetChanged();
break;
}
}
/**
* 判断EditText是否为空,否则获取EditText输入的数据,跳转传值
*/
private void submit() {
// validate
editTextSearch = editText_search.getText().toString().trim();
if (TextUtils.isEmpty(editTextSearch)) {
Toast.makeText(getContext(), "请输入内容再搜索哦!", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(getContext(), SearchList.class);
intent.putExtra("editTextSearch", editTextSearch);
startActivity(intent);
}
}
}
搜索进入条目展示列表:
package com.shaoshan.play.goeat.fragment.seachfragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.shaoshan.play.goeat.BaseActivity;
import com.shaoshan.play.goeat.R;
import com.shaoshan.play.goeat.fragment.seachfragment.adapter.SearchListAdapter;
import com.shaoshan.play.goeat.fragment.seachfragment.bean.SearchListBean;
import com.shaoshan.play.goeat.fragment.seachfragment.xlistview.XListView;
import com.shaoshan.play.goeat.utils.OkHttp;
import java.io.IOException;
import java.util.ArrayList;
import okhttp3.Request;
/**
* 按条件搜索列表页面
*/
public class SearchList extends BaseActivity implements View.OnClickListener {
//声明控件
private TextView title_name;
private ImageView title_img;
private LinearLayout linconent;
private LinearLayout activity_search_list;
//声明返回功能的图片空间
private ImageView back;
//EditText获取的输入信息
private String editTextSearch;
//XListView
// android:divider="#00000000",布局文件里面,设置间隔为透明色
// android:dividerHeight="30px",设置间隔高度
private XListView listView_search;
//解析数据的对象数组集合
private SearchListBean[] searchListBeen;
//SearchListBean对象的集合
private ArrayList<SearchListBean> SearchListBeanList = new ArrayList<SearchListBean>();
//全部变量,默认1,用来判断page页
private int i = 1;
//设置适配器
private SearchListAdapter searchListAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_search_list);
super.onCreate(savedInstanceState);
initData();
initView();
}
//加载网络数据
private void initNetData() {
//根据传进来的值拼接接口地址
String url = "http://appserver.1035.mobi/MobiSoft/SearchAll_Search?cid=2024&str=" + editTextSearch + "&size=20&page=" + i;
//调用工具类,进行网络请求
OkHttp.getAsync(url, new OkHttp.DataCallBack() {
//失败的方法
@Override
public void requestFailure(Request request, IOException e) {
}
//成功的方法
@Override
public void requestSuccess(String result) throws Exception {
//Gson解析
Gson gson = new Gson();
//返回数组对象,用SearchBean[],用最外层Bean对象解析,无法使用数据,根据接口数据更改了解析方式
searchListBeen = gson.fromJson(result, SearchListBean[].class);
//通过判断集合长度,判断是否还有数据
if (searchListBeen.length < 2) {
//吐司无更多消息
Toast.makeText(SearchList.this, "无更多信息", Toast.LENGTH_SHORT).show();
//return自我消耗
return;
}
//SearchListBeanList.addAll(searchListBeen);
//遍历解析获取的数组对象,添加到到集合对象中
for (SearchListBean sb : searchListBeen) {
SearchListBeanList.add(sb);
}
//创建适配器,
searchListAdapter = new SearchListAdapter(SearchList.this, SearchListBeanList);
//通过判断全局变量,判断是否绑定一次适配器,之后结合上拉加载等,防止重新多次的绑定适配器
if (i < 2) {
listView_search.setAdapter(searchListAdapter);
}
}
});
}
//加载数据,获取intent的传值
private void initData() {
Intent intent = getIntent();
editTextSearch = intent.getStringExtra("editTextSearch");
//调用网络请求数据方法
initNetData();
}
//加载控件
private void initView() {
back = (ImageView) findViewById(R.id.back);
title_name = (TextView) findViewById(R.id.title_name);
title_img = (ImageView) findViewById(R.id.title_img);
linconent = (LinearLayout) findViewById(R.id.linconent);
listView_search = (XListView) findViewById(R.id.listView_search);
activity_search_list = (LinearLayout) findViewById(R.id.activity_search_list);
//设置XlistView对象,和方法,重写数据和功能
setSXlistView();
//设置监听
setSListener();
}
private void setSXlistView() {
//设置激活上拉加载更多
listView_search.setPullLoadEnable(true);
//设置XListView监听状态
listView_search.setXListViewListener(new XListView.IXListViewListener() {
@Override//刷新
public void onRefresh() {
//1.清空之前集合的数据
//2.加载新数据
//3.通知适配器刷新
//4.停止刷新
stopXlistView();
}
@Override//加载更多
public void onLoadMore() {
//加载一次,计数一次+1,结合接口的page页面加载第二页面数据,并且追加进集合中
i = i + 1;
//1.加载新数据
//2.把新数据追加到集合里
initNetData();
//3.通知适配器刷新
searchListAdapter.notifyDataSetChanged();
//4.停止加载更多
stopXlistView();
}
});
}
/**
* 设置XlistView()停止刷新
*/
public void stopXlistView() {
//设置刷新时间
// list_search.setRefreshTime("0000-00-00");
//停止加载更多
listView_search.stopLoadMore();
//停止刷新
listView_search.stopRefresh();
}
/**
* 设置监听
*/
private void setSListener() {
back.setImageResource(R.drawable.bt_back);
back.setOnClickListener(this);
listView_search.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(SearchList.this, SearchItemDetailsNews.class);
startActivity(intent);
}
});
}
//点击监听
@Override
public void onClick(View view) {
switch (view.getId()) {
//监听返回,销毁页面
case R.id.back:
finish();
break;
}
}
}