Android简单MVP解析接口列表,搜索框,点击切换

本文详细介绍了一个安卓应用的开发过程,从清单文件配置到使用Gson、Glide等库,再到RecyclerView的实现,包括线性和网格布局。展示了如何通过网络请求获取商品数据并展示在列表中,同时提供了搜索、排序和布局切换功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//清单文件

<uses-permission android:name="android.permission.INTERNET" />

//应用依赖

	implementation 'com.google.code.gson:gson:2.8.5'
    	implementation 'com.github.bumptech.glide:glide:4.8.0'
   	implementation 'com.android.support:recyclerview-v7:28.0.0'
    	implementation('com.jcodecraeer:xrecyclerview:1.5.9') {
        exclude group: 'com.android.support'
    }

//布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"
    android:orientation="vertical"
    android:padding="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/mSou"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:src="@drawable/sousuo"/>
        <EditText
            android:id="@+id/mET"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_weight="15"
            android:hint="搜索" />
        <ImageView
            android:id="@+id/mQie"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:src="@drawable/wangge"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/mBt1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="综合"/>
        <Button
            android:id="@+id/mBt2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="销量"/>
        <Button
            android:id="@+id/mBt3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="价格"/>
        <Button
            android:id="@+id/mBt4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="筛选"/>
    </LinearLayout>
    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:id="@+id/mXRV"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.jcodecraeer.xrecyclerview.XRecyclerView>
</LinearLayout>

//MainACctivity层

package com.example.nuli;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import com.example.nuli.adapter.GridAdapter;
import com.example.nuli.adapter.ListAdapter;
import com.example.nuli.bean.Goods;
import com.example.nuli.bean.Result;
import com.example.nuli.core.CallBacks;
import com.example.nuli.presenter.ListPresenter;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements CallBacks<List<Goods>> {

    private Button button1,button2,button3,button4;
    String url = "http://www.zhaoapi.cn/product/searchProducts?keywords=手机&page=";
    private EditText met;
    private XRecyclerView xrecyclerview;
    private ImageView image1,image2;
    List<Goods> list = new ArrayList<>();
    int page=1;
    int sort=0;
    //判断布局
    boolean a=true;
    private ListPresenter listPresenter;
    private ListAdapter adapter;
    private GridAdapter gridAdapter;
    private LinearLayoutManager linearLayoutManager;
    private String trim="手机";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件
        button1 = findViewById(R.id.mBt1);
        button2 = findViewById(R.id.mBt2);
        button3 = findViewById(R.id.mBt3);
        button4 = findViewById(R.id.mBt4);
        image1 = findViewById(R.id.mSou);
        image2 = findViewById(R.id.mQie);
        met = findViewById(R.id.mET);
        xrecyclerview = findViewById(R.id.mXRV);
        //presenter层
        listPresenter = new ListPresenter(this);
        String urls=url+page+"&sort="+sort;
        listPresenter.add(urls);
        //线性adapter
        adapter = new ListAdapter(MainActivity.this,list);
        linearLayoutManager = new LinearLayoutManager(this);

        xrecyclerview.setLayoutManager(linearLayoutManager);
        gridAdapter = new GridAdapter(MainActivity.this,list);
        xrecyclerview.setAdapter(adapter);
        //搜索按钮
        image1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                list.clear();
                trim = met.getText().toString().trim();
                page=1;
                sort=0;
                url = "http://www.zhaoapi.cn/product/searchProducts?keywords="+ trim +"&page=";
                String urls=url+page+"&sort="+sort;
                listPresenter.add(urls);
            }
        });
        //设置刷新
        xrecyclerview.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                page=1;
                String urls=url+page+"&sort="+sort;
                list.clear();
                listPresenter.add(urls);
            }

            @Override
            public void onLoadMore() {
                page++;
                String urls=url+page+"&sort="+sort;
                listPresenter.add(urls);
            }
        });
        //价格
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                list.clear();
                page=1;
                sort=2;
                url = "http://www.zhaoapi.cn/product/searchProducts?keywords="+trim+"&page=";
                String urls=url+page+"&sort="+sort;
                listPresenter.add(urls);
            }
        });
        //销量
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                list.clear();
                page=1;
                sort=1;
                url = "http://www.zhaoapi.cn/product/searchProducts?keywords="+trim+"&page=";
                String urls=url+page+"&sort="+sort;
                listPresenter.add(urls);
            }
        });
        //切换
        image2.setOnClickListener(new View.OnClickListener() {
            private GridLayoutManager gridLayoutManager;
            @Override
            public void onClick(View v) {
                if (a){
                    gridAdapter = new GridAdapter(MainActivity.this,list);
                    gridLayoutManager = new GridLayoutManager(MainActivity.this,2);
                    xrecyclerview.setLayoutManager(gridLayoutManager);
                    xrecyclerview.setAdapter(gridAdapter);
                    a=false;
                }else {
                    adapter = new ListAdapter(MainActivity.this,list);
                    linearLayoutManager = new LinearLayoutManager(MainActivity.this);
                    xrecyclerview.setLayoutManager(linearLayoutManager);
                    xrecyclerview.setAdapter(adapter);
                    a=true;
                }
            }
        });
    }
    //成功
    @Override
    public void success(List<Goods> goods) {
        list.addAll(goods);
        adapter.notifyDataSetChanged();
        xrecyclerview.loadMoreComplete();
        xrecyclerview.refreshComplete();
        gridAdapter.notifyDataSetChanged();
        //删除条目调用接口
        adapter.setOnItmeClickListener(new ListAdapter.ClickListener() {
            @Override
            public void onItmeClickListener(View view, int position) {
                list.remove(position);
                adapter.notifyDataSetChanged();
            }
        });
    }
    //失败
    @Override
    public void fail(Result result) {
        Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_LONG).show();
    }
}

