仿京東或淘寶的訂單中心頁面
因為最近有用到類似京東訂單中心的功能,遂決定寫篇部落格做個Demo,如有問題可留言探討。
先上效果圖:
評價和刪除訂單功能都做了簡單的實現。
開發這個功能主要用到了安卓中的ExpandlistView。ExpandlistView的使用跟ListView的使用類似,
如果對ExpandlistView的使用不太明白的同學可以參考網上的教程:
現在我們將上面的頁面做一個分析,
如圖:
根據上圖分析,我們便可以分別畫出父佈局的layout,和子佈局的layout
父layout的程式碼:
子layout程式碼:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:minHeight="40dp" android:layout_height="match_parent" android:gravity="center_vertical" android:background="@color/colorBackgroudParentView"> <ImageView android:layout_marginLeft="8dp" android:id="@+id/iv_parentview_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_marginLeft="8dp" android:id="@+id/tv_parentview_title" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:minHeight="100dp" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp"> <TextView android:layout_marginLeft="8dp" android:id="@+id/tv_childview_content" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:layout_alignParentBottom="true" > <Button android:focusable="false" android:visibility="gone" android:id="@+id/btn_childview_evaluate" android:layout_marginRight="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="評價"/> <Button android:focusable="false" android:visibility="gone" android:id="@+id/btn_childview_delete" android:layout_marginRight="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="刪除訂單"/> </LinearLayout> </RelativeLayout>
分析和佈局程式碼都介紹完了 我們就可以在activity中寫程式碼啦
activity中程式碼:
註釋已經寫得很明白了 我就不做介紹了。到此一個簡單的Demo製作完成。public class MainActivity extends AppCompatActivity { private ExpandableListView elMainOrdercenter; private Map<String,List<OrderInfo>> dataMap; private String[] titleArr; private int[] iconArr=new int[]{R.mipmap.icon1,R.mipmap.icon2,R.mipmap.icon3}; private MyAdapter myAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化資料 initData(); //初始化點選監聽事件 initOnclickListener(); } /** * 初始化資料 */ private void initData(){ //初始化ExpandlistView的id elMainOrdercenter=(ExpandableListView)findViewById(R.id.el_main_ordercenter); //初始化列表資料,正常由伺服器返回的Json資料 initJsonData(); myAdapter=new MyAdapter(); elMainOrdercenter.setAdapter(myAdapter); //設定列表展開 for(int i=0;i<dataMap.size();i++){ elMainOrdercenter.expandGroup(i); } } /** * 初始點選事件 */ private void initOnclickListener(){ //設定父標題點選不能收縮 elMainOrdercenter.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { return true; } }); //訂單子條目的點選事件 elMainOrdercenter.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Toast.makeText(MainActivity.this,"跳轉到訂單詳細頁面:"+childPosition,Toast.LENGTH_SHORT).show(); return false; } }); } /** * ExpandableListviewAdapter初始化 */ private class MyAdapter extends BaseExpandableListAdapter{ // 獲得父項的數量 @Override public int getGroupCount() { return dataMap.size(); } // 獲得某個父項的子項數目 @Override public int getChildrenCount(int groupPosition) { return dataMap.get(titleArr[groupPosition]).size(); } // 獲得某個父項 @Override public Object getGroup(int groupPosition) { return dataMap.get(titleArr[groupPosition]); } // 獲得某個父項的某個子項 @Override public Object getChild(int groupPosition, int childPosition) { return dataMap.get(titleArr[groupPosition]).get(childPosition); } // 獲得某個父項的id @Override public long getGroupId(int groupPosition) { return groupPosition; } // 獲得某個父項的某個子項的id @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } // 按函式的名字來理解應該是是否具有穩定的id,這個方法目前一直都是返回false,沒有去改動過 @Override public boolean hasStableIds() { return false; } // 獲得父項顯示的view @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if(convertView==null){ convertView=View.inflate(MainActivity.this,R.layout.parent_view,null); } ImageView ivParentviewIcon=(ImageView) convertView.findViewById(R.id.iv_parentview_icon); TextView tvParentviewTitle=(TextView) convertView.findViewById(R.id.tv_parentview_title); ivParentviewIcon.setImageResource(iconArr[groupPosition]); tvParentviewTitle.setText(titleArr[groupPosition]); return convertView; } // 獲得子項顯示的view @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if(convertView==null){ convertView=View.inflate(MainActivity.this,R.layout.child_view,null); } //獲取佈局控制元件id TextView tvChildviewContent=(TextView) convertView.findViewById(R.id.tv_childview_content); tvChildviewContent.setText(dataMap.get(titleArr[groupPosition]).get(childPosition).getName()); Button btnChildviewDelete=(Button) convertView.findViewById(R.id.btn_childview_delete); Button btnChildviewEvaluate=(Button) convertView.findViewById(R.id.btn_childview_evaluate); //根據伺服器返回的資料來顯示和隱藏按鈕 final OrderInfo orderInfo=dataMap.get(titleArr[groupPosition]).get(childPosition); if(orderInfo.isEvaluateState()){ btnChildviewEvaluate.setVisibility(View.VISIBLE); }else { btnChildviewEvaluate.setVisibility(View.GONE); } if(orderInfo.isDeleteState()){ btnChildviewDelete.setVisibility(View.VISIBLE); }else { btnChildviewDelete.setVisibility(View.GONE); } //設定評價按鈕的點選事件 btnChildviewEvaluate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"跳轉到"+orderInfo.getName()+"的評價頁面",Toast.LENGTH_SHORT).show(); } }); //設定刪除按鈕的點選事件 btnChildviewDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dataMap.get(titleArr[groupPosition]).remove(childPosition); myAdapter.notifyDataSetChanged(); } }); return convertView; } // 子項是否可選中,如果需要設定子項的點選事件,需要返回true @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } /** * 初始化列表資料,正常由伺服器返回的Json資料 */ private void initJsonData(){ dataMap=new HashMap<String,List<OrderInfo>>(); titleArr=new String[]{"商城店鋪1","商城店鋪2","商城店鋪3"}; List<OrderInfo> list1=new ArrayList<OrderInfo>(); List<OrderInfo> list2=new ArrayList<OrderInfo>(); List<OrderInfo> list3=new ArrayList<OrderInfo>(); OrderInfo orderInfo1=new OrderInfo(); orderInfo1.setName(titleArr[0]+"_one"); orderInfo1.setEvaluateState(true); orderInfo1.setDeleteState(false); OrderInfo orderInfo2=new OrderInfo(); orderInfo2.setName(titleArr[0]+"_two"); orderInfo2.setEvaluateState(false); orderInfo2.setDeleteState(true); OrderInfo orderInfo3=new OrderInfo(); orderInfo3.setName(titleArr[0]+"_three"); orderInfo3.setEvaluateState(true); orderInfo3.setDeleteState(true); OrderInfo orderInfo4=new OrderInfo(); orderInfo4.setName(titleArr[1]+"_one"); orderInfo4.setEvaluateState(true); orderInfo4.setDeleteState(false); OrderInfo orderInfo5=new OrderInfo(); orderInfo5.setName(titleArr[1]+"_two"); orderInfo5.setEvaluateState(false); orderInfo5.setDeleteState(true); OrderInfo orderInfo6=new OrderInfo(); orderInfo6.setName(titleArr[2]+"_one"); orderInfo6.setEvaluateState(true); orderInfo6.setDeleteState(false); OrderInfo orderInfo7=new OrderInfo(); orderInfo7.setName(titleArr[2]+"_two"); orderInfo7.setEvaluateState(false); orderInfo7.setDeleteState(true); OrderInfo orderInfo8=new OrderInfo(); orderInfo8.setName(titleArr[2]+"_three"); orderInfo8.setEvaluateState(true); orderInfo8.setDeleteState(true); OrderInfo orderInfo9=new OrderInfo(); orderInfo9.setName(titleArr[2]+"_four"); orderInfo9.setEvaluateState(false); orderInfo9.setDeleteState(false); list1.add(orderInfo1); list1.add(orderInfo2); list1.add(orderInfo3); list2.add(orderInfo4); list2.add(orderInfo5); list3.add(orderInfo6); list3.add(orderInfo7); list3.add(orderInfo8); list3.add(orderInfo9); dataMap.put(titleArr[0],list1); dataMap.put(titleArr[1],list2); dataMap.put(titleArr[2],list3); } }
當然ExpandlistView 與Listview類似,當載入資料很多的情況我們需要考慮對其優化。
考慮到增加優化程式碼會增加閱讀難度,所以本文沒有增加優化程式碼,有需要的同學可以自行新增。
本篇文章只給讀者一個思路,訂單中心還涉及到許多細節,可在此基礎上慢慢展開。
最後附上Demo地址:https://github.com/OptimusMX/OrderCenterFragment
對你有幫助的話記得給個star。
有讀者反饋fragment上遇到問題,遂增加了帶fragment的版本,
如有問題,可留言或私信交流。
相關推薦
仿京東或淘寶的訂單中心頁面
因為最近有用到類似京東訂單中心的功能,遂決定寫篇部落格做個Demo,如有問題可留言探討。先上效果圖:評價和刪除訂單功能都做了簡單的實現。開發這個功能主要用到了安卓中的ExpandlistView。ExpandlistView的使用跟ListView的使用類似,如果對Expan
Android仿京東、淘寶商品詳情頁上拉檢視更多詳情
老規矩,先上圖,沒圖說個J8 高清原圖GIF圖,請移步:https://github.com/kangkanger/SlideSeeMoreLayout/blob/master/screenshots/2.gif 相信現在只要做電商的APP,95%的UI設計師都會抄這個介面,所以把
仿淘寶訂單管理介面設計
package com.taobao.pll.tborderdemo; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.suppor
仿淘寶商品詳情頁面Android
1、需求: 要實現一個類似淘寶、京東的商品詳情頁面。首先是在看一些前輩的思路,檢視之後,發現博主qifengdeqingchen的文章不錯,然後去下載下來檢視demo。 2、查閱資料 來看看前輩的思路圖。使用兩個scrollView,兩個scr
京東、淘寶的減庫存操作,加購物車時減?建立訂單時減?
前幾天,在瀏覽京東購物車時,我的購物車內有一件商品剛好顯示庫存為:僅剩1件,所以就探索了一下商城網站的減庫存操作。 具體過程 首先購物車中是這樣的: 找到這件商品 繼續加購物車,看是否成功: 我發現,無論加幾件到購物車,仍然顯示只剩一件,我共加了四件 到這裡
看京東和淘寶的地址薄設計----填寫訂單的場景下
本人在工作中碰到設計地址薄的工作,就是在填寫訂單的情況下填寫地址。於是本著拿來主義,先參考京東和天貓的做法。 京東APP: 圖1、訂單頁面--京東 圖2、收貨地址--京東 在
阿裏,京東,淘寶,美團,那些你不知道的事兒
大眾 商業 business 抽象 模式 運營 公司 銷售 tom B2B即business to business,2是to的諧音,即企業與企業之間,商家與商家之間,通過互聯網進行產品、服務及信息的交換。 交易的供需雙方都是商家(或企業、公司)。如:阿裏巴巴就是這種模式的
vue實現星級評價及上傳多張圖片等功能(類似淘寶商品評價頁面)
最近在寫一個關於vue的商城專案,然後整合在移動端中,開發需求中有一介面,類似淘寶商城評價介面!實現效果圖如下所示: 評價頁 點選看大圖,且可左右滑動 功能需求分析 預設為5顆星,為非常滿意,4顆滿意,根據不同星級顯示不同滿意程度。 2.評價內容,最
基於JSON+JQuery實現的多條件篩選功能(類似京東和淘寶功能)
/** * Author:mengbing * * Date:2017-12-08 * http://www.allenyMiky.com * */ (function ($) { //初始化繫結事件 $(function () { }); $.
獲取淘寶訂單的解決方案
漏單問題:1、通過taobao.trades.sold.get和taobao.trades.sold.increment.get獲取訂單時,交易型別type入參預設只查詢部分型別的訂單,要查詢所有型別的訂單,必須顯式提供所有交易型別作為type入參。2、通過taobao.trades.sold.increme
仿京東的購物車和訂單
//從購物車跳轉到了確認訂單介面 /** * 確認下單介面 */ public class Main2Activity extends AppCompatActivity { private TextView text_order; private TextView tex
京東和淘寶
京東的物流一直是它的核心武器,但年年虧損。我在美國工作的時候就接觸了第三方物流,其實發達國家第3方物流已經存在20多年了,自建物流卻沒有怎麼聽說。當然,京東也去年開始啟動把物流進行社會化。本人認為只有走第三方物流的路子,才能就競爭力,才能提升企業發展,自建物流很容易有背靠大
linux如何爬取淘寶訂單?
如何爬取淘寶訂單? 1.可以直接抓取post資料,模擬發包。但是有時候需要滑塊驗證。 2.通過然後傳送之後掃這樣可以直接登入爬取訂單了。 如何自動發貨? 1.post即可 如何好評發表不同的圖片和評論? 同上。
Android 仿淘寶京東等我的訂單介面及任意列表拓展
概述 目前像淘寶及展示列表等都有多個item展示的需求,可能大多數如果沒做過,第一眼就是ListView去巢狀ListView,雖然這樣是可以完成,但是這樣做會導致手機過度繪製,為什麼呢?因為當一個Item載入的時候又會去更新item裡面的adapter,ap
轉::iOS 仿淘寶,上拉進入詳情頁面
skin memory 增加 方法 fin goto elf jsb gis 今天做的主要是一個模仿淘寶,上拉進入商品詳情的功能,主要是通過 tableView 與 webView 一起來實現的,當然也可根據自己的需要把 webView 替換成你想要的 1 //
用php+mysql+ajax實現淘寶客服或阿裏旺旺聊天功能 之 前臺頁面
group -a com 現在 中間 數據 bottom margin -m 首先來看一下我已經實現的效果圖: 消費者頁面:(本篇隨筆) (1)會顯示店主的頭像 (2)當前用戶發送信息顯示在右側,接受的信息,顯示在左側 店主或客服頁面:(下一篇隨筆) (1)在左側有一個列
用php+mysql+ajax實現淘寶客服或阿裏旺旺聊天功能 之 後臺頁面
聯系人 http esc hold 聊天內容 12px onclick onf pda 在上一篇隨筆中,我們已經看了如何實現前臺的對話功能;前臺我限定了店主只有一人,店鋪只有一個,所有比較單一,但後臺就不一樣了,而後臺更像是我們常見的聊天軟件;當然,前臺也應該實現這種效果,
仿淘寶頁面的搜索引擎,點擊輸入框文字不消失
arch 大堆 urn images ace src func 國際 lan 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8
仿淘寶、京東、美團使用ViewPager+GridView實現左右滑動檢視更多分類導航功能
文章說明 本文修改自開發者原始碼 微信公共號:China-dvlp 如果你有想學習的文章直接關注公眾號(開發者原始碼)回覆,我會整理徵稿。如果你有好的文章想和大家分享歡迎投稿,直接向我回覆文章連結即可。 概 述 仿淘寶、京東、美團使用ViewPage
Android 仿京東,淘寶RecyclerView巢狀ViewPager巢狀RecyclerView商品展示
最近看到京東,淘寶都有RecyclerView巢狀ViewPager巢狀RecyclerView商品展示的效果,效果挺好,廢話不多說先看效果圖: GIF.gif 技能點: 1.Android事件分發機制等 需求點: 1.列表巢狀,內層的列表可以左右切換 2.V