RecycleView item子控件回调监听的实现

知识点:接口回调,recycleview的adapter方法
难点:接口对象的实例化 , 接口对象中自定义方法的实现和重写


具体实现步骤:
1.RecycleView item子控件回调监听的实现_第1张图片

2.RecycleView item子控件回调监听的实现_第2张图片

3.RecycleView item子控件回调监听的实现_第3张图片

4.RecycleView item子控件回调监听的实现_第4张图片

5.RecycleView item子控件回调监听的实现_第5张图片


fragment界面代码

package com.qianfeng.xiuxiuproject.showpic.recomment.childfragment;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.qianfeng.xiuxiuproject.R;
import com.qianfeng.xiuxiuproject.common.constans.NetContents;
import com.qianfeng.xiuxiuproject.common.http.IStringRequest;
import com.qianfeng.xiuxiuproject.common.parser.JsonUtils;
import com.qianfeng.xiuxiuproject.common.utils.PreferencesUtils;
import com.qianfeng.xiuxiuproject.common.utils.StringUtils;
import com.qianfeng.xiuxiuproject.showpic.base.ReBaseFragment;
import com.qianfeng.xiuxiuproject.showpic.main.activity.MainActivity;
import com.qianfeng.xiuxiuproject.showpic.recomment.adapter.RecyclerViewAdapter;

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

/**
 * Created by Administrator on 2016/2/23.
 */
public class ChildRecommentFragment extends ReBaseFragment implements RecyclerViewAdapter.OnItemViewClickLisenter, SwipeRefreshLayout.OnRefreshListener {
    private RecyclerView recyclerview;
    private RecyclerViewAdapter recyclerViewAdapter;
    private SwipeRefreshLayout mSwipeRefreshWidget;
    private Map dataMap;
    private Map mapObj;
    private List> imagesMap;
    private List> imagesMap1 = new ArrayList>();
    private static final int DOWNLOAD_OVER = 1;
    private static final int REFRESH_COMPLETE = 0X110;
    private RequestQueue requestQueue;
    private int fatherPageNum;
    private int childPageNum = 0;
    private NetContents netContents;
    // 标志位,标志已经初始化完成。
    private boolean isPrepared;
    private boolean isloaded = false;
    private View view;
    private DisplayImageOptions options;


    private Handler fragmenthandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case DOWNLOAD_OVER:
                    //下载数据为耗时操作,比UI线程要快,要不放在下载数据后,要不提供一个handler机制。
                    //实例化adapter和条目监听必须都设置在下载数据完成后
                    if (recyclerViewAdapter == null) {
                        recyclerViewAdapter = new RecyclerViewAdapter(getActivity().getBaseContext(), imagesMap, options);
                        recyclerview.setAdapter(recyclerViewAdapter);
                        initListener();
                    }
                    break;
                case REFRESH_COMPLETE:
                    if (recyclerViewAdapter != null && imagesMap != null && imagesMap1 != null) {
                        mSwipeRefreshWidget.setRefreshing(false);
                        getDataFromWeb(fatherPageNum, 0);
                    }
                    break;
            }
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (null != view) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (null != parent) {
                parent.removeView(view);
            }
        } else {
            //缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。
            System.out.println("*************mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmonCreateView");
            view = inflater.inflate(R.layout.fragement_item, null);
            initView();
            isPrepared = true;
        }
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        fatherPageNum = getArguments().getInt("INDEX");

        netContents = new NetContents();

        requestQueue = Volley.newRequestQueue(getActivity().getBaseContext());

        options = new DisplayImageOptions.Builder()
