仿京东电商 首页+商品详情

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.administrator.my1023.MainActivity">

   <com.example.administrator.my1023.zidingyi.MyScrollView
       android:id="@+id/index_sv"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

       <LinearLayout
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:orientation="vertical">
           <com.youth.banner.Banner
               android:layout_width="match_parent"
               android:layout_height="200dp"
               android:id="@+id/index_banner"></com.youth.banner.Banner>
           <android.support.v7.widget.RecyclerView
               android:id="@+id/index_jgg"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <ImageView
                android:layout_width="60dp"
                android:layout_height="20dp"
                android:src="@drawable/kaui"/>
            <ViewFlipper
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:autoStart="true"
                android:flipInterval="3000"
                android:inAnimation="@anim/anim_in"
                android:outAnimation="@anim/anim_out">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:maxLines="1"
                    android:text="hot vivo X20 带你开启全面屏时代!逆光也清晰,照亮你的美!"
                    android:textSize="12dp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:maxLines="1"
                    android:text="推荐 【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机"
                    android:textSize="12dp" />

            </ViewFlipper>
        </LinearLayout>
           <LinearLayout
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:orientation="horizontal">
               <ImageView
                   android:layout_width="60dp"
                   android:layout_height="20dp"
                   android:src="@drawable/miaos"
                   />
               <TextView
                   android:text="00点场"
                   android:id="@+id/index_even"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_marginLeft="10dp" />
               <TextView
                   android:layout_marginLeft="15dp"
                   android:id="@+id/index_hour"
                   android:text="00"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content" />
               <TextView
                   android:text=":"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content" />
               <TextView
                   android:id="@+id/index_minute"
                   android:text="00"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content" />
               <TextView
                   android:text=":"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content" />
               <TextView
                   android:id="@+id/index_second"
                   android:text="00"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content" />
               
           </LinearLayout>
           <ImageView
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:src="@drawable/tuijian"
               />
           <android.support.v7.widget.RecyclerView
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:id="@+id/index_tuijian"></android.support.v7.widget.RecyclerView>
       </LinearLayout>



   </com.example.administrator.my1023.zidingyi.MyScrollView>
    <include layout="@layout/mysearch"/>
</RelativeLayout>

mysearch.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/sousuokuang"
    android:background="#FFF9F9"
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal"
    android:gravity="center_vertical">

    <TextView
        android:id="@+id/mysearch_sao"
        android:gravity="center"
        android:text="扫一扫"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_weight="2"
        />

    <RelativeLayout
        android:id="@+id/mysearch_rl"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_weight="6"
        android:background="@drawable/suosuo">

        <ImageView
            android:layout_marginTop="3dp"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:src="@drawable/a_4" />

        <ImageView
            android:layout_marginTop="3dp"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:src="@drawable/root" />
    </RelativeLayout>

    <TextView
        android:id="@+id/mysearch_info"
        android:gravity="center"
        android:text="消息"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_weight="2"
        />
</LinearLayout>

jgg_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical"
    android:padding="5dp"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.facebook.drawee.view.SimpleDraweeView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/jgg_img"
        app:placeholderImage="@drawable/ic_launcher_background"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/jgg_name"/>
</LinearLayout>

tuijian_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.facebook.drawee.view.SimpleDraweeView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/tuijian_img"
        android:layout_gravity="center_horizontal"
        app:placeholderImage="@drawable/ic_launcher_background"/>
    <TextView
        android:maxLines="2"
        android:id="@+id/tuijian_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/tuijian_price"
        android:textColor="#FF0000"
        android:layout_marginTop="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

activity_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.administrator.my1023.DetailActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="9"
        android:orientation="vertical"
        >
        <com.youth.banner.Banner
            android:layout_width="match_parent"
            android:layout_height="350dp"
            android:id="@+id/datail_banner"
            ></com.youth.banner.Banner>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textColor="#FF0000"
            android:id="@+id/detail_price"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/detail_title"
            android:textColor="#363636"
            android:layout_marginTop="10dp"
            />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/zxcv"></LinearLayout>
    </LinearLayout>
    <Button
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="加入购物车"/>
</LinearLayout>

现在是JAVA代码

Api

public interface Api {
    @GET("home/getHome")
    Observable<Home> getHome();
    //商品详情
    @GET("product/getProductDetail")
    Observable<Detail> getDetail(@Query("pid") String pid);
}

MyApi

public class MyApi {
    public static final String BASE_URL = "http://www.zhaoapi.cn/";
}

Myapp

public class Myapp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize( this );
    }
}

RetrofitUtil

