RecyclerView+OkHttp+多条目加载

倒依赖

 //加载  图片用的包
    implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
//Gson
    implementation 'com.google.code.gson:gson:2.6.2'


    //recyclerView的依赖
    compile 'com.android.support:recyclerview-v7:26+'

    // OkHttp
    implementation 'com.squareup.okhttp3:okhttp:3.9.0'

添加网络权限

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

先分包

base

mvp   里面有  model  view   presenter

adapter

utils       有 OkHttpUtls      HttpConfig

bean 包

app  包


主xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    android:orientation="horizontal"
    tools:context="com.example.lianxi.mvp.view.activitys.MainActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/main_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
子布局1
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/item_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/item_img"
        android:layout_toStartOf="@+id/item_img"
        android:text="title"
        android:textSize="17sp" />

    <ImageView
        android:id="@+id/item_img"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/item_tvv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/item_img"
        android:layout_marginEnd="11dp"
        android:layout_marginRight="11dp"
        android:layout_toLeftOf="@+id/item_img"
        android:layout_toStartOf="@+id/item_img"
        android:text="views" />

</RelativeLayout>

子布局2

<?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"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="title"
        android:textSize="17sp"
        />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/title"
        android:layout_marginTop="31dp"
        app:srcCompat="@mipmap/ic_launcher" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:layout_alignTop="@+id/imageView"
        android:layout_centerHorizontal="true"
        app:srcCompat="@mipmap/ic_launcher" />

    <ImageView
        android:id="@+id/imageView3"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/imageView2"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/pinglun"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/imageView3"
        android:layout_marginEnd="23dp"
        android:layout_marginRight="23dp"
        android:layout_marginTop="12dp"
        android:text="评论" />

</RelativeLayout>


先写base   包里面的  BaseActivity   BasePresenter   IView

BaseActivity   

public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity{
    protected P presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(provideLayoutId());
        initViews();
        initListener();
        presenter=providePresenter();
        initDatas();
    }

    protected abstract P providePresenter();

    protected abstract int provideLayoutId();

    protected abstract void initDatas();

    protected abstract void initListener();

    protected abstract void initViews();

    @Override
    protected void onDestroy() {
        presenter.onDestroy();
        super.onDestroy();
    }
}
 

BasePresenter   

public abstract class BasePresenter<V extends IView> {
    protected V view;
    public BasePresenter(V view){
        this.view=view;
        initModel();
    }

    protected abstract void initModel();
    void onDestroy(){
        view=null;
    }
}
IView
public interface IView {
    Context context();
}

 app

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //初始化ImageLoader
        //创建默认的ImageLoader配置参数
        ImageLoaderConfiguration configuration = ImageLoaderConfiguration
                .createDefault(this);

        //Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(configuration);
    }

    public static DisplayImageOptions getOptions() {
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.mipmap.ic_launcher) // resource or drawable
                .showImageForEmptyUri(R.mipmap.ic_launcher) // resource or drawable
                .showImageOnFail(R.mipmap.ic_launcher) // resource or drawable
                .cacheInMemory(false) // default
                .cacheOnDisk(false) // default
                .displayer(new SimpleBitmapDisplayer()) // default
                .handler(new Handler()) // default
                .build();
        return options;
    }
}

OkHttpUtils

public class OkHttpUtils {
    public static OkHttpUtils oKhttpUtils;
    private final OkHttpClient okHttpClient;
    private final Handler myhandler;


    private OkHttpUtils() {
        //日志拦截器
//        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
//        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);


        //主线程Handler
        myhandler = new Handler(Looper.getMainLooper());
        okHttpClient = new OkHttpClient.Builder()
                .readTimeout(5000, TimeUnit.MILLISECONDS)
                .writeTimeout(5000, TimeUnit.MILLISECONDS)
                .connectTimeout(5000, TimeUnit.MILLISECONDS)
                //  .addInterceptor(httpLoggingInterceptor)
                .build();
    }


    public static OkHttpUtils getoKhttpUtils() {
        if (oKhttpUtils == null) {
            synchronized (OkHttpUtils.class) {
                if (oKhttpUtils == null) {
                    return oKhttpUtils = new OkHttpUtils();
                }
            }
        }
        return oKhttpUtils;
    }


