model
Api
@GET(“v2/book/search”)
Observable getRespBody(@Query(“q”) String clothese);
Constant
public static final String URL = “https://api.douban.com/”;
HttpUtils
public class HttpUtils {
public final Api apiClient;
private HttpUtils(){
OkHttpClient okHttpClient = new OkHttpClient.Builder().addNetworkInterceptor(new LoggingInterceptor()).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
apiClient = retrofit.create(Api.class);
}
class LoggingInterceptor implements Interceptor {
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Response response = chain.proceed(request);
long t2 = System.nanoTime();
return response;
}
}
private static class GetHttpUtilsInstance {
private static HttpUtils httpUtils = new HttpUtils();
}
public static HttpUtils getHttpUtilsInstance() {
return GetHttpUtilsInstance.httpUtils;
}
}
view
ivew
IBaseView空
IMainview
public interface IMainView extends IBaseView{
void onSuccess(List<UserInfo.BooksBean> data);
void onError(int Errcode ,String errmsg);
}
presenter
BasePresenter
public class BasePresenter{
private V iv;
public void attachView(V v){
this.iv=v;
}
public void detachView(){
this.iv=null;
}
public V getView(){
return iv;
}
}
MainPresenter
public class MainPresenter extends BasePresenter{
public void loadDataFromNet() {
Observable body = HttpUtils.getHttpUtilsInstance().apiClient.getRespBody(“衣服”);
body.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(UserInfo userInfo) {
List<UserInfo.BooksBean> data = userInfo.getBooks();
getView().onSuccess(data);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
activity
Baseactivity空
MainActivity
public class MainActivity extends BaseActivity implements IMainView {
private List list = new ArrayList<>();
mainPresenter = new MainPresenter();
mainPresenter.attachView(this);
mainPresenter.loadDataFromNet();
搜索点击
loginbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String st = editText.getText().toString();
list.add(st);
liushi.removeAllViews();
for (int i = 0; i < list.size(); i++) {
tv = new TextView(MainActivity.this);
tv.setText(list.get(i));
liushi.addView(tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, “0000”, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
liushi.setPadding(5, 5, 5, 5);
}
});
清空点击
qingkong.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.clear();
liushi.removeAllViews();
}
});
@Override
public void onSuccess(List<UserInfo.BooksBean> data) {
// String title = data.get(0).getTitle();
// Log.i(“aaa”,title);
rec.setLayoutManager(new LinearLayoutManager(SecondActivity.this));
rec.setAdapter(new MyAapter(data, SecondActivity.this));
}
@Override
public void onError(int Errcode, String errmsg) {
}
@Override
protected void onDestroy() {
super.onDestroy();
mainPresenter.detachView();
}
}
adapter
public class MyAapter extends RecyclerView.Adapter<MyAapter.ViewHolder>{
private List<UserInfo.BooksBean> data;
private Context context;
public MyAapter(List<UserInfo.BooksBean> data, Context context) {
this.data = data;
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.author.setText(data.get(position).getAuthor().get(0));
holder.pubdate.setText(data.get(position).getPubdate());
//出版社
holder.subtitle.setText(data.get(position).getPublisher());
//标题
holder.title.setText(data.get(position).getTitle());
Uri uri = Uri.parse(data.get(position).getImage().split("\\|")[0]);
holder.img.setImageURI(uri);
}
@Override
public int getItemCount() {
return data.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private final TextView author;
private final SimpleDraweeView img;
private final TextView subtitle;
private final TextView pubdate;
private final TextView title;
public ViewHolder(View itemView) {
super(itemView);
author = itemView.findViewById(R.id.author);
img = itemView.findViewById(R.id.img);
subtitle = itemView.findViewById(R.id.subtitle);
pubdate = itemView.findViewById(R.id.pubdate);
title = itemView.findViewById(R.id.title);
}
}
}
LiuShi
public class LiuShi extends ViewGroup {
private int mLeftMargin = 20;
private int mTopMargin = 20;
public LiuShi(Context context) {
this(context, null);
}
public LiuShi(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LiuShi(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
measureChildren(widthMeasureSpec, heightMeasureSpec);
int leftMargin = mLeftMargin;
int topMargin = mTopMargin;
int ViewWidth = 0;
int ViewHeight = 0;
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
int modelWidth = MeasureSpec.getMode(widthMeasureSpec);
int modelHeight = MeasureSpec.getMode(heightMeasureSpec);
switch (modelHeight) {
case MeasureSpec.AT_MOST:
int measuredHeight = 0;
for (int i = 0; i < getChildCount(); i++) {
int measuredWidth = getChildAt(i).getMeasuredWidth();
measuredHeight = getChildAt(i).getMeasuredHeight();
if (leftMargin + measuredWidth + mLeftMargin > getWidth()) {
leftMargin = mLeftMargin;
topMargin += measuredHeight + mTopMargin;
}
leftMargin += measuredWidth + mLeftMargin;
}
topMargin += measuredHeight + mTopMargin;
break;
}
setMeasuredDimension(sizeWidth, topMargin);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int leftMargin = mLeftMargin;
int topMargin = mTopMargin;
for (int i = 0; i < getChildCount(); i++) {
int measuredWidth = getChildAt(i).getMeasuredWidth();
int measuredHeight = getChildAt(i).getMeasuredHeight();
if (leftMargin + measuredWidth + mLeftMargin > getWidth()) {
leftMargin = mLeftMargin;
topMargin += measuredHeight + mTopMargin;
getChildAt(i).layout(leftMargin, topMargin, leftMargin + measuredWidth, topMargin + measuredHeight);
} else {
getChildAt(i).layout(leftMargin, topMargin, leftMargin + measuredWidth, topMargin + measuredHeight);
}
leftMargin += measuredWidth + mLeftMargin;
}
}
}
布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/linner"
>
<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="9"
android:hint="请输入想要搜索的书籍"
/>
<TextView
android:id="@+id/qingkong"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_below="@id/linner"
android:background="@drawable/ic_launcher_background"
/>
<com.bwie.day1013.liushi.LiuShi
android:id="@+id/liushi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></com.bwie.day1013.liushi.LiuShi>