//Presenter层

package com.example.nuli.presenter;

import android.os.Handler;
import android.os.Message;

import com.example.nuli.MainActivity;
import com.example.nuli.bean.Result;
import com.example.nuli.core.CallBacks;
import com.example.nuli.model.ListModel;

public class ListPresenter {
    CallBacks callBacks;
    public ListPresenter(CallBacks callBacks) {
        this.callBacks=callBacks;
    }
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            Result result = (Result) msg.obj;
            if (result.getCode()==0){
                callBacks.success(result.getData());
            }else {
                callBacks.fail(result);
            }
        }
    };

    public void add(final String url) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Result result = ListModel.getGoods(url);
                Message message = handler.obtainMessage();
                message.obj=result;
                handler.sendMessage(message);
            }
        }).start();
    }
}

//Model层

package com.example.nuli.model;

import com.example.nuli.bean.Goods;
import com.example.nuli.bean.Result;
import com.example.nuli.utils.OkHttp;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;

public class ListModel {
    public static Result getGoods(String url){
        String s = OkHttp.get(url);
        Type type = new TypeToken<Result<List<Goods>>>() {}.getType();
        Gson gson = new Gson();
        Result result = gson.fromJson(s, type);
        return result;
    }
}

//线性Adapter

package com.example.nuli.adapter;

import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.example.nuli.MainActivity;
import com.example.nuli.R;
import com.example.nuli.bean.Goods;

import java.util.List;

public class ListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    private Activity activity;
    private List<Goods> list;
    //删除监听
    private ClickListener clickListener;

    public ListAdapter(MainActivity activity, List<Goods> list) {
        this.activity=activity;
        this.list=list;
    }


    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view =View.inflate(activity,R.layout.item_01,null);
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, final int i) {
        final MyHolder holder1 = (MyHolder) viewHolder;
        holder1.text1.setText(list.get(i).getTitle());
        holder1.text2.setText("¥"+list.get(i).getPrice());
        String images = list.get(i).getImages();
        String[] split = images.split("\\|");
        Glide.with(activity).load(split[0]).into(holder1.image);
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(activity,"点击了",Toast.LENGTH_LONG).show();
                clickListener.onItmeClickListener(v,i);
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }


    public class MyHolder extends RecyclerView.ViewHolder{
        private final ImageView image;
        private final TextView text1,text2;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.mIV1);
            text1 = itemView.findViewById(R.id.textview1);
            text2 = itemView.findViewById(R.id.textview2);
        }
    }
    //监听接口
    public interface ClickListener{
        void onItmeClickListener(View view,int position);
    }
    public void setOnItmeClickListener(ClickListener clickListener){
        this.clickListener = clickListener;
    }
}

//网格Adapter

package com.example.nuli.adapter;

import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.nuli.MainActivity;
import com.example.nuli.R;
import com.example.nuli.bean.Goods;

import java.util.List;

public class GridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    private Activity activity;
    private List<Goods> list;
    public GridAdapter(MainActivity activity, List<Goods> list) {
        this.activity = activity;
        this.list=list;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view =View.inflate(activity, R.layout.item_02,null);
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        MyHolder myHolder =(MyHolder) viewHolder;
        myHolder.text3.setText(list.get(i).getTitle());
        myHolder.text4.setText("¥"+list.get(i).getPrice());

        String images = list.get(i).getImages();
        String[] split = images.split("\\|");
        Glide.with(activity).load(split[0]).into(myHolder.imageView);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
    class MyHolder extends RecyclerView.ViewHolder{

        private final ImageView imageView;
        private final TextView text3,text4;

        public MyHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.image2);
            text3 = itemView.findViewById(R.id.textview3);
            text4 = itemView.findViewById(R.id.textview4);
        }
    }

}

//OKHTTP

package com.example.nuli.utils;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttp {
    public static String get(String url) {
        OkHttpClient okHttpClient = new OkHttpClient();

        Request request = new Request.Builder().url(url).build();

        Call call = okHttpClient.newCall(request);

        try {
            Response execute = call.execute();
            return execute.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return url;
    }
}

小小效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值