-
这个是自定义布局完之后搜索展示数据 我用的是MVP框架
-
自定义搜索布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/aaa" android:id="@+id/mIV" /> <EditText android:layout_width="wrap_content" android:layout_height="50dp" android:layout_weight="15" android:hint="请输入您要搜索的内容" android:id="@+id/mET" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索" android:textSize="25dp" android:id="@+id/mTV" /> </LinearLayout> <LinearLayout>
-
自己创建一个类 在里面继承LinearLayout
public class SeekTitle extends LinearLayout {
private TextView mTV;
private EditText mET;
private ImageView mIV;
public SeekTitle(Context context) {
super(context);
}
public SeekTitle(final Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.seek,this);
mIV = findViewById(R.id.mIV);
mTV = findViewById(R.id.mTV);
mET = findViewById(R.id.mET);
mTV.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String s = mET.getText().toString();
if (s.isEmpty())
{
Toast.makeText(context,"请输入内容",Toast.LENGTH_SHORT).show();
}else
{
onSeekClickLisenter.mSeek(s);
}
}
});
}
public SeekTitle(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//接口回调
public interface onSeekClickLisenter
{
void mSeek(String text);
}
//声明接口
public onSeekClickLisenter onSeekClickLisenter;
public void setOnSeekClickLisenter(SeekTitle.onSeekClickLisenter onSeekClickLisenter) {
this.onSeekClickLisenter = onSeekClickLisenter;
}
-
然后在Activity布局里面调用你自定定义的那个类 这个是我自己定义的类
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <weekone.com.bw.twoweekexam.title.SeekTitle android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sk" ></weekone.com.bw.twoweekexam.title.SeekTitle> </android.support.constraint.ConstraintLayout>
-
然后接下来你在你的主布局里面写你自己定义的控件的那个id就行 然后 就可以在你的Activity里面写展示数据了 我用的是RecyclerView展示 因为RecyclerView包括三种布局 所以要写一下布局管理器
rlv = view.findViewById(R.id.rlv); //布局管理器 LinearLayoutManager layoutManager=new LinearLayoutManager(getActivity()); rlv.setLayoutManager(layoutManager); //实例化presnenter presenter = new ShowPresenter(); 这个是我刚写的自定义搜索 就是写这个监听就是把你写的presnenter传参写这个里面 把你自定义搜索接口回调里面你定义的那个参数传到presnenter里面 sk.setOnSeekClickLisenter(new SeekTitle.onSeekClickLisenter() { @Override public void mSeek(String text) { pa=text; presenter.show(pa,page); } });
-
然后传到presenter层里面 在里面定义model层 把你自定义搜索的那个值在传给model
public class ShowPresenter { private final ShowModel model; private final ShowView showView; //在构造方法中实例化model和view public ShowPresenter) { model = new ShowModel(); } public void show(String text, int page) { model.showData(text,page); } }
-
然后在model层里写网络请求 我把网络请求写在外面了 自己创建了一个utils
这个里面我写了单例模式和拦截器public class ShowUtils { //单例模式 public static ShowUtils showUtils; private ShowUtils() { } public static ShowUtils getInstance() { if (showUtils==null) { //同步锁 synchronized (ShowUtils.class) { if (showUtils==null) { showUtils=new ShowUtils(); } } } return showUtils; } //doGet public void doGet(String url,String ss,int page, Callback callback) { //拦截器 HttpLoggingInterceptor httpLoggingInterceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { Log.i("xxx",message); } }); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //创建OkHttpClient OkHttpClient okHttpClient=new OkHttpClient.Builder() .addInterceptor(httpLoggingInterceptor) .build(); Request request=new Request.Builder() .url(url+"?keyword="+ss+"&page="+page+"&count=10") .build(); Call call = okHttpClient.newCall(request); call.enqueue(callback); }
-
然后写完回到model层 调用utils里面写的网络请求 解析我用的是Gson解析
public class ShowModel { String url="http://172.17.8.100/small/commodity/v1/findCommodityByKeyword"; //接口回调 public interface onShowClickLisenter { void onResult( ArrayList<Result> results); } //声明接口 private onShowClickLisenter onShowClickLisenter; public void setOnShowClickLisenter(ShowModel.onShowClickLisenter onShowClickLisenter) { this.onShowClickLisenter = onShowClickLisenter; } private Handler handler=new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: String obj = (String) msg.obj; Gson gson = new Gson(); JsonBean jsonBean = gson.fromJson(obj, JsonBean.class); ArrayList<Result> results=jsonB ean.getResult(); onShowClickLisenter.onResult(results); break; } } }; public void showData(String text, int page) { //创建网络请求 ShowUtils.getInstance().doGet(url, text,page, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String s = response.body().string(); Log.i("xxx",s); Message message = new Message(); message.what=0; message.obj=s; //发送消息 handler.sendMessage(message); } }); } }
-
因为解析写了接口回调 需要在回调到presenter层 把数据传给view层
public class ShowPresenter { private final ShowModel model; private final ShowView showView; //在构造方法中实例化model和view public ShowPresenter(ShowView view) { model = new ShowModel(); showView = view; } public void show(String text, int page) { model.showData(text,page); model.setOnShowClickLisenter(new ShowModel.onShowClickLisenter() { @Override public void onResult(ArrayList<Result> results) { showView.view(results); } }); } }
-
然后在你Activity里面继承View层 他会报错 然后你ALT+回车就会出来一个方法
然后在里面写适配器
public class ShowFragment extends Fragment implements ShowView
{
public void view(ArrayList results) {//适配器
final MyAdapter adapter=new MyAdapter(results,getActivity());
rlv.setAdapter(adapter);
}
} -
适配器 我写的是多条目
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { ArrayList<Result> results; Context context; public static int TYPE_ONE=0; public static int TYPE_TWO=1; public MyAdapter(ArrayList<Result> results, Context context) { this.results = results; this.context = context; } @Override public int getItemViewType(int position) { if (position%2==0) { return TYPE_ONE; }else { return TYPE_TWO; } } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { if (i==TYPE_ONE) { View view = LayoutInflater.from(context).inflate(R.layout.item1, null, false); final MyViewHolder myViewHolder=new MyViewHolder(view); return myViewHolder; }else { View view1= LayoutInflater.from(context).inflate(R.layout.item2, null, false); final MyViewHolder1 myViewHolder1=new MyViewHolder1(view1); return myViewHolder1; } } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { int type = getItemViewType(i); if (type==TYPE_ONE) { MyViewHolder myViewHolder= (MyViewHolder) viewHolder; myViewHolder.text1.setText(results.get(i).getCommodityId()); myViewHolder.text2.setText(results.get(i).getCommodityName()); }else { MyViewHolder1 myViewHolder1= (MyViewHolder1) viewHolder; myViewHolder1.item2_text.setText(results.get(i).getCommodityId()); myViewHolder1.item2_text2.setText(results.get(i).getCommodityName()); Glide.with(context).load(results.get(i).getMasterPic()).into(myViewHolder1.item2_image); } } @Override public int getItemCount() { return results.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { private final TextView text2; private final TextView text1; public MyViewHolder(@NonNull View itemView) { super(itemView); text1 = itemView.findViewById(R.id.text1); text2 = itemView.findViewById(R.id.text2); } } public class MyViewHolder1 extends RecyclerView.ViewHolder { private final TextView item2_text; private final TextView item2_text2; private final ImageView item2_image; public MyViewHolder1(@NonNull View itemView) { super(itemView); item2_text = itemView.findViewById(R.id.item2_text); item2_text2 = itemView.findViewById(R.id.item2_text2); item2_image = itemView.findViewById(R.id.item2_image); } }