    //异步get
    public void doGet(String url, final IOKhttpUtilsCallback ioKhttpUtilsCallback) {
        Request request = new Request.Builder()
                .get()
                .url(url)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                if (ioKhttpUtilsCallback != null) {
                    //切换到主线程
                    myhandler.post(new Runnable() {
                        @Override
                        public void run() {
                            ioKhttpUtilsCallback.onFailure(e.getMessage());
                        }
                    });
                }
            }



            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response != null && response.isSuccessful()) {
                    final String json = response.body().string();
                    if (ioKhttpUtilsCallback != null) {
                        //切换到主线程
                        myhandler.post(new Runnable() {
                            @Override
                            public void run() {
                                ioKhttpUtilsCallback.onResponse(json);
                            }
                        });
                    }


                } else {
                    if (ioKhttpUtilsCallback != null) {
                        //切换到主线程
                        myhandler.post(new Runnable() {
                            @Override
                            public void run() {
                                ioKhttpUtilsCallback.onFailure("网络异常");
                            }
                        });
                    }
                }
            }
        });


    }


    //异步post
    public void doPost(String url, Map<String, String> map, final IOKhttpUtilsCallback ioKhttpUtilsCallback) {
        FormBody.Builder builder = new FormBody.Builder();
        for (Map.Entry<String, String> entry : map.entrySet()) {
            builder.add(entry.getKey(), entry.getValue());
        }
        FormBody formBody = builder.build();
        Request request = new Request.Builder()
                .post(formBody)
                .url(url)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                if (ioKhttpUtilsCallback != null) {
                    //切换到主线程
                    myhandler.post(new Runnable() {
                        @Override
                        public void run() {
                            ioKhttpUtilsCallback.onFailure(e.getMessage());
                        }
                    });
                }
            }


            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response != null && response.isSuccessful()) {
                    final String json = response.body().string();
                    if (ioKhttpUtilsCallback != null) {
                        //切换到主线程
                        myhandler.post(new Runnable() {
                            @Override
                            public void run() {
                                ioKhttpUtilsCallback.onResponse(json);
                            }
                        });
                    }


                } else {
                    if (ioKhttpUtilsCallback != null) {
                        //切换到主线程
                        myhandler.post(new Runnable() {
                            @Override
                            public void run() {
                                ioKhttpUtilsCallback.onFailure("网络异常");
                            }
                        });
                    }
                }
            }
        });
    }


    //接口回调
    public interface IOKhttpUtilsCallback {
        void onFailure(String error);


        void onResponse(String json);
    }
}



MainModel

public class MainModel {
public void getNews(Integer page, final IMainModelCallback iMainModelCallback){
    OkHttpUtils oKhttpUtils = OkHttpUtils.getoKhttpUtils();
    oKhttpUtils.doGet(HttpConfig.MAIN_SHUJU + "?page="+page, new OkHttpUtils.IOKhttpUtilsCallback() {
        @Override
        public void onFailure(String error) {
            if (iMainModelCallback!=null) {
                iMainModelCallback.getFaild(error);
            }
        }

        @Override
        public void onResponse(String json) {
            MainBean mainBean = new Gson().fromJson(json, MainBean.class);
            int code = mainBean.getCode();
            if(0==code){
                if (iMainModelCallback!=null) {
                    iMainModelCallback.getSuccess(mainBean);
                }
            }else{
                if (iMainModelCallback!=null) {
                    iMainModelCallback.getFaild("请求数据失败");
                }
            }

        }
    });
}

public interface IMainModelCallback{
    void getSuccess(MainBean newsBean);
    void getFaild(String error);
}
}



MainPresenter

public class MainPresenter extends BasePresenter<MainView> {


    private MainModel mainModel;

    public MainPresenter(MainView iMainView) {
        super(iMainView);
    }

    @Override
    protected void initModel() {
        mainModel = new MainModel();
    }

    public void getNews(Integer page) {
        mainModel.getNews(page, new MainModel.IMainModelCallback() {

            @Override
            public void getSuccess(MainBean newsBean) {
                if (view != null) {
                    view.onSuccess(newsBean);
                }
            }

            @Override
            public void getFaild(String error) {
                if (view != null) {
                    view.onFaild(error);
                }
            }
        });
    }
}

MainView

public interface MainView extends IView {
    void onSuccess(MainBean loginBean);
    void onFaild(String error);

}


多条目适配器