//                .showImageOnLoading(R.drawable.startup_bg)
//                .showImageForEmptyUri(R.drawable.startup_bg)
//                .showImageOnFail(R.drawable.startup_bg)
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .considerExifParams(true)//此属性需要了解
//                .displayer(new RoundedBitmapDisplayer(0))
                .build();
        lazyLoad();
    }

    public void initView() {
        recyclerview = ((RecyclerView) view.findViewById(R.id.recyclerview));
        recyclerview.setLayoutManager(new LinearLayoutManager(getActivity().getBaseContext()));
        recyclerview.addItemDecoration(new SpacesItemDecoration(4));
        recyclerview.setItemAnimator(new DefaultItemAnimator());

         /*下拉刷新*/
        mSwipeRefreshWidget = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_widget);
        mSwipeRefreshWidget.setColorSchemeResources(android.R.color.holo_blue_bright,
                android.R.color.holo_green_light,
                android.R.color.holo_orange_light);
        mSwipeRefreshWidget.setOnRefreshListener(this);

        /*上拉加载更多*/
        recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
            boolean isSlidingToLast = false;

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
                    int totalItemCount = manager.getItemCount();
                    if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {
                        //当分页加载到数据时,设置上一个消失。(此方法也得判断联网状态)
                        if (isNetworkAvailable(getActivity())) {
                            if (childPageNum <= 2) {
                                loodmore(fatherPageNum, childPageNum);
                                Toast.makeText(getActivity().getBaseContext(), "亲,已加载完毕...", Toast.LENGTH_SHORT).show();
                                childPageNum++;
                            }
                        } else {
                            Toast.makeText(getActivity().getBaseContext(), "没有网,很遗憾...", Toast.LENGTH_SHORT).show();
                        }

                    }
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (dy > 0) {
                    //大于0表示,正在向下滚动
                    isSlidingToLast = true;
                } else {
                    //小于等于0 表示停止或向上滚动
                    isSlidingToLast = false;
                }
            }
        });
    }

    @Override
    protected void lazyLoad() {
        if (isPrepared && isVisible) {
            Message message = new Message();
            message.what = fatherPageNum + 1;
            RecyclerViewAdapter.adapterhander.sendMessage(message);
            if (isNetworkAvailable(getActivity())) {
                if (!isloaded) {
                    getDataFromWeb(fatherPageNum, childPageNum);
                    isloaded = true;
                    childPageNum = +1;
                    Log.e("====", "======================请求数据");
                }
            } else {
                String cachRaeString = PreferencesUtils.getString(getActivity().getBaseContext(), "TITLE_CACHE" + fatherPageNum);
                Log.e("====", "======================" + cachRaeString);
                if (!StringUtils.isBlank(cachRaeString)) {
                    parseJsonRaw(cachRaeString);
                } else {
                    Toast.makeText(getActivity().getBaseContext(), "达令,请检查网络...点击刷新", Toast.LENGTH_SHORT).
                            show();
                }
            }
        }
    }

    public void initListener() {
        //实例化adapter中的接口对象
        recyclerViewAdapter.setOnItemViewClickListener(this);
    }


    private void getDataFromWeb(final int fatherPageNum, final int childPageNum) {
        IStringRequest iStringRequest = new IStringRequest(
                Request.Method.GET,
                netContents.map.get("RECOMMENTS_URL" + fatherPageNum)[childPageNum],
                new Response.Listener() {
                    @Override
                    public void onResponse(String response) {
                        PreferencesUtils.putString(getActivity().getBaseContext(), "TITLE_CACHE" + fatherPageNum, response);
                        parseJsonRaw(response);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        requestQueue.add(iStringRequest);
    }


    private void parseJsonRaw(String response) {
        try {
            mapObj = JsonUtils.getMapObj(response);
            dataMap = JsonUtils.getMapObj(mapObj.get("data").toString());
            imagesMap = JsonUtils.getListMap(dataMap.get("images").toString());
            System.out.println("&&&&&&&&&&&&&&&&&&&&mapObj" + imagesMap.size());
            fragmenthandler.sendEmptyMessageDelayed(DOWNLOAD_OVER, 200);
        } catch (Exception e) {
        }
    }


    @Override
    public void onItemClick(View view, int position) {
        Intent intent = new Intent(getActivity(), MainActivity.class);
        intent.putExtra("TT_PHOTO_URL", netContents.map.get("RECOMMENTS_URL" + fatherPageNum)[childPageNum]);
        intent.putExtra("TT_PHOTO_POSITION", position);
        getActivity().startActivity(intent);
    }


    @Override
    public void onItemViewClick(View view, int position, boolean blick) {
        if (!blick) {
            view.setBackgroundResource(R.color.alpha);
            Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.anim_sort_junp_button);
            view.setAnimation(animation);
            animation.start();
            animation.reset();
        }
    }

    @Override
    public void onItemViewLongClick(View view, int position) {
        recyclerViewAdapter.notifyDataSetChanged();
        recyclerview.scrollToPosition(0);
    }

    @Override
    public void onItemfooterClick(TextView view, int position) {
        //当分页加载到数据时,设置上一个消失。(此方法也得判断联网状态)
        if (isNetworkAvailable(getActivity())) {
            if (childPageNum <= 2) {
                loodmore(fatherPageNum, childPageNum);
                childPageNum++;
            } else {
                view.setText("亲,已加载完...<^^>");
            }
        } else {
            Toast.makeText(getActivity().getBaseContext(), "没有网,很遗憾...", Toast.LENGTH_SHORT).show();
        }

    }


    private void loodmore(final int fatherPageNum, final int childPageNum) {
        Log.e("=====", "======" + childPageNum + "=======");
        IStringRequest iStringRequest1 = new IStringRequest(
                Request.Method.GET,
                netContents.map.get("RECOMMENTS_URL" + fatherPageNum)[childPageNum],
                new Response.Listener() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            mapObj = JsonUtils.getMapObj(response);
                            dataMap = JsonUtils.getMapObj(mapObj.get("data").toString());
                            imagesMap1 = JsonUtils.getListMap(dataMap.get("images").toString());
                            imagesMap.addAll(imagesMap1);
                            recyclerViewAdapter.notifyDataSetChanged1(imagesMap);
                        } catch (Exception e) {
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        requestQueue.add(iStringRequest1);
    }

    @Override
    public void onRefresh() {
        fragmenthandler.sendEmptyMessageDelayed(REFRESH_COMPLETE, 3000);
    }


    public boolean isNetworkAvailable(Activity activity) {
        Context context = activity.getApplicationContext();
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager == null) {
            return false;
        } else {
            NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
            if (networkInfo != null && networkInfo.length > 0) {
                for (int i = 0; i < networkInfo.length; i++) {
                    if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

}

RecyclerViewAdapter界面代码

package com.qianfeng.xiuxiuproject.showpic.recomment.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.qianfeng.xiuxiuproject.R;
import com.qianfeng.xiuxiuproject.common.utils.CalendarUtils;

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

/**
 * Created by Administrator on 2016/2/25.
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter.ViewHolder> {
    private int width;
    private int height;
    private List> listOfText = new ArrayList>();
    private LayoutInflater inflater;
    private OnItemViewClickLisenter onItemViewClickListener;
    private static final int TYPE_ITEM = 0;
    private static final int TYPE_FOOTER = 1;
    public static boolean isFirstFragment = true;
    private List image_url_list = new ArrayList();
    private String user_photo_url;
    private DisplayImageOptions options;
    private ImageLoader imageLoader;


    public static Handler adapterhander = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            if (msg.what != 1) {
                Log.e("=====", "=======msg.what" + msg.what);
                isFirstFragment = false;
            } else {
                isFirstFragment = true;
            }
        }
    };


    public RecyclerViewAdapter(Context context, List> imagesMap, DisplayImageOptions options) {
        this.listOfText.addAll(imagesMap);
        this.inflater = LayoutInflater.from(context);
        this.options = options;
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        width = wm.getDefaultDisplay().getWidth();
        height = wm.getDefaultDisplay().getHeight();
    }

    public void notifyDataSetChanged1(List> imagesMap) {
        this.listOfText = imagesMap;
        this.notifyDataSetChanged();
    }

    //定义接口和接口的方法:回传接口对象(实际上回传的是接口对象已经实现的方法,包括方法中的参数值)
    //这些接口在adapter实现(实现时回调item加载的view对象及其本身的监听方法:如onclick,onLongClick),然后在Fragment中重写这个接口里自定义的监听方法
    public interface OnItemViewClickLisenter {
        void onItemClick(View view, int position);

        void onItemViewLongClick(View view, int position);

        void onItemViewClick(View view, int position, boolean blick);

        void onItemfooterClick(TextView view, int position);
    }

    public void setOnItemViewClickListener(OnItemViewClickLisenter onItemViewClickListener) {
        this.onItemViewClickListener = onItemViewClickListener;
    }

    @Override
    public int getItemCount() {
        Log.e("=====", "=======getItemCount");
        return listOfText.size() + 1;
    }

    @Override
    public int getItemViewType(int position) {
        Log.e("=====", "=======getItemViewType");
        if (position + 1 == getItemCount()) {
            return TYPE_FOOTER;
        } else {
            return TYPE_ITEM;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.e("=====", "=======onCreateViewHolder");
        if (viewType == TYPE_ITEM) {
            View view = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.fragment_item_imageview, null);
            ItemViewHolder itemViewHolder = new ItemViewHolder(view);
            view.setLayoutParams(new LinearLayout.LayoutParams(width, height / 2));
            return itemViewHolder;
        }

        // type == TYPE_FOOTER 返回footerView
        else if (viewType == TYPE_FOOTER) {
            View view = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.fragement_item_footer, null);
            view.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT));
            return new FooterViewHolder(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        Log.e("=====", "=======onBindViewHolder");
        image_url_list.clear();
        for (int i = 0; i < listOfText.size(); i++) {
            String image_url_raw = listOfText.get(i).get("image_url").toString();
            String image_url = "http://wpstatic.zuimeia.com/" + image_url_raw;
            image_url_list.add(image_url);
        }
        Log.e("======", "=========image_url_list.size():" + image_url_list.size());

        imageLoader = ImageLoader.getInstance();

        if (holder instanceof ItemViewHolder) {
            if (isFirstFragment) {
                ((ItemViewHolder) holder).items_linear2.setVisibility(View.VISIBLE);
                ((ItemViewHolder) holder).items_linear1.setVisibility(View.GONE);
                String[] pub_times = listOfText.get(position).get("pub_time").toString().split("-");
                ((ItemViewHolder) holder).items_text4.setText(pub_times[2]);
                ((ItemViewHolder) holder).items_text5.setText(CalendarUtils.getMyMonthStr(pub_times[1]));
                ((ItemViewHolder) holder).items_text6.setText(pub_times[0]);
                ((ItemViewHolder) holder).items_text7.setText(listOfText.get(position).get("description").toString());

            } else {
                ((ItemViewHolder) holder).items_linear2.setVisibility(View.GONE);
                ((ItemViewHolder) holder).items_linear1.setVisibility(View.VISIBLE);
                ((ItemViewHolder) holder).items_text2.setText(listOfText.get(position).get("description").toString());

                Map photo_user = (Map) listOfText.get(position).get("photo_user");
                ((ItemViewHolder) holder).items_text3.setText(photo_user.get("user_name").toString());
                user_photo_url = photo_user.get("user_photo").toString();

                ((ItemViewHolder) holder).items_image3.setTag(user_photo_url);

                ((ItemViewHolder) holder).items_image3.setImageResource(R.drawable.icon_personalpage_normal);
                imageLoader.loadImage(user_photo_url, options, new ImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {

                    }

                    @Override
                    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

                    }

                    @Override
                    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                        if (((ItemViewHolder) holder).items_image3.getTag().equals(imageUri)) {
                            ((ItemViewHolder) holder).items_image3.setImageBitmap(loadedImage);
                        }
                    }

                    @Override
                    public void onLoadingCancelled(String imageUri, View view) {

                    }
                });
            }

            ((ItemViewHolder) holder).items_image1.setTag(image_url_list.get(position));
            ((ItemViewHolder) holder).items_image1.setImageResource(R.drawable.preview_icon_32);

            imageLoader.loadImage(image_url_list.get(position), options, new ImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {

                }

                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

                }

                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    if (((ItemViewHolder) holder).items_image1.getTag().equals(imageUri)) {
                        ((ItemViewHolder) holder).items_image1.setImageBitmap(loadedImage);
                    }
                }

                @Override
                public void onLoadingCancelled(String imageUri, View view) {

                }
            });

            ((ItemViewHolder) holder).items_text1.setText(listOfText.get(position).get("up_times").toString());

            if (onItemViewClickListener != null) {
                ((ItemViewHolder) holder).items_image1.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemViewClickListener.onItemClick(v, ((ItemViewHolder) holder).getLayoutPosition());
                    }
                });
                ((ItemViewHolder) holder).items_image1.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        onItemViewClickListener.onItemViewLongClick(v, ((ItemViewHolder) holder).getLayoutPosition());
                        return true;
                    }
                });

                ((ItemViewHolder) holder).items_linear_click.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemViewClickListener.onItemViewClick(((ItemViewHolder) holder).items_linear_click, ((ItemViewHolder) holder).getLayoutPosition(), false);
                    }
                });
            }
        } else if (holder instanceof FooterViewHolder) {
            if (onItemViewClickListener != null) {
                ((FooterViewHolder) holder).footer_textview.setLayoutParams(new LinearLayout.LayoutParams(width, height / 12));
                ((FooterViewHolder) holder).footer_textview.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemViewClickListener.onItemfooterClick(((FooterViewHolder) holder).footer_textview, holder.getLayoutPosition());
                    }
                });
            }
        }
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {
        private ImageView items_image1;
        //        private ImageView items_image2;
        private LinearLayout items_linear_click, items_linear1, items_linear2;
        private TextView items_text4;
        private TextView items_text6;
        private TextView items_text5;
        private TextView items_text7;
        private TextView items_text1;
        private TextView items_text2;
        private TextView items_text3;
        private ImageView items_image3;

        public ItemViewHolder(View itemView) {
            super(itemView);
            items_linear2 = ((LinearLayout) itemView.findViewById(R.id.items_linear2));
            items_text4 = ((TextView) itemView.findViewById(R.id.items_text4));
            items_text5 = ((TextView) itemView.findViewById(R.id.items_text5));
            items_text6 = ((TextView) itemView.findViewById(R.id.items_text6));
            items_text7 = ((TextView) itemView.findViewById(R.id.items_text7));

            items_text1 = ((TextView) itemView.findViewById(R.id.items_text1));
            items_image1 = ((ImageView) itemView.findViewById(R.id.items_image1));
//            items_image2 = ((ImageView) itemView.findViewById(R.id.items_image2));
            items_linear_click = ((LinearLayout) itemView.findViewById(R.id.items_linear_click));

            items_linear1 = ((LinearLayout) itemView.findViewById(R.id.items_linear1));
            items_text2 = ((TextView) itemView.findViewById(R.id.items_text2));
            items_image3 = ((ImageView) itemView.findViewById(R.id.items_image3));
            items_text3 = ((TextView) itemView.findViewById(R.id.items_text3));
        }
    }

    class FooterViewHolder extends RecyclerView.ViewHolder {
        private TextView footer_textview;

        public FooterViewHolder(View view) {
            super(view);
            footer_textview = (TextView) view.findViewById(R.id.items_footer_text);
        }
    }

}

请读者按照图片中文字介绍理解接口回调的真正含义,可以在代码中找到图片中对应的代码段。另:接口回调在网络请求结果对象处理,自定义view监听操作或其他第三方SDK 回调对象应用广泛,只需要按照上边的步骤做,就很easy啦!

你可能感兴趣的:(view的使用)