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

来源:互联网 发布:linux 文本编辑器 编辑:程序博客网 时间:2024/06/10 11:48

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


具体实现步骤:
1.这里写图片描述

2.这里写图片描述

3.这里写图片描述

4.这里写图片描述

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<String, Object> dataMap;    private Map<String, Object> mapObj;    private List<Map<String, Object>> imagesMap;    private List<Map<String, Object>> imagesMap1 = new ArrayList<Map<String, Object>>();    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<String>() {                    @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<String>() {                    @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<RecyclerView.ViewHolder> {    private int width;    private int height;    private List<Map<String, Object>> listOfText = new ArrayList<Map<String, Object>>();    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<String> image_url_list = new ArrayList<String>();    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<Map<String, Object>> 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<Map<String, Object>> 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<String, Object> photo_user = (Map<String, Object>) 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啦!

0 0