public class MainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

      private List<MainBean.DataBeanX.DataBean> list;
    private static final int viewType01 = 0;
    private static final int viewType02 = 1;

    public MainAdapter(List<MainBean.DataBeanX.DataBean> list) {
        this.list = list;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView01 = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item_01, parent, false);
        ;
        View itemView02 = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item_02, parent, false);
        ;

        if (viewType == viewType01) {
            return new MyViewHolder01(itemView01);
        }
        return new MyViewHolder02(itemView02);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
            if(holder instanceof MyViewHolder01){
                 ((MyViewHolder01) holder).textView01.setText(list.get(position).getTitle());
                ((MyViewHolder01) holder).textView02.setText(list.get(position).getComment_amount()+"评论");
                String url="http://365jia.cn/uploads/"+list.get(position).getPics().get(0);
                ImageLoader.getInstance().displayImage(url,((MyViewHolder01) holder).imageView,MyApp.getOptions());
                ((MyViewHolder01) holder).imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemClickListener.OnItemClick(v,position);
                    }
                });
                //长按
                ((MyViewHolder01) holder).imageView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        onItemLongClickListener.OnItemLongClick(v,position);
                        return true;
                    }
                });
            }else if(holder instanceof MyViewHolder02){
                 ((MyViewHolder02) holder).textView01.setText(list.get(position).getTitle());
                 ((MyViewHolder02) holder).textView02.setText(list.get(position).getComment_amount()+"");
                String url0 = "http://365jia.cn/uploads/"+list.get(position).getPics().get(0);
                String url1 = "http://365jia.cn/uploads/"+list.get(position).getPics().get(1);
                String url2 = "http://365jia.cn/uploads/"+list.get(position).getPics().get(2);
                ImageLoader.getInstance().displayImage(url0,((MyViewHolder02) holder).imageView,MyApp.getOptions());
                ImageLoader.getInstance().displayImage(url1,((MyViewHolder02) holder).imageView2,MyApp.getOptions());
                ImageLoader.getInstance().displayImage(url2,((MyViewHolder02) holder).imageView3,MyApp.getOptions());
                ((MyViewHolder02) holder).imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                           onItemClickListener.OnItemClick(v,position);
                    }
                });
                ((MyViewHolder02) holder).imageView2.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemClickListener.OnItemClick(v,position);
                    }
                });
                ((MyViewHolder02) holder).imageView3.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemClickListener.OnItemClick(v,position);
                    }
                });
                holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        onItemLongClickListener.OnItemLongClick(v,position);
                        return true;
                    }
                });
            }
    }
    @Override
    public int getItemViewType(int position) {
        List<String> pics = list.get(position).getPics();
        if (pics.size() < 3) {
            return viewType01;
        }
        return viewType02;
    }
    @Override
    public int getItemCount() {
        return list==null ? 0 :list.size();
    }

   public class MyViewHolder01 extends RecyclerView.ViewHolder{
          private  TextView textView01,textView02;
           private ImageView imageView;
       public MyViewHolder01(View itemView) {
           super(itemView);
               textView01=itemView.findViewById(R.id.item_tv);
               textView02=itemView.findViewById(R.id.item_tvv);
               imageView=itemView.findViewById(R.id.item_img);
       }
   }

    public class MyViewHolder02 extends RecyclerView.ViewHolder{
        private  TextView textView01,textView02;
        private ImageView imageView,imageView2,imageView3;
        public MyViewHolder02(View itemView) {
            super(itemView);
            textView01=itemView.findViewById(R.id.title);
            textView02=itemView.findViewById(R.id.pinglun);
            imageView=itemView.findViewById(R.id.imageView);
            imageView2=itemView.findViewById(R.id.imageView2);
            imageView3=itemView.findViewById(R.id.imageView3);
        }
    }


    private OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public interface OnItemClickListener{
        void OnItemClick(View view,int position);
    }
    private OnItemLongClickListener onItemLongClickListener;

    public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
        this.onItemLongClickListener = onItemLongClickListener;
    }

    public interface OnItemLongClickListener{
        void OnItemLongClick(View view,int position);
    }
}
 MainActivity

public class MainActivity extends BaseActivity<MainPresenter> implements View.OnClickListener,MainView {

 private RecyclerView recyclerView;
  private List<MainBean.DataBeanX.DataBean> list=new ArrayList<>();
  private MainAdapter mainAdapter;
    @Override
    public void onClick(View v) {

    }

    @Override
    public Context context() {
        return this;
    }
//成功
    @Override
    public void onSuccess(MainBean loginBean) {
        List<MainBean.DataBeanX.DataBean> data = loginBean.getData().getData();
        list.addAll(data);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        //设置适配器
      mainAdapter=  new MainAdapter(list);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(mainAdapter);
        //点击图片改变  透明
        mainAdapter.setOnItemClickListener(new MainAdapter.OnItemClickListener() {
            @Override
            public void OnItemClick(View view, int position) {
                ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f);
                alpha.setDuration(5000);
                alpha.start();
            }
        });
        mainAdapter.setOnItemLongClickListener(new MainAdapter.OnItemLongClickListener() {
            @Override
            public void OnItemLongClick(View view, final int position) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("数据");
                builder.setMessage("确定删除吗");
                  builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which) {
                           list.remove(position);
                          mainAdapter.notifyDataSetChanged();
                      }
                  });
                builder.setNegativeButton("取消",null);
                builder.show();
            }
        });
    }

    @Override
    public void onFaild(String error) {

    }

    @Override
    protected MainPresenter providePresenter() {
        return new MainPresenter(this);
    }

    @Override
    protected int provideLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    protected void initDatas() {
        presenter.getNews(1);
    }

    @Override
    protected void initListener() {

    }

    @Override
    protected void initViews() {
     recyclerView=  findViewById(R.id.main_rv);
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值