public class RetrofitUtil {
    private final Retrofit retrofit;
    private HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(  ).setLevel( HttpLoggingInterceptor.Level.BODY );
    private RetrofitUtil(){
        retrofit = new Retrofit.Builder()
                .baseUrl( MyApi.BASE_URL )
                .addConverterFactory( GsonConverterFactory.create(  ) )
                .addCallAdapterFactory( RxJava2CallAdapterFactory.create() )
                .client( buildOkhttpClinet() )
                .build();
    }
    private OkHttpClient buildOkhttpClinet(){
        return new OkHttpClient.Builder()
                .addInterceptor( httpLoggingInterceptor )
                .build();
    }
    //暴露外部的方法
    public static RetrofitUtil getDefault(){
        return SingleHolder._instant;
    }
    private static class SingleHolder{
        private static final RetrofitUtil _instant = new RetrofitUtil();
    }
    //动态代理创建接口实体类
    public <T> T create(Class<T> Clazz){
        return retrofit.create( Clazz );
    }
}

IView

public interface IView {
    void onSuccrss(Home home);
}

DetailView

public interface DetailView {
    void onDetailSuccess(Detail detail);

}

IModel

public class IModel {
    public Observable<Home> getHome(){
        return RetrofitUtil.getDefault().create( Api.class ).getHome();
    }
    public Observable<Detail> getDetail(String pid){
        return RetrofitUtil.getDefault().create( Api.class ).getDetail( pid );
    }
}

IProsenter

public class IProsenter {
    private IModel iModel;
    IView miView;
    public IProsenter(IView iView){
        miView = iView;
        iModel = new IModel();
    }
    public void getHome(){
        iModel.getHome()
                .subscribeOn( Schedulers.io() )
                .observeOn( AndroidSchedulers.mainThread() )
                .subscribe( new Observer<Home>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                    }
                    @Override
                    public void onNext(Home home) {
                        miView.onSuccrss( home );
                    }
                    @Override
                    public void onError(Throwable e) {

                    }
                    @Override
                    public void onComplete() {

                    }
                } );
    }
}

DetailProsenter

public class DetailProsenter {
    private IModel model;
    DetailView mView;

    public DetailProsenter(DetailView detailView){
        mView = detailView;
        model = new IModel();
    }
    public void getDetail(String pid){
        model.getDetail( pid )
                .subscribeOn( Schedulers.io() )
                .observeOn( AndroidSchedulers.mainThread() )
                .subscribe( new Observer<Detail>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }
                    @Override
                    public void onNext(Detail detail) {
                        mView.onDetailSuccess( detail );
                    }
                    @Override
                    public void onError(Throwable e) {

                    }
                    @Override
                    public void onComplete() {
                    }
                } );
    }
}

MainActivity

public class MainActivity extends AppCompatActivity implements IView{
    @BindView(R.id.index_banner)
    Banner indexBanner;
    @BindView(R.id.index_jgg)
    RecyclerView indexJgg;
    @BindView(R.id.index_even)
    TextView indexEven;
    @BindView(R.id.index_hour)
    TextView indexHour;
    @BindView(R.id.index_minute)
    TextView indexMinute;
    @BindView(R.id.index_second)
    TextView indexSecond;
    @BindView(R.id.index_tuijian)
    RecyclerView indexTuijian;
    @BindView(R.id.index_sv)
    MyScrollView indexSv;
    @BindView(R.id.mysearch_sao)
    TextView mysearchSao;
    @BindView(R.id.mysearch_rl)
    RelativeLayout mysearchRl;
    @BindView(R.id.mysearch_info)
    TextView mysearchInfo;
    @BindView(R.id.sousuokuang)
    LinearLayout sousuokuang;
    private Unbinder unbinder;
    private IProsenter prosenter;
    private List<Home.DataBean> data;
    private CompositeDisposable compositeDisposable = new CompositeDisposable(  );
    private final int REQUEST_CODE = 200;
    private List<Home.DataBean.BannerBean> ban;
    private List<Home.DataBean.FenleiBean> jiugg;
    private List<Home.DataBean.TuijianBean.ListBeanX> tuijian;
    private String icon;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        unbinder = ButterKnife.bind( this );
        initData();
        sousuokuang.getBackground().setAlpha( 0 );
        indexSv.setOnScrollChanged( new MyScrollView.OnScrollChanged() {
            @Override
            public void onScrollChanged(int x, int y, int oldx, int oldy) {
                if(y<270){
                    int i = (int) ((float) y/ (float)270*255);
                    sousuokuang.getBackground().setAlpha( i );
                }else {
                    sousuokuang.getBackground().setAlpha( 255 );
                }
            }
        } );
    }
    private void initData() {
        prosenter = new IProsenter( this );
        indexJgg.setLayoutManager( new GridLayoutManager( this,2, LinearLayoutManager.HORIZONTAL,false ) );
        indexTuijian.setLayoutManager( new GridLayoutManager( this,2 ) );
        //关闭滑动嵌套
        indexTuijian.setNestedScrollingEnabled( false );
        //固定recycleview的尺寸
        indexTuijian.setHasFixedSize( true );
        prosenter.getHome();
    }
    private void initBanner(){
        List<String> asd = new ArrayList<>(  );
        for (int i = 0;i<ban.size();i++){
            icon = ban.get( i ).getIcon().replace( "https","http" );
            asd.add( icon );
        }
        indexBanner.setImages( asd )
                .isAutoPlay( true )
                .setImageLoader( new MyLoader() )
                .start();
    }
    public void onCatagorySuccess(){
        JggAdapter adapter = new JggAdapter( jiugg );
        indexJgg.setAdapter( adapter );
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbinder.unbind();
        prosenter = null;
    }
    private void initTuijian(){
        TuijianAdapter adapter = new TuijianAdapter( tuijian );
        indexTuijian.setAdapter( adapter );
    }
    @Override
    public void onSuccrss(Home home) {
        ban = home.getData().getBanner();
        tuijian = home.getData().getTuijian().getList();
        jiugg = home.getData().getFenlei();
        onCatagorySuccess(  );
        initTuijian();
        initBanner();
    }
}

JggAdapter

public class JggAdapter extends RecyclerView.Adapter {
    private List<Home.DataBean.FenleiBean> list;
    public JggAdapter(List<Home.DataBean.FenleiBean> list) {
        this.list = list;
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = View.inflate( parent.getContext(), R.layout.jgg_item,null );
            ViewHolder viewHolder = new ViewHolder( view );
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                ViewHolder mHolder = (ViewHolder) holder;
        Home.DataBean.FenleiBean bean = list.get( position );
        mHolder.jggImg.setImageURI( Uri.parse( bean.getIcon() ) );
        mHolder.jggName.setText( bean.getName() );
    }
    @Override
    public int getItemCount() {
        return list.size();
    }
    static class ViewHolder extends RecyclerView.ViewHolder{
        @BindView(R.id.jgg_img)
        SimpleDraweeView jggImg;
        @BindView(R.id.jgg_name)
        TextView jggName;

        ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
}

TuijianAdapter

public class TuijianAdapter extends RecyclerView.Adapter {
    private List<Home.DataBean.TuijianBean.ListBeanX> list;
    private Context context;
    public TuijianAdapter(List<Home.DataBean.TuijianBean.ListBeanX> list) {
        this.list = list;
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      context = parent.getContext();
        View view = View.inflate( context, R.layout.tuijian_item,null );
        ViewHolder viewHolder = new ViewHolder( view );
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        ViewHolder mHolder = (ViewHolder) holder;
        final  Home.DataBean.TuijianBean.ListBeanX bean = list.get( position );
        //处理图片url
        String imgUrl = getImgUrl(bean.getImages());
        mHolder.tuijianImg.setImageURI( Uri.parse(imgUrl));
        mHolder.tuijianTitle.setText(bean.getTitle());
        mHolder.tuijianPrice.setText("¥" + bean.getPrice());
        mHolder.itemView.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent( context, DetailActivity.class );
                intent.putExtra( "pid",bean.getPid()+"" );
                context.startActivity( intent );
            }
        } );
    }
    private String getImgUrl(String images) {
        String[] split = images.split("\\|");
        return split[0];
    }
    @Override
    public int getItemCount() {
        return list.size();
    }
    class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.tuijian_img)
        SimpleDraweeView tuijianImg;
        @BindView(R.id.tuijian_title)
        TextView tuijianTitle;
        @BindView(R.id.tuijian_price)
        TextView tuijianPrice;
        ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
}

DetailActivity

public class DetailActivity extends AppCompatActivity implements DetailView{
    @BindView(R.id.datail_banner)
    Banner datailBanner;
    @BindView(R.id.detail_price)
    TextView detailPrice;
    @BindView(R.id.detail_title)
    TextView detailTitle;
    private Detail.DataBean data;
    private String pid;
    private DetailProsenter prosenter;
    Unbinder unbinder;
    private List<String> path;
    private String images;
    private String[] split;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_detail );
        unbinder = ButterKnife.bind( this );
        initData();
    }
    private void initData() {
        prosenter = new DetailProsenter( this );
        pid = getIntent().getStringExtra( "pid" );
        prosenter.getDetail( pid );
    }
    
    @Override
    public void onDetailSuccess(Detail detail) {
        data = detail.getData();
        path = new ArrayList<>(  );
        images = data.getImages();

        split = images.split( "\\|" );
        for (int i = 0;i<split.length;i++){
            path.add( split[i] );
        }
        datailBanner.setImages( path )
                .isAutoPlay( true )
                .setImageLoader( new MyLoader() )
                .start();
        detailTitle.setText( data.getTitle() );
        detailPrice.setText("¥"+data.getBargainPrice() );
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值