生活服务类型-项目知识点总结

一个简单的生活服务类的小项目,为了方便以后的使用,总结一下。

主页面:

主要页面


多人合作开发,三天的时间,赶出来的项目,本人主要负责的是搜索功能,所以在此整理一下,以方便日后遇到类似的项目,做为使用。
搜索功能页面


常见注意点:

自动以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;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值