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
- RecycleView item子控件回调监听的实现
- RecycleView+CardView实现卡片式列表(附带Item回调监听)
- Android databinding RecycleView item 子控件点击事件
- ListView的Item布局子控件与Item的setOnItemClickListenter监听事件冲突失效的解决方法
- ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.
- ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.
- ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听
- RecycleView的item点击监听的设置逻辑
- 关于 Recycleview 的item 怎么监听手势操作
- ListView中Item控件监听及异步刷新的实现
- RecycleView如何实现item的点击事件
- RecycleView的使用,并添加子item的点击事件
- RecycleView监听实现
- 怎样给listview的item中的子控件设置监听及时时刷新
- RecycleView实现混合Item布局
- RecycleView的监听事件
- RecycleView的相关监听
- recycleview多item布局的实现(简单聊天界面)
- 在IDEA中实战Git
- numpy学习笔记
- 如何快速转载CSDN中的博客
- python:sql建表语句转化为json
- halcon 嵌入到MFC图像控件上
- RecycleView item子控件回调监听的实现
- group_concat用运 属于同一组统计
- 密码学-RSA算法
- Linux命令行与shell脚本(5)--分区和挂载
- LintCode 41 最大子数组
- 开发一款可以点击头像图片打电话的安卓软件
- Android广播机制
- Android面试题-与性能优化相关面试题六
- 机器学习基石2-4 Non-Separable Data