Browse Source

Merge branch 'developer' of https://gitlab.com/Arisono/SkWeiChat-Baidu into feature

# Conflicts:
#	WeiChat/version.properties
Arison 7 years ago
parent
commit
74be9665ca

+ 3 - 3
WeiChat/version.properties

@@ -1,5 +1,5 @@
-#Fri Oct 12 17:58:38 CST 2018
-debugName=888
+#Sat Oct 13 14:44:00 CST 2018
+debugName=900
 versionName=650
-debugCode=888
+debugCode=900
 versionCode=190

+ 3 - 4
app_modular/appworks/src/main/java/com/uas/appworks/adapter/CustomerCareListAdapter.java

@@ -2,7 +2,6 @@ package com.uas.appworks.adapter;
 
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.drawable.Drawable;
 import android.view.View;
 import android.widget.TextView;
 
@@ -26,9 +25,9 @@ public class CustomerCareListAdapter extends EasyBaseAdapter {
     }
 
     private void setCompoundDrawables(TextView tv){
-        Drawable drawable = ct.getResources().getDrawable(R.drawable.ic_customer_birthday);
-        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());//必须设置图片大小,否则不显示
-        tv.setCompoundDrawables(drawable, null, null, null);
+//        Drawable drawable = ct.getResources().getDrawable(R.drawable.ic_customer_birthday);
+//        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());//必须设置图片大小,否则不显示
+//        tv.setCompoundDrawables(drawable, null, null, null);
     }
 
     @Override

+ 188 - 0
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/adapter/ContactLocalSortAdapter.java

@@ -0,0 +1,188 @@
+package com.uas.appworks.crm3_0.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.SectionIndexer;
+import android.widget.TextView;
+
+import com.common.data.StringUtil;
+import com.common.system.SystemUtil;
+import com.core.utils.NotifyUtils;
+import com.core.utils.sortlist.BaseSortModel;
+import com.core.utils.sortlist.PingYinUtil;
+import com.uas.appcontact.model.contacts.ContactsModel;
+import com.uas.appworks.R;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
+
+
+public class ContactLocalSortAdapter extends BaseAdapter implements SectionIndexer, StickyListHeadersAdapter {
+
+    private Context mContext;
+    private List<BaseSortModel<ContactsModel>> mSortFriends;
+    private boolean isRefeshed;
+    private Map<Integer, String> isLog;
+
+
+    public ContactLocalSortAdapter(Context context, List<BaseSortModel<ContactsModel>> sortFriends) {
+        mContext = context;
+        mSortFriends = (sortFriends == null ? new ArrayList<BaseSortModel<ContactsModel>>() : sortFriends);
+        isLog = new HashMap<>();
+    }
+
+    public void setData(List<BaseSortModel<ContactsModel>> sortFriends) {
+        this.mSortFriends = (sortFriends == null ? new ArrayList<BaseSortModel<ContactsModel>>() : sortFriends);
+        notifyDataSetChanged();
+    }
+
+    public List<BaseSortModel<ContactsModel>> getmSortFriends() {
+        return mSortFriends;
+    }
+
+    public void setisRefeshed(boolean isRefeshed) {
+        this.isRefeshed = isRefeshed;
+        isLog.clear();
+    }
+
+    @Override
+    public int getCount() {
+        return mSortFriends.size();
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return position;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder holder = null;
+        // 根据position获取分类的首字母的Char ascii值
+        int section = getSectionForPosition(position);
+        if (convertView == null) {
+            holder = new ViewHolder();
+            convertView = LayoutInflater.from(mContext).inflate(R.layout.fragment_item_contacts_local, parent, false);
+
+            holder.name_tv = (TextView) convertView.findViewById(R.id.name_tv);
+            holder.sub_tv = (TextView) convertView.findViewById(R.id.sub_tv);
+            holder.status_tv = (ImageView) convertView.findViewById(R.id.status_tv);
+            holder.head_img =  convertView.findViewById(R.id.head_img);
+            holder.tag_view = convertView.findViewById(R.id.tag_view);
+            
+            convertView.setTag(holder);
+        } else {
+            holder = (ViewHolder) convertView.getTag();
+        }
+        final ContactsModel  model= mSortFriends.get(position).getBean();
+
+        holder.targetId=  model.getImid();
+        holder.model=model;
+        ///设定为每次刷新都会去删除缓存重新获取数据
+        //AvatarHelper.getInstance().display(model.getImid() + "", holder.head_img, true, false);
+
+        String pName= PingYinUtil.getPingYin(model.getName());
+        holder.head_img.setText(pName.substring(0,1));
+
+        holder.name_tv.setText(model.getName());
+        holder.sub_tv.setText(model.getPhone());
+        holder.status_tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (!StringUtil.isEmpty(model.getPhone())) {
+                    String check = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
+                    Pattern regex = Pattern.compile(check);
+                    Matcher matcher = regex.matcher(model.getPhone());
+                    if (matcher.matches()) {
+                        SystemUtil.phoneAction(mContext, model.getPhone());
+                    } else {
+                        NotifyUtils.ToastMessage(mContext,mContext.getString(R.string.not_format_phone));
+                    }
+                } else {
+                    NotifyUtils.ToastMessage(mContext,mContext.getString(R.string.not_phone));
+                }
+            }
+        });
+        
+        return convertView;
+    }
+
+
+    /**
+     * 根据ListView的当前位置获取分类的首字母的Char ascii值
+     */
+    public int getSectionForPosition(int position) {
+        return mSortFriends.get(position).getFirstLetter().charAt(0);
+    }
+
+    /**
+     * 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
+     */
+    public int getPositionForSection(int section) {
+        for (int i = 0; i < getCount(); i++) {
+            String sortStr = mSortFriends.get(i).getFirstLetter();
+            char firstChar = sortStr.toUpperCase().charAt(0);
+            if (firstChar == section) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    @Override
+    public Object[] getSections() {
+        return null;
+    }
+
+    @Override
+    public View getHeaderView(int position, View convertView, ViewGroup parent) {
+        HeaderViewHolder viewHolder = null;
+        if (convertView == null) {
+            convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_head, parent, false);
+            viewHolder = new HeaderViewHolder();
+            viewHolder.cityLetterTextView = (TextView) convertView.findViewById(R.id.head);
+            convertView.setTag(viewHolder);
+        } else {
+            viewHolder = (HeaderViewHolder) convertView.getTag();
+        }
+        viewHolder.cityLetterTextView.setText(mSortFriends.get(position).getFirstLetter());
+
+        return convertView;
+    }
+
+    @Override
+    public long getHeaderId(int position) {
+        return mSortFriends.get(position).getFirstLetter().charAt(0);
+    }
+
+    class HeaderViewHolder {
+        TextView cityLetterTextView;
+    }
+
+    public class ViewHolder {
+        public  TextView
+                name_tv,
+                sub_tv;
+        public ImageView status_tv;
+        public TextView head_img;
+        public View tag_view;
+        public String targetId;
+        public ContactsModel model;
+    }
+}

+ 217 - 0
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/adapter/ContactSortAdapter.java

@@ -0,0 +1,217 @@
+package com.uas.appworks.crm3_0.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.SectionIndexer;
+import android.widget.TextView;
+
+import com.common.data.StringUtil;
+import com.common.system.SystemUtil;
+import com.core.utils.NotifyUtils;
+import com.core.utils.sortlist.BaseSortModel;
+import com.uas.appworks.R;
+import com.uas.appworks.crm3_0.model.ContactsBean;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
+
+
+public class ContactSortAdapter extends BaseAdapter implements SectionIndexer, StickyListHeadersAdapter {
+
+    private Context mContext;
+    private List<BaseSortModel<ContactsBean>> mSortFriends;
+    private boolean isRefeshed;
+    private Map<Integer, String> isLog;
+
+
+    public ContactSortAdapter(Context context, List<BaseSortModel<ContactsBean>> sortFriends) {
+        mContext = context;
+        mSortFriends = (sortFriends == null ? new ArrayList<BaseSortModel<ContactsBean>>() : sortFriends);
+        isLog = new HashMap<>();
+    }
+
+    public void setData(List<BaseSortModel<ContactsBean>> sortFriends) {
+        this.mSortFriends = (sortFriends == null ? new ArrayList<BaseSortModel<ContactsBean>>() : sortFriends);
+        notifyDataSetChanged();
+    }
+
+    public List<BaseSortModel<ContactsBean>> getmSortFriends() {
+        return mSortFriends;
+    }
+
+    public void setisRefeshed(boolean isRefeshed) {
+        this.isRefeshed = isRefeshed;
+        isLog.clear();
+    }
+
+    @Override
+    public int getCount() {
+        return mSortFriends.size();
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return position;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder holder = null;
+        // 根据position获取分类的首字母的Char ascii值
+        int section = getSectionForPosition(position);
+        if (convertView == null) {
+            holder = new ViewHolder();
+         
+            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_contacts_me, parent, false);
+            holder. tvName = (TextView) convertView.findViewById(R.id.tv_name);
+            holder.  tvPosition = (TextView)  convertView.findViewById(R.id.tv_position);
+            holder.  tvCompanyName = (TextView)  convertView.findViewById(R.id.tv_company_name);
+            holder.  tvPhone = (TextView)  convertView.findViewById(R.id.tv_phone);
+            holder.  ivIcon = (ImageView)  convertView.findViewById(R.id.iv_icon);
+            convertView.setTag(holder);
+        } else {
+            holder = (ViewHolder) convertView.getTag();
+        }
+        // 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
+//        if (position == getPositionForSection(section)) {
+//            holder.tag_tv.setVisibility(View.VISIBLE);
+//            holder.tag_tv.setText(mSortFriends.get(position).getFirstLetter());
+//        } else {
+//            holder.tag_tv.setVisibility(View.GONE);
+//        }
+        final ContactsBean object= mSortFriends.get(position).getBean();
+        holder.tvName.setText(object.getName());
+        holder.tvCompanyName.setText(object.getCompanyName());
+        if (!StringUtil.isEmpty(object.getPhone())){
+            holder.tvPhone.setText(object.getPhone().split("/")[0]);
+        }
+        holder.tvPosition.setText(object.getPosition());
+        holder.bean=object;
+
+        if (!StringUtil.isEmpty(object.getPhone())){
+            final String phone=object.getPhone().split("/")[0];
+            holder.ivIcon.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    if (!StringUtil.isEmpty(phone)) {
+                        String check = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
+                        Pattern regex = Pattern.compile(check);
+                        Matcher matcher = regex.matcher(phone);
+                        if (matcher.matches()) {
+                            if (mContext instanceof Activity){
+                                SystemUtil.phoneAction(mContext, phone);
+                            }else{
+                                SystemUtil.phoneAction(mContext, phone);
+                            }
+
+                        } else {
+                            NotifyUtils.ToastMessage(mContext,mContext.getString(com.uas.appworks.R.string.not_format_phone));
+                        }
+                    } else {
+                        NotifyUtils.ToastMessage(mContext,mContext.getString(com.uas.appworks.R.string.not_phone));
+                    }
+                }
+            });
+            holder.tvPhone.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    if (!StringUtil.isEmpty(phone)) {
+                        String check = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
+                        Pattern regex = Pattern.compile(check);
+                        Matcher matcher = regex.matcher(phone);
+                        if (matcher.matches()) {
+                            if (mContext instanceof Activity){
+                                SystemUtil.phoneAction(mContext, phone);
+                            }
+                        } else {
+                            NotifyUtils.ToastMessage(mContext,mContext.getString(com.uas.appworks.R.string.not_format_phone));
+                        }
+                    } else {
+                        NotifyUtils.ToastMessage(mContext,mContext.getString(com.uas.appworks.R.string.not_phone));
+                    }
+                }
+            });
+        }
+   
+    
+        return convertView;
+    }
+
+
+    /**
+     * 根据ListView的当前位置获取分类的首字母的Char ascii值
+     */
+    public int getSectionForPosition(int position) {
+        return mSortFriends.get(position).getFirstLetter().charAt(0);
+    }
+
+    /**
+     * 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
+     */
+    public int getPositionForSection(int section) {
+        for (int i = 0; i < getCount(); i++) {
+            String sortStr = mSortFriends.get(i).getFirstLetter();
+            char firstChar = sortStr.toUpperCase().charAt(0);
+            if (firstChar == section) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    @Override
+    public Object[] getSections() {
+        return null;
+    }
+
+    @Override
+    public View getHeaderView(int position, View convertView, ViewGroup parent) {
+        HeaderViewHolder viewHolder = null;
+        if (convertView == null) {
+            convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_head, parent, false);
+            viewHolder = new HeaderViewHolder();
+            viewHolder.cityLetterTextView = (TextView) convertView.findViewById(R.id.head);
+            convertView.setTag(viewHolder);
+        } else {
+            viewHolder = (HeaderViewHolder) convertView.getTag();
+        }
+        viewHolder.cityLetterTextView.setText(mSortFriends.get(position).getFirstLetter());
+
+        return convertView;
+    }
+
+    @Override
+    public long getHeaderId(int position) {
+        return mSortFriends.get(position).getFirstLetter().charAt(0);
+    }
+
+    class HeaderViewHolder {
+        TextView cityLetterTextView;
+    }
+
+    public class ViewHolder {
+        private TextView tvName;
+        private TextView tvPosition;
+        private TextView tvCompanyName;
+        private TextView tvPhone;
+        private ImageView ivIcon;
+        public ContactsBean bean;
+    }
+}

+ 129 - 58
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/ContactsListFragment.java

@@ -11,7 +11,6 @@ import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
 import android.widget.ImageView;
-import android.widget.ListView;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -20,14 +19,16 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.common.LogUtil;
+import com.common.data.ListUtils;
 import com.common.data.StringUtil;
 import com.common.system.SystemUtil;
 import com.core.app.MyApplication;
 import com.core.utils.CommonUtil;
 import com.core.utils.NotifyUtils;
+import com.core.utils.sortlist.BaseComparator;
+import com.core.utils.sortlist.BaseSortModel;
+import com.core.utils.sortlist.PingYinUtil;
 import com.core.utils.sortlist.SideBar;
-import com.handmark.pulltorefresh.library.PullToRefreshBase;
-import com.handmark.pulltorefresh.library.PullToRefreshListView;
 import com.me.network.app.http.HttpClient;
 import com.me.network.app.http.Method;
 import com.me.network.app.http.rx.ResultListener;
@@ -37,16 +38,20 @@ import com.modular.apputils.network.Tags;
 import com.uas.appworks.R;
 import com.uas.appworks.crm3_0.activity.ContactDynamicAddActivity;
 import com.uas.appworks.crm3_0.activity.ContactsDetialActivity;
+import com.uas.appworks.crm3_0.adapter.ContactSortAdapter;
 import com.uas.appworks.crm3_0.adapter.DynamicAdapter;
 import com.uas.appworks.crm3_0.model.ColumnModel;
 import com.uas.appworks.crm3_0.model.ContactsBean;
 import com.uas.appworks.crm3_0.model.ItemModel;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
+
 /**
    * @desc:联系人列表
    * @author:Arison on 2018/9/13
@@ -55,10 +60,16 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
 ,SideBar.OnTouchingLetterChangedListener{
 
   
-    private PullToRefreshListView mListView;
+//    private PullToRefreshListView mListView;
     private int tabItem;
     List<ContactsBean> datas;
     ItemContactsMeAdapter adapter;
+
+
+    StickyListHeadersListView refreshListView;
+    private BaseComparator comparator;
+    private List<BaseSortModel<ContactsBean>> allDatas=new ArrayList<>();
+    ContactSortAdapter mAdapter;
     private static final String TAG = "ContactsListFragment";
     private int page;
 
@@ -90,8 +101,8 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
 
             @Override
             public void run() {
-                if (mListView!=null) {
-                    mListView.setRefreshing(true);
+                if (refreshListView!=null) {
+                   initData();
                 }
             }
         }, 200);
@@ -100,36 +111,14 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
     private void initView() {
         tabItem = getArguments().getInt("tabItem", 0);
         LogUtil.d(TAG,"layzData():"+tabItem);
-        dialogTV = (TextView) findViewById(R.id.dialogTV);
-        sideBar = (SideBar) findViewById(R.id.sidebar);
-        sideBar.setTextView(dialogTV);
-        sideBar.setOnTouchingLetterChangedListener(this);
-        
-        mListView = findViewById(R.id.mListView);
-        mListView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
-        mListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
-            @Override
-            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
-                LogUtil.d(TAG,"下拉刷新.....");
-                page = 1;
-                initData();
-            }
 
-            @Override
-            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
-                LogUtil.d(TAG,"加载更多.....");
-                page++;
-                loadMore();
-            }
-        });
-        
-        
-        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+        refreshListView =  findViewById(R.id.mListView);
+        refreshListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                 switch (tabItem){
                     case 1:
-                        final ItemContactsMeAdapter.ViewHolder viewHolder= (ItemContactsMeAdapter.ViewHolder) view.getTag();
+                        final ContactSortAdapter.ViewHolder viewHolder= (ContactSortAdapter.ViewHolder) view.getTag();
                         if (StringUtil.isEmpty(viewHolder.bean.getCompanyName())){
                             viewHolder.bean.setCompanyName("未填写");
                         }
@@ -145,7 +134,7 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
                         getActivity().startActivity(new Intent(getActivity(), ContactsDetialActivity.class)
                                 .putExtra("model",viewHolder.bean));
                         break;
-                        
+
                     case 2:
                         DynamicAdapter.ViewHolder model= (DynamicAdapter.ViewHolder) view.getTag();
                         Toast.makeText(getActivity(),model.columnModel.getId(),Toast.LENGTH_LONG).show();
@@ -157,11 +146,46 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
                                 .putExtra("id", Integer.valueOf(model.columnModel.getId())));
                         break;
                 }
-               
-              
+
             }
         });
         
+        mAdapter = new ContactSortAdapter(ct, allDatas);
+        refreshListView.setAdapter(mAdapter);
+        
+        dialogTV = (TextView) findViewById(R.id.dialogTV);
+        sideBar = (SideBar) findViewById(R.id.sidebar);
+        sideBar.setTextView(dialogTV);
+        sideBar.setOnTouchingLetterChangedListener(this);
+        comparator = new BaseComparator();
+        
+//        mListView = findViewById(R.id.mListView);
+//        mListView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
+//        mListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
+//            @Override
+//            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
+//                LogUtil.d(TAG,"下拉刷新.....");
+//                page = 1;
+//                initData();
+//            }
+//
+//            @Override
+//            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
+//                LogUtil.d(TAG,"加载更多.....");
+//                page++;
+//                loadMore();
+//            }
+//        });
+        
+        
+//        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+//            @Override
+//            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
+//          
+//
+//            }
+//        });
+        
     }
     
     private void initData(){
@@ -180,11 +204,16 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
                     @Override
                     public void onResponse(Object o) {
                         try {
+                            allDatas.clear();
                             datas= JSON.parseObject(JSON.parseObject(o.toString()).getJSONArray("data").toJSONString()
                                     ,new TypeReference<List<ContactsBean>>(){});
-                            adapter=new ItemContactsMeAdapter(getActivity(),datas);
-                            mListView.setAdapter(adapter);
-                            LogUtil.d(TAG,JSON.toJSONString(datas));
+                            
+                            allDatas=getAllDatas(datas);
+                            mAdapter.setData(allDatas);
+                            
+//                            adapter=new ItemContactsMeAdapter(getActivity(),datas);
+//                            mListView.setAdapter(adapter);
+//                            LogUtil.d(TAG,JSON.toJSONString(datas));
                         }catch (Exception e){
 
                         }
@@ -215,7 +244,7 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
                             mData= getData(o.toString());
                             LogUtil.prinlnLongMsg(TAG,"result:"+JSON.toJSONString( mData));
                             dynamicAdapter=new DynamicAdapter(getActivity(),mData);
-                            mListView.setAdapter(dynamicAdapter);
+//                            mListView.setAdapter(dynamicAdapter);
                         }catch (Exception e){
                              e.printStackTrace();
                         }
@@ -231,12 +260,12 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
 //                LogUtil.d(TAG,JSON.toJSONString(datas));
                 break;
         }
-        mListView.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                mListView.onRefreshComplete();
-            }
-        },1000);
+//        mListView.postDelayed(new Runnable() {
+//            @Override
+//            public void run() {
+//                mListView.onRefreshComplete();
+//            }
+//        },1000);
     }
     
     
@@ -260,12 +289,12 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
                 break;
         }
 
-        mListView.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                mListView.onRefreshComplete();
-            }
-        },1000);
+//        mListView.postDelayed(new Runnable() {
+//            @Override
+//            public void run() {
+//                mListView.onRefreshComplete();
+//            }
+//        },1000);
     }
     
 
@@ -296,13 +325,13 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
     public void onTouchingLetterChanged(String s) {
         LogUtil.d(TAG,"搜索关键字:"+s);
         // 该字母首次出现的位置
-//        int position = adapter.getPositionForSection(s.charAt(0));
-//        if (position != -1) {
-//            mListView.getRefreshableView().setSelection(position);
-//        }
-//        if ("↑".equals(s)) {
-//            mListView.getRefreshableView().setSelection(0);
-//        }
+        int position = mAdapter.getPositionForSection(s.charAt(0));
+        if (position != -1) {
+            refreshListView.setSelection(position);
+        }
+        if ("↑".equals(s)) {
+            refreshListView.setSelection(0);
+        }
     }
 
     @Override
@@ -460,5 +489,47 @@ public class ContactsListFragment extends ViewPagerLazyFragment implements OnSma
         }
         return data;
     }
-    
+
+
+    private List<BaseSortModel<ContactsBean>> getAllDatas(List<ContactsBean> emList) {
+        if (ListUtils.isEmpty(emList)) return null;
+        List<BaseSortModel<ContactsBean>> list = new ArrayList<>();
+        for (ContactsBean e : emList) {
+            
+            BaseSortModel<ContactsBean> mode = new BaseSortModel<>();
+            mode.setBean(e);
+
+            ContactsBean friend = mode.getBean();
+            if (friend == null) {
+               break;
+            }
+            String name = friend.getName();
+            String wholeSpell = PingYinUtil.getPingYin(name);
+            if (!StringUtil.isEmpty(wholeSpell)) {
+                try {
+                    String firstLetter = Character.toString(wholeSpell.charAt(0));
+                    sideBar.addExist(firstLetter);
+                    mode.setWholeSpell(wholeSpell);
+                    mode.setFirstLetter(firstLetter);
+                    mode.setSimpleSpell(PingYinUtil.converterToFirstSpell(name));
+                } catch (Exception o) {
+                       o.printStackTrace();
+                }
+            } else {// 如果全拼为空,理论上是一种错误情况,因为这代表着昵称为空
+                mode.setWholeSpell("#");
+                mode.setFirstLetter("#");
+                mode.setSimpleSpell("#");
+            }
+            
+            list.add(mode);
+        }
+        if (ListUtils.isEmpty(list)) {
+            list = new ArrayList<>();
+        } else {
+            Collections.sort(list, comparator);
+        }
+        return list;
+    }
+
+
 }

+ 94 - 28
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/fragment/LocalContactsListFragment.java

@@ -6,36 +6,51 @@ import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.v4.app.Fragment;
-import android.widget.ListView;
+import android.widget.TextView;
 
 import com.alibaba.fastjson.JSON;
 import com.common.LogUtil;
+import com.common.data.ListUtils;
 import com.common.data.StringUtil;
 import com.common.system.PermissionUtil;
 import com.core.app.MyApplication;
 import com.core.utils.CommonUtil;
-import com.handmark.pulltorefresh.library.PullToRefreshBase;
-import com.handmark.pulltorefresh.library.PullToRefreshListView;
+import com.core.utils.sortlist.BaseComparator;
+import com.core.utils.sortlist.BaseSortModel;
+import com.core.utils.sortlist.PingYinUtil;
+import com.core.utils.sortlist.SideBar;
 import com.modular.apputils.listener.OnSmartHttpListener;
 import com.modular.apputils.network.Tags;
 import com.uas.appcontact.model.contacts.Contacts;
 import com.uas.appcontact.model.contacts.ContactsModel;
 import com.uas.appcontact.utils.ContactsUtils;
 import com.uas.appworks.R;
-import com.uas.appworks.crm3_0.adapter.ContactsLocalAdapter;
+import com.uas.appworks.crm3_0.adapter.ContactLocalSortAdapter;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
+import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
+
 /**
  * A simple {@link Fragment} subclass.
  */
-public class LocalContactsListFragment extends ViewPagerLazyFragment implements OnSmartHttpListener {
+public class LocalContactsListFragment extends ViewPagerLazyFragment implements OnSmartHttpListener,SideBar.OnTouchingLetterChangedListener {
     private static final String TAG = "LocalContactsListFragment";
-    private ContactsLocalAdapter adapter;
-    private PullToRefreshListView mListView;
+//    private ContactsLocalAdapter adapter;
+//    private PullToRefreshListView mListView;
     private List<ContactsModel> models = new ArrayList<>();
-    private int page;
+    
+    
+    StickyListHeadersListView refreshListView;
+    private BaseComparator comparator;
+    private List<BaseSortModel<ContactsModel>> allDatas=new ArrayList<>();
+    ContactLocalSortAdapter mAdapter;
+    SideBar sideBar;
+    TextView dialogTV;
+   
+//    private int page;
 
     public static  LocalContactsListFragment newInstance(int tabItem) {
         Bundle args = new Bundle();
@@ -65,29 +80,21 @@ public class LocalContactsListFragment extends ViewPagerLazyFragment implements
  
 
     private void initView() {
-        mListView = findViewById(R.id.mListView);
-        mListView.setMode(PullToRefreshBase.Mode.DISABLED);
-        mListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
-            @Override
-            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
-                LogUtil.d(TAG,"下拉刷新.....");
-                page = 1;
-                initData();
-            }
+        refreshListView =  findViewById(R.id.mListView);
+        mAdapter = new ContactLocalSortAdapter(ct, allDatas);
+        refreshListView.setAdapter(mAdapter);
 
-            @Override
-            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
-                LogUtil.d(TAG,"加载更多.....");
-                page++;
-       
-            }
-        });
+        dialogTV = findViewById(R.id.dialogTV);
+        sideBar = findViewById(R.id.sidebar);
+        sideBar.setTextView(dialogTV);
+        sideBar.setOnTouchingLetterChangedListener(this);
+        comparator = new BaseComparator();
 
     }
 
     private void initData() {
-        adapter=new ContactsLocalAdapter(ct,models);
-        mListView.setAdapter(adapter);
+//        adapter=new ContactsLocalAdapter(ct,models);
+//        mListView.setAdapter(adapter);
         String[] permissions = {Manifest.permission.READ_CONTACTS};
         if (PermissionUtil.lacksPermissions(ct, permissions)) {
             PermissionUtil.requestPermission(getActivity(), PermissionUtil.DEFAULT_REQUEST, permissions);
@@ -117,8 +124,10 @@ public class LocalContactsListFragment extends ViewPagerLazyFragment implements
                 models.add(model);
             }
         }
-
-        adapter.notifyDataSetChanged();
+        
+        allDatas.clear();
+        allDatas= getAllDatas(models);
+        mAdapter.setData(allDatas);
     }
 
     @Override
@@ -147,4 +156,61 @@ public class LocalContactsListFragment extends ViewPagerLazyFragment implements
             }
         }
     }
+
+    @Override
+    public void onTouchingLetterChanged(String s) {
+        int position = mAdapter.getPositionForSection(s.charAt(0));
+        if (position != -1) {
+            refreshListView.setSelection(position);
+        }
+        if ("↑".equals(s)) {
+            refreshListView.setSelection(0);
+        }
+    }
+
+    @Override
+    public void onTouchingUp() {
+
+    }
+
+
+    private List<BaseSortModel<ContactsModel>> getAllDatas(List<ContactsModel> emList) {
+        if (ListUtils.isEmpty(emList)) return null;
+        List<BaseSortModel<ContactsModel>> list = new ArrayList<>();
+        for (ContactsModel e : emList) {
+
+            BaseSortModel<ContactsModel> mode = new BaseSortModel<>();
+            mode.setBean(e);
+
+            ContactsModel friend = mode.getBean();
+            if (friend == null) {
+                break;
+            }
+            String name = friend.getName();
+            String wholeSpell = PingYinUtil.getPingYin(name);
+            if (!StringUtil.isEmpty(wholeSpell)) {
+                try {
+                    String firstLetter = Character.toString(wholeSpell.charAt(0));
+                    sideBar.addExist(firstLetter);
+                    mode.setWholeSpell(wholeSpell);
+                    mode.setFirstLetter(firstLetter);
+                    mode.setSimpleSpell(PingYinUtil.converterToFirstSpell(name));
+                } catch (Exception o) {
+                    o.printStackTrace();
+                }
+            } else {// 如果全拼为空,理论上是一种错误情况,因为这代表着昵称为空
+                mode.setWholeSpell("#");
+                mode.setFirstLetter("#");
+                mode.setSimpleSpell("#");
+            }
+
+            list.add(mode);
+        }
+        if (ListUtils.isEmpty(list)) {
+            list = new ArrayList<>();
+        } else {
+            Collections.sort(list, comparator);
+        }
+        return list;
+    }
 }

+ 6 - 1
app_modular/appworks/src/main/res/layout/fragment_contacts_me.xml

@@ -4,7 +4,12 @@
     android:background="#F2F2F2"
     android:paddingTop="@dimen/paddingMin"
     android:layout_height="match_parent">
-    <com.handmark.pulltorefresh.library.PullToRefreshListView
+<!--    <com.handmark.pulltorefresh.library.PullToRefreshListView
+        android:id="@+id/mListView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />-->
+
+    <se.emilsjolander.stickylistheaders.StickyListHeadersListView
         android:id="@+id/mListView"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

+ 28 - 3
app_modular/appworks/src/main/res/layout/fragment_local_contacts_list.xml

@@ -1,11 +1,36 @@
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingTop="@dimen/paddingMin"
     tools:context="com.uas.appworks.crm3_0.fragment.LocalContactsListFragment">
-    <com.handmark.pulltorefresh.library.PullToRefreshListView
+    <!--<com.handmark.pulltorefresh.library.PullToRefreshListView-->
+        <!--android:id="@+id/mListView"-->
+        <!--android:layout_width="match_parent"-->
+        <!--android:layout_height="match_parent" />-->
+
+    <se.emilsjolander.stickylistheaders.StickyListHeadersListView
         android:id="@+id/mListView"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
-</FrameLayout>
+
+    <TextView
+        android:id="@+id/dialogTV"
+        android:layout_width="80.0dip"
+        android:layout_height="80.0dip"
+        android:layout_centerInParent="true"
+        android:layout_gravity="center"
+        android:background="@color/black_trans_99"
+        android:gravity="center"
+        android:textColor="#ffffffff"
+        android:textSize="30.0dip"
+        android:visibility="invisible" />
+
+    <com.core.utils.sortlist.SideBar
+        android:id="@+id/sidebar"
+        android:layout_width="30.0dip"
+        android:layout_height="match_parent"
+        android:layout_alignParentRight="true"
+        android:layout_gravity="right|center"
+        android:layout_marginBottom="10dp" />
+</RelativeLayout>