自定义搜索以及RecyclerView展示列表

  1. 这个是自定义布局完之后搜索展示数据 我用的是MVP框架

  2. 自定义搜索布局

     <?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>
    
  3. 自己创建一个类 在里面继承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;
}
  1. 然后在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>
    
  2. 然后接下来你在你的主布局里面写你自己定义的控件的那个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);
        }
    });
    
  3. 然后传到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);
         }
    }
    
  4. 然后在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);
    	    }
    
  5. 然后写完回到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);
                }
            });
        }
    }
    
  6. 因为解析写了接口回调 需要在回调到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);
                }
            });
        }
    } 
    
  7. 然后在你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);
    }
    }

  8. 适配器 我写的是多条目

    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);
            }
        }
    

猜你喜欢

转载自blog.csdn.net/weixin_44329686/article/details/87923669