Android实现仿excel数据表格效果
作者:嵩风抚
这篇文章主要介绍了Android实现仿excel数据表格效果的实现代码,非常不错具有参考借鉴价值,需要的朋友可以参考下
在没给大家分享代码之前,先给大家展示下效果图:
1.activity
/** * 采购需求 * Created by Administrator on 2016/10/13. */ public class PurchaseRequireActivity extends BaseActivity implements PurchaseRequireView { @Bind(R.id.appTitle) TextView appTitle; @Bind(R.id.scrollLinearLayout) LinearLayout titleLinearLayout; @Bind(R.id.scroll_list) ListView mListView; @Bind(R.id.item_scroll_title) CHTableScrollView headerScroll; public HorizontalScrollView mTouchView; private List<CHTableScrollView> mHScrollViews = new ArrayList<>();// 装入所有的 HScrollView private HashMap<String, TextView> mColumnControls = new HashMap<>(); private PPOrderRequirePresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { setContentView(R.layout.activity_purchase_require); ButterKnife.bind(this); init();// 初始化 } catch (Exception e) { e.printStackTrace(); } } /** * 初始化 */ private void init() { presenter = new PPOrderRequirePresenter(this, this); presenter.GetToday(); } @OnClick({R.id.backRLot}) public void onClick(View view) { switch (view.getId()) { case R.id.backRLot: finish(); break; } } public void scrollTo_0_0() {// 全部列表滑动到开始位置 for (final CHTableScrollView hScrollView : mHScrollViews) { mListView.post(new Runnable() { @Override public void run() { //当listView刷新完成之后,把该条移动到最终位置 hScrollView.scrollTo(0, 0); } }); } } public void onScrollChanged(int l, int t) { for (CHTableScrollView scrollView : mHScrollViews) { if (mTouchView != scrollView) scrollView.smoothScrollTo(l, t);//防止重复滑动 } } public void onClickText(String str, int position) {// 点击的事件 System.out.println(str + "-" + position); } @Override public void refreshLV(List<PPOrderRequireMobModel> newList) { list.clear(); list.addAll(newList); } @Override public void initViews(String[] cols, List<Map<String, String>> datas) { // 全部列表滑动到开始位置 scrollTo_0_0(); // 清空所有的view titleLinearLayout.removeAllViews(); //Table Title for (int i = 0; i < cols.length; i++) { if (i != 0) { View linearLay = presenter.newView(PurchaseRequireActivity.this, R.layout.row_title_edit_view, cols[i]); TextView et = (TextView) linearLay.findViewById(R.id.tevEditView); if (cols[i].contains("-")) {// setTextColor if (cols[i].substring(cols[i].length() - 1, cols[i].length()).equals("2")) {// 2专柜:红色,1买断:黑色 et.setTextColor(Color.RED); } else { et.setTextColor(Color.DKGRAY); } } else { et.setTextColor(Color.DKGRAY); } et.setText(cols[i].substring(0, cols[i].length() - 2));//设置每一列顶表格数据 titleLinearLayout.addView(linearLay); } } // 添加头滑动事件,先清空列表 mHScrollViews.clear(); mHScrollViews.add(headerScroll); mListView.setDividerHeight(0);//设置分割线高度 mColumnControls.clear(); for (int i = 0; i < cols.length; i++) {// 门店名称+现金 or 门店名称+外欠 if (i != 0) {//预留第一列 EditText etItem1 = new EditText(PurchaseRequireActivity.this); etItem1.setWidth(50);// 设置宽度 etItem1.setTextColor(Color.DKGRAY); etItem1.setGravity(Gravity.CENTER); mColumnControls.put(cols[i], etItem1); } } BaseAdapter adapter = new PurchaseRequireAdapter(this, datas, R.layout.row_item_edit, cols, mColumnControls, mHScrollViews, mListView); mListView.setAdapter(adapter); } }
2.view
/** * 采购需求 * Created by Administrator on 2016/10/13. */ public interface PurchaseRequireView { void refreshLV(List<PPOrderRequireMobModel> newList); void initViews(String[] cols, List<Map<String, String>> datas); }
3.PPOrderRequirePresenter
/** * 采购需求 * Created by Administrator on 2016/10/13. */ public class PPOrderRequirePresenter { private PurchaseRequireView view; private Context context; public PPOrderRequirePresenter(Context context, PurchaseRequireView view) { this.context = context; this.view = view; } /** * 获取数据 */ public void GetToday() { String billDate = getStartBillDate();//FreshRoadUtil.getTodayDate_normal().substring(0, 10); int dimen = Integer.parseInt(getDimen());// 默认条件:日期=当天 、维度=按门店 String url = InterfaceNameUtil.PPOrderRequireGetRequire(billDate, dimen); Log.e("url", url); final SweetAlertDialog dialog = AppUtil.showLoading(context, "正在发送请求,请稍后..."); APIListTRequest<PPOrderRequireMobModel> request = new APIListTRequest<>( url, null, PPOrderRequireMobModel.class, new Response.Listener<List<PPOrderRequireMobModel>>() { @Override public void onResponse(List<PPOrderRequireMobModel> list) { if (list != null) {// && list.size() > 0 view.refreshLV(list); doSomethingFroList(list); view.refreshVerticalLV(getPNameFromDB(list));// 刷新一下导航条 } dialog.dismiss(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { AppUtil.toError(dialog, error); } }); request.setAddTokenToHeader(false); VolleyUtil.start(context, request); } /** * 生成用于显示excel的数据源 * * @param newList newList */ public void doSomethingFroList(List<PPOrderRequireMobModel> newList) { ArrayList<String> nameList = new ArrayList<>();// 货物 ArrayList<Long> CargoIDList = new ArrayList<>();// 货物ID ArrayList<String> colsList = new ArrayList<>();// 门店名称-现金 or 门店名称-外欠 for (PPOrderRequireMobModel bean : newList) { String cargoName = bean.getCargoName(); if (bean.getCargoName().length() > 6) cargoName = cargoName.substring(0, 6); nameList.add(cargoName + "\n存:" + FreshRoadUtil.doubleTrans(bean.getQtyInventory()) + ",需:" + FreshRoadUtil.doubleTrans(bean.getQtyRequire())); CargoIDList.add(bean.getCargoID()); for (PPOrderRequireItemMobModel itemBean : bean.getItems()) { if (!isHave(colsList, itemBean.getName(), itemBean.getNatureType())) { colsList.add(itemBean.getName() + "-" + itemBean.getNatureType()); } } } // 排序,先1.买断、再2.专柜 Collections.sort(colsList, new Comparator<String>() { @Override public int compare(String left, String right) { return (left.substring(left.length() - 1, left.length())).compareTo(right.substring(right.length() - 1, right.length())); //return (right.substring(right.length() - 1, right.length())).compareTo(left.substring(left.length() - 1, left.length())); } }); colsList.add(0, "品名规格/店名");// excel控件的位于首位置的“提示”单元格文本 //Column String[] cols = colsList.toArray(new String[colsList.size()]); String[] name = nameList.toArray(new String[nameList.size()]); List<Map<String, String>> datas = new ArrayList<>(); Map<String, String> data; for (int i = 0; i < name.length; i++) { data = new HashMap<>(); data.put(cols[0], name[i]);//设置每一行头表格数据 for (int j = 1; j < cols.length; j++) { data.put(cols[j], getShowText(newList, CargoIDList.get(i), colsList.get(j))); } datas.add(data); } view.initViews(cols, datas); } /** * 列表中是否已经存在相应文本(外面 是 CargoID 是主键,里面是:Name+NatureType是唯一键) * * @param colsList colsList * @param name name * @param NatureType NatureType * @return 是否 */ public boolean isHave(ArrayList<String> colsList, String name, int NatureType) { for (String itemStr : colsList) { if (itemStr.equals(name + "-" + NatureType)) { return true; } } return false; } /** * 获取要显示的文本 * * @param list list * @param CargoID CargoID * @param name name * @return 显示的文本 */ public String getShowText(List<PPOrderRequireMobModel> list, long CargoID, String name) { for (PPOrderRequireMobModel bean : list) { for (PPOrderRequireItemMobModel itemBean : bean.getItems()) { if (bean.getCargoID() == CargoID && (itemBean.getName() + "-" + itemBean.getNatureType()).equals(name)) { return FreshRoadUtil.doubleTrans(itemBean.getQtyRequire()); } } } return " "; } /** * 新增一个view * * @param context context * @param res_id res_id * @param tag_name tag_name * @return view */ public View newView(Context context, int res_id, String tag_name) { View itemView = LayoutInflater.from(context).inflate(res_id, null); itemView.setTag(tag_name); return itemView; } }
4.PurchaseRequireAdapter
/** * 采购需求 * Created by Administrator on 2016/10/13. */ public class PurchaseRequireAdapter extends BaseAdapter { private List<? extends Map<String, ?>> datas; private int res; private String[] from; private Context context; protected List<CHTableScrollView> mHScrollViews = new ArrayList<>(); private HashMap<String, TextView> mColumnControls; private ListView mListView; public PurchaseRequireAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, HashMap<String, TextView> mColumnControls, List<CHTableScrollView> mHScrollViews, ListView mListView) { this.context = context; this.datas = data; this.res = resource; this.from = from; this.mColumnControls = mColumnControls; this.mHScrollViews = mHScrollViews; this.mListView = mListView; } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return datas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { v = LayoutInflater.from(context).inflate(res, null); //第一次初始化的时候装进来 mColumnControls.put("title", (TextView) v.findViewById(R.id.item_title)); View chsv = v.findViewById(R.id.item_scroll); LinearLayout ll = (LinearLayout) chsv.findViewById(R.id.item_scroll_layout); View[] views = new View[from.length]; for (int i = 0; i < from.length; i++) { if (i == 0) { views[0] = v.findViewById(R.id.item_title); continue; } View linearLay = newView(context, R.layout.row_item_edit_view, from[i]); TextView td = (TextView) linearLay.findViewById(R.id.ievEditView); td.setTag(position); td.setOnClickListener(clickListener);// 文本的点击事件 ll.addView(linearLay); views[i] = td; } v.setTag(views); addHViews((CHTableScrollView) chsv); } View[] holders = (View[]) v.getTag(); int len = holders.length; for (int i = 0; i < len; i++) { if (i == 0) { String oldStr = this.datas.get(position).get(from[i]).toString();// 西瓜\n存:12,需:32 String cargoStr = oldStr.substring(0, oldStr.indexOf("\n"));// 西瓜 String numberStr_1 = oldStr.substring(oldStr.indexOf(":") + 1, oldStr.indexOf(","));// 12 String numberStr_2 = oldStr.substring(oldStr.lastIndexOf(":") + 1, oldStr.length());// 32 String sText = "<font color=\"#000000\">" + cargoStr + "</font>" + "<br>" + "<font color=\"#999999\">存:</font> " + "<font color=\"#000000\">" + numberStr_1 + "</font> " + "<font color=\"#999999\">,需:</font> " + "<font color=\"#000000\">" + numberStr_2 + "</font> "; ((TextView) holders[i]).setText(Html.fromHtml(sText)); } else { ((TextView) holders[i]).setText(this.datas.get(position).get(from[i]).toString()); //((TextView) holders[i]).setTextColor(Color.parseColor("#FFA500")); } } return v; } private View newView(Context context, int res_id, String tag_name) { View itemView = LayoutInflater.from(context).inflate(res_id, null); itemView.setTag(tag_name); return itemView; } public void addHViews(final CHTableScrollView hScrollView) { if (!mHScrollViews.isEmpty()) { int size = mHScrollViews.size(); CHTableScrollView scrollView = mHScrollViews.get(size - 1); final int scrollX = scrollView.getScrollX(); //第一次满屏后,向下滑动,有一条数据在开始时未加入 if (scrollX != 0) { mListView.post(new Runnable() { @Override public void run() { //当listView刷新完成之后,把该条移动到最终位置 hScrollView.scrollTo(scrollX, 0); } }); } } mHScrollViews.add(hScrollView); } // 点击的事件 private View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { ((PurchaseRequireActivity) context).onClickText(((TextView) v).getText().toString(), (int) v.getTag()); } }; }
5.CHTableScrollView
/** * excel 布局 * Created by Administrator on 2016/10/13. */ public class CHTableScrollView extends HorizontalScrollView { PurchaseRequireActivity activity; public CHTableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); activity = (PurchaseRequireActivity) context; } public CHTableScrollView(Context context, AttributeSet attrs) { super(context, attrs); activity = (PurchaseRequireActivity) context; } public CHTableScrollView(Context context) { super(context); activity = (PurchaseRequireActivity) context; } @Override public boolean onTouchEvent(MotionEvent ev) { //进行触摸赋值 activity.mTouchView = this; return super.onTouchEvent(ev); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { //当当前的CHScrollView被触摸时,滑动其它 if (activity.mTouchView == this) { activity.onScrollChanged(l, t); } else { super.onScrollChanged(l, t, oldl, oldt); } } }
6.activity_purchase_require
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" android:orientation="vertical"> <include layout="@layout/default_app_head3" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/bg_light_gray" android:baselineAligned="false" android:orientation="horizontal"> <RelativeLayout android:id="@+id/shop_mission_ll" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2"> <RelativeLayout android:id="@+id/shop_mission_delete_ll" android:layout_width="50dp" android:layout_height="35dp" android:layout_alignParentRight="true"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginRight="15dp" android:contentDescription="@string/app_name" android:src="@drawable/x_clear_icon" /> </RelativeLayout> <TextView android:id="@+id/shop_mission_search_tv" android:layout_width="match_parent" android:layout_height="35dp" android:layout_toLeftOf="@id/shop_mission_delete_ll" android:gravity="center" android:text="点击这里,设置查询条件" android:textColor="@color/black_text" android:textColorHint="@color/light_gray_text" android:textSize="@dimen/font_small" /> </RelativeLayout> <RelativeLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"> <TextView android:id="@+id/purchase_select_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:singleLine="true" android:text="" android:textSize="12sp" /> <RelativeLayout android:id="@+id/purchase_tv_delete_ll" android:layout_width="45dp" android:layout_height="35dp" android:layout_alignParentRight="true"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginRight="15dp" android:contentDescription="@string/app_name" android:src="@drawable/x_clear_icon" /> </RelativeLayout> </RelativeLayout> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/order_vertical_lv" android:layout_width="35dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:divider="@null" android:scrollbars="none" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toLeftOf="@id/order_vertical_lv" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="fill_vertical" android:minHeight="40dip" android:orientation="horizontal"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="3" android:background="@drawable/bg_edittext_normal_s" android:enabled="false" android:gravity="center" android:maxLines="1" android:maxWidth="@dimen/scroll_tab_column_width" android:minWidth="@dimen/scroll_tab_column_width" android:singleLine="true" android:text="品名规格/店名" android:textColor="@android:color/black" android:textSize="12sp" /> <com.co_insight.freshroad.business.widget.CHTableScrollView android:id="@+id/item_scroll_title" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:scrollbars="none"> <LinearLayout android:id="@+id/scrollLinearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" /> </com.co_insight.freshroad.business.widget.CHTableScrollView> </LinearLayout> <ListView android:id="@+id/scroll_list" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@android:color/transparent" android:scrollbars="none" /> </LinearLayout> <com.co_insight.freshroad.views.widgets.HorizontalListView android:id="@+id/shop_mission_item_hlv" android:layout_width="60dp" android:layout_height="40dp" android:layout_centerHorizontal="true" android:layout_marginTop="40dp" android:background="@drawable/fresh_road_bg_button_normal" android:visibility="gone" /> </RelativeLayout> </LinearLayout>
7.row_title_edit_view
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="@dimen/scroll_tab_column_width" android:layout_height="match_parent" android:minHeight="50dip" android:orientation="vertical"> <TextView android:id="@+id/tevEditView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/bg_edittext_normal_title" android:editable="false" android:enabled="false" android:gravity="center" android:maxLines="2" android:maxWidth="@dimen/scroll_tab_column_width" android:minWidth="@dimen/scroll_tab_column_width" android:paddingLeft="3dp" android:paddingRight="3dp" android:textColor="@android:color/black" android:textSize="12sp" /> </LinearLayout> 8.row_item_edit_view [html] view plain copy 在CODE上查看代码片派生到我的代码片 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="@dimen/scroll_tab_column_width" android:layout_height="match_parent" android:minHeight="50dip" android:orientation="vertical"> <TextView android:id="@+id/ievEditView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/bg_edittext" android:gravity="center" android:maxLines="2" android:maxWidth="@dimen/scroll_tab_column_width" android:minWidth="@dimen/scroll_tab_column_width" android:textSize="12sp" android:textColor="@android:color/black" /> </LinearLayout>
9.row_item_edit
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="20dp" android:maxHeight="20dp" android:minHeight="20dp" android:orientation="horizontal"> <TextView android:id="@+id/item_title" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="3" android:background="@drawable/bg_edittext_normal_s" android:enabled="false" android:gravity="center" android:maxLines="2" android:maxWidth="@dimen/scroll_tab_column_width" android:minWidth="@dimen/scroll_tab_column_width" android:text="测试" android:textColor="@android:color/black" android:textSize="12sp" /> <com.co_insight.freshroad.business.widget.CHTableScrollView android:id="@+id/item_scroll" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:scrollbars="none"> <LinearLayout android:id="@+id/item_scroll_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" /> </com.co_insight.freshroad.business.widget.CHTableScrollView> </LinearLayout>
10.bg_edittext
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/bg_edittext_normal" android:state_window_focused="false"/> <item android:drawable="@drawable/bg_edittext_focused" android:state_focused="true"/> </selector> 11.bg_edittext_focused [html] view plain copy 在CODE上查看代码片派生到我的代码片 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#FFFFFF" /> <corners android:radius="0dip" /> <stroke android:width="0.1dp" android:color="@color/nav_selected" /> </shape>
12.bg_edittext_normal
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#FFFFFF" /> <corners android:radius="0dip" /> <stroke android:width="0.1dp" android:color="@color/nav_selected" /> </shape>
13.bg_edittext_normal_title
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <!--北京填充色--> <solid android:color="#00FFFFFF" /> <!--角的度数--> <corners android:radius="0dip" /> <!-- 边框 --> <stroke android:width="0.1dp" android:color="@color/nav_selected" />
14.PPOrderRequireMobModel
package com.co_insight.freshroad.business.bean; import java.util.ArrayList; import java.util.List; /** * 采购需求 * Created by Administrator on 2016/10/13. */ public class PPOrderRequireMobModel { private long CargoID;// 货物ID private String CargoName;// 货物名称 private long UnitID;// 单位ID private String UnitName;// 单位 private long PNameID;// 小类 private long CategoryID;// 品名属性ID private String CategoryName;// 品名属性 private double QtyRequire;// 需求量 private double QtyInventory;// 库存量 private long ID; private String CreateDate; private String UpdateDate; private List<PPOrderRequireItemMobModel> Items = new ArrayList<>();// 需求明细 public long getCargoID() { return CargoID; } public void setCargoID(long CargoID) { this.CargoID = CargoID; } public String getCargoName() { return CargoName; } public void setCargoName(String CargoName) { this.CargoName = CargoName; } public long getUnitID() { return UnitID; } public void setUnitID(long UnitID) { this.UnitID = UnitID; } public String getUnitName() { return UnitName; } public void setUnitName(String UnitName) { this.UnitName = UnitName; } public long getPNameID() { return PNameID; } public void setPNameID(long PNameID) { this.PNameID = PNameID; } public long getCategoryID() { return CategoryID; } public void setCategoryID(long CategoryID) { this.CategoryID = CategoryID; } public String getCategoryName() { return CategoryName; } public void setCategoryName(String CategoryName) { this.CategoryName = CategoryName; } public double getQtyRequire() { return QtyRequire; } public void setQtyRequire(double QtyRequire) { this.QtyRequire = QtyRequire; } public double getQtyInventory() { return QtyInventory; } public void setQtyInventory(double QtyInventory) { this.QtyInventory = QtyInventory; } public long getID() { return ID; } public void setID(long ID) { this.ID = ID; } public String getCreateDate() { return CreateDate; } public void setCreateDate(String CreateDate) { this.CreateDate = CreateDate; } public String getUpdateDate() { return UpdateDate; } public void setUpdateDate(String UpdateDate) { this.UpdateDate = UpdateDate; } public List<PPOrderRequireItemMobModel> getItems() { return Items; } public void setItems(List<PPOrderRequireItemMobModel> items) { Items = items; } }
好了,代码到此结束。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!