android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...
1、因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为 2,为了使LISTVIEW的ITEM在点击时索引不变,实现以下方法
2、实现接口android.widget.AdapterView.OnItemClickListener
3、重写setOnItemClickListener onItemClick方法
private OnItemClickListener mItemClickListener;
// 重写item点击方法
@Override
public void setOnItemClickListener(
android.widget.AdapterView.OnItemClickListener listener) {
mItemClickListener = listener;
super.setOnItemClickListener(this);// 将点击事件设置给当前的RefreshListView
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(parent, view, position
- getHeaderViewsCount(), id);
}
}
import java.text.SimpleDateFormat; import java.util.Date;import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView;import com.itheima.zhsh66.R;/*** 下拉刷新的listview* */ public class RefreshListView extends ListView implements OnScrollListener,android.widget.AdapterView.OnItemClickListener {private static final int STATE_PULL_TO_REFRESH = 1;// 下拉刷新private static final int STATE_RELEASE_TO_REFRESH = 2;// 松开刷新private static final int STATE_REFRESHING = 3;// 正在刷新// 下拉刷新头布局private View mHeaderView;// 头布局高度private int mHeaderViewHeight;// 脚布局private View mFooterView;private int mFooterViewHeight;private int startY = -1;// 当前下拉刷新的状态private int mCurrentState = STATE_PULL_TO_REFRESH;// 默认是下拉刷新private TextView tvTitle;private ImageView ivArrow;private ProgressBar pbLoading;private TextView tvTime;private RotateAnimation animUp;// 箭头向上动画private RotateAnimation animDown;// 箭头向下动画private boolean isLoadingMore;// 标记是否正在加载更多public RefreshListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initHeaderView();initFooterView();}public RefreshListView(Context context, AttributeSet attrs) {super(context, attrs);initHeaderView();initFooterView();}public RefreshListView(Context context) {super(context);initHeaderView();initFooterView();}/*** 初始化头布局*/private void initHeaderView() {mHeaderView = View.inflate(getContext(), R.layout.list_refresh_header,null);this.addHeaderView(mHeaderView);// 添加头布局// 隐藏头布局(1, 获取头布局高度, 2.设置负paddingTop,布局就会往上走)// int height = mHeaderView.getHeight();//此处无法获取高度,因为布局还没有绘制完成// 绘制之前就要获取布局高度mHeaderView.measure(0, 0);// 手动测量布局mHeaderViewHeight = mHeaderView.getMeasuredHeight();// 测量之后的高度// 隐藏头布局mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);tvTitle = (TextView) mHeaderView.findViewById(R.id.tv_title);ivArrow = (ImageView) mHeaderView.findViewById(R.id.iv_arrow);pbLoading = (ProgressBar) mHeaderView.findViewById(R.id.pb_loading);tvTime = (TextView) mHeaderView.findViewById(R.id.tv_time);initAnim();setCurrentTime();// 设置初始时间 }/*** 初始化脚布局*/private void initFooterView() {mFooterView = View.inflate(getContext(), R.layout.list_refresh_footer,null);this.addFooterView(mFooterView);mFooterView.measure(0, 0);mFooterViewHeight = mFooterView.getMeasuredHeight();// 隐藏脚布局mFooterView.setPadding(0, -mFooterViewHeight, 0, 0);// 设置滑动监听this.setOnScrollListener(this);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:startY = (int) ev.getY();break;case MotionEvent.ACTION_MOVE:if (startY == -1) {// 如果用户按住头条新闻向下滑动, 会导致listview无法拿到ACTION_DOWN,// 此时要重新获取startYstartY = (int) ev.getY();}// 如果当前正在刷新, 什么都不做了if (mCurrentState == STATE_REFRESHING) {break;}int endY = (int) ev.getY();int dy = endY - startY;if (dy > 0 && getFirstVisiblePosition() == 0) {// 向下滑动&当前显示的是第一个item,才允许下拉刷新int paddingTop = dy - mHeaderViewHeight;// 计算当前的paddingtop值// 根据padding切换状态if (paddingTop >= 0&& mCurrentState != STATE_RELEASE_TO_REFRESH) {// 切换到松开刷新mCurrentState = STATE_RELEASE_TO_REFRESH;refreshState();} else if (paddingTop < 0&& mCurrentState != STATE_PULL_TO_REFRESH) {// 切换到下拉刷新mCurrentState = STATE_PULL_TO_REFRESH;refreshState();}mHeaderView.setPadding(0, paddingTop, 0, 0);// 重新设置头布局paddingreturn true;}break;case MotionEvent.ACTION_UP:startY = -1;// 起始坐标归零if (mCurrentState == STATE_RELEASE_TO_REFRESH) {// 如果当前是松开刷新, 就要切换为正在刷新mCurrentState = STATE_REFRESHING;// 显示头布局mHeaderView.setPadding(0, 0, 0, 0);refreshState();// 下拉刷新回调if (mListener != null) {mListener.onRefresh();}} else if (mCurrentState == STATE_PULL_TO_REFRESH) {// 隐藏头布局mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);}break;default:break;}return super.onTouchEvent(ev);}/*** 初始化箭头动画*/private void initAnim() {animUp = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);animUp.setDuration(500);animUp.setFillAfter(true);// 保持状态 animDown = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF, 0.5f);animDown.setDuration(500);animDown.setFillAfter(true);// 保持状态 }/*** 根据当前状态刷新界面*/private void refreshState() {switch (mCurrentState) {case STATE_PULL_TO_REFRESH:tvTitle.setText("下拉刷新");// 箭头向下移动 ivArrow.startAnimation(animDown);// 隐藏进度条 pbLoading.setVisibility(View.INVISIBLE);ivArrow.setVisibility(View.VISIBLE);break;case STATE_RELEASE_TO_REFRESH:tvTitle.setText("松开刷新");// 箭头向上移动 ivArrow.startAnimation(animUp);// 隐藏进度条 pbLoading.setVisibility(View.INVISIBLE);ivArrow.setVisibility(View.VISIBLE);break;case STATE_REFRESHING:tvTitle.setText("正在刷新...");pbLoading.setVisibility(View.VISIBLE);ivArrow.clearAnimation();// 必须清除动画,才能隐藏控件 ivArrow.setVisibility(View.INVISIBLE);break;default:break;}}private OnRefreshListener mListener;public void setOnRefreshListener(OnRefreshListener listener) {mListener = listener;}/*** 设置上次刷新时间*/private void setCurrentTime() {// 08:10 8:10 1SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// HH表示24小时制String time = format.format(new Date());tvTime.setText(time);}// 刷新完成public void onRefreshComplete(boolean success) {if (!isLoadingMore) {// 隐藏头布局mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);mCurrentState = STATE_PULL_TO_REFRESH;// 隐藏进度条 pbLoading.setVisibility(View.INVISIBLE);ivArrow.setVisibility(View.VISIBLE);tvTitle.setText("下拉刷新");// 刷新失败,不需要更新时间if (success) {setCurrentTime();}} else {// 隐藏脚布局mFooterView.setPadding(0, -mFooterViewHeight, 0, 0);isLoadingMore = false;}}public interface OnRefreshListener {// 下拉刷新的回调public void onRefresh();// 加载更多的回调public void loadMore();}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (scrollState == SCROLL_STATE_IDLE) {int lastVisiblePosition = getLastVisiblePosition();// 当前界面显示的最后一个item的位置if (lastVisiblePosition >= getCount() - 1 && !isLoadingMore) {isLoadingMore = true;// System.out.println("到底了");// 加载更多了....(到底了)// 显示脚布局mFooterView.setPadding(0, 0, 0, 0);// listview设置当前要展示的item的位置setSelection(getCount() - 1);// 跳到加载更多item的位置去展示if (mListener != null) {mListener.loadMore();}}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {}private OnItemClickListener mItemClickListener;// 重写item点击方法 @Overridepublic void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener listener) {mItemClickListener = listener;super.setOnItemClickListener(this);// 将点击事件设置给当前的RefreshListView }@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {if (mItemClickListener != null) {mItemClickListener.onItemClick(parent, view, position- getHeaderViewsCount(), id);}} }
RefreshListView
import java.util.ArrayList;import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Handler; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.TextView; import android.widget.Toast;import com.google.gson.Gson; import com.itheima.zhsh66.NewsDetailActivity; import com.itheima.zhsh66.R; import com.itheima.zhsh66.base.BaseMenuDetailPager; import com.itheima.zhsh66.domain.NewsData; import com.itheima.zhsh66.domain.NewsData.News; import com.itheima.zhsh66.domain.NewsData.TopNews; import com.itheima.zhsh66.domain.NewsMenuData.NewsTabData; import com.itheima.zhsh66.global.Constants; import com.itheima.zhsh66.utils.CacheUtils; import com.itheima.zhsh66.utils.PrefUtils; import com.itheima.zhsh66.view.HorizontalScrollViewPager; import com.itheima.zhsh66.view.RefreshListView; import com.itheima.zhsh66.view.RefreshListView.OnRefreshListener; import com.lidroid.xutils.BitmapUtils; import com.lidroid.xutils.HttpUtils; import com.lidroid.xutils.ViewUtils; import com.lidroid.xutils.exception.HttpException; import com.lidroid.xutils.http.ResponseInfo; import com.lidroid.xutils.http.callback.RequestCallBack; import com.lidroid.xutils.http.client.HttpRequest.HttpMethod; import com.lidroid.xutils.view.annotation.ViewInject; import com.viewpagerindicator.CirclePageIndicator;/*** 12个页签的页面对象* */ public class TabDetailPager extends BaseMenuDetailPager {// 页签分类的网络信息private NewsTabData mTabData;// 网络返回的新闻列表数据private NewsData mNewsTabData;// 加载新闻列表的urlprivate String mUrl;// 头条新闻的网络数据private ArrayList<TopNews> mTopNewsList;// 头条新闻的数据适配器private TopNewsAdapter mTopNewsAdapter;// 新闻列表的集合private ArrayList<News> mNewsList;private NewsAdapter mNewsAdapter;@ViewInject(R.id.vp_tab_detail)private HorizontalScrollViewPager mViewPager;@ViewInject(R.id.lv_tab_detail)private RefreshListView lvList;@ViewInject(R.id.indicator)private CirclePageIndicator mIndicator;@ViewInject(R.id.tv_title)private TextView tvTopNewsTitle;private String mMoreUrl;// 下一页的链接private Handler mHandler = null;public TabDetailPager(Activity activity, NewsTabData tabData) {super(activity);mTabData = tabData;mUrl = Constants.SERVER_URL + mTabData.url;}@Overridepublic View initView() {View view = View.inflate(mActivity, R.layout.pager_tab_detail, null);ViewUtils.inject(this, view);View header = View.inflate(mActivity, R.layout.list_header_topnews,null);ViewUtils.inject(this, header);// 必须也将头布局注入到ViewUtils// 给listview添加头布局 lvList.addHeaderView(header);// 设置下拉刷新监听lvList.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onRefresh() {// 从网络加载数据 getDataFromServer();}@Overridepublic void loadMore() {// 加载更多数据if (mMoreUrl != null) {System.out.println("加载下一页数据...");getMoreDataFromServer();} else {lvList.onRefreshComplete(true);// 收起加载更多布局Toast.makeText(mActivity, "没有更多数据了", Toast.LENGTH_SHORT).show();}}});lvList.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {System.out.println("pos:" + position);News news = mNewsList.get(position);// 当前点击的item的标题颜色置灰TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);tvTitle.setTextColor(Color.GRAY);// 将已读状态持久化到本地// key: read_ids; value: 1324,1325,1326String readIds = PrefUtils.getString("read_ids", "", mActivity);if (!readIds.contains(news.id)) {// 以前没有添加过,才添加进来readIds = readIds + news.id + ",";// 1324,1325,PrefUtils.putString("read_ids", readIds, mActivity);}// 跳到详情页Intent intent = new Intent(mActivity, NewsDetailActivity.class);intent.putExtra("url", news.url);mActivity.startActivity(intent);}});return view;}@Overridepublic void initData() {String cache = CacheUtils.getCache(mUrl, mActivity);if (!TextUtils.isEmpty(cache)) {processResult(cache, false);}getDataFromServer();}private void getDataFromServer() {HttpUtils utils = new HttpUtils();utils.send(HttpMethod.GET, mUrl, new RequestCallBack<String>() {@Overridepublic void onSuccess(ResponseInfo<String> responseInfo) {String result = responseInfo.result;processResult(result, false);System.out.println("访问网络成功!!!");CacheUtils.setCache(mUrl, result, mActivity);// 收起下拉刷新控件lvList.onRefreshComplete(true);}@Overridepublic void onFailure(HttpException error, String msg) {// 收起下拉刷新控件lvList.onRefreshComplete(false);error.printStackTrace();Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT).show();}});}/*** 加载更多数据*/protected void getMoreDataFromServer() {HttpUtils utils = new HttpUtils();utils.send(HttpMethod.GET, mMoreUrl, new RequestCallBack<String>() {@Overridepublic void onSuccess(ResponseInfo<String> responseInfo) {String result = responseInfo.result;processResult(result, true);// 收起加载更多布局lvList.onRefreshComplete(true);}@Overridepublic void onFailure(HttpException error, String msg) {error.printStackTrace();Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT).show();// 收起加载更多布局lvList.onRefreshComplete(false);}});}protected void processResult(String result, boolean isMore) {Gson gson = new Gson();mNewsTabData = gson.fromJson(result, NewsData.class);if (!TextUtils.isEmpty(mNewsTabData.data.more)) {// 初始化下一页链接地址mMoreUrl = Constants.SERVER_URL + mNewsTabData.data.more;} else {// 没有下一页了mMoreUrl = null;}if (!isMore) {// 初始化头条新闻mTopNewsList = mNewsTabData.data.topnews;if (mTopNewsList != null) {mTopNewsAdapter = new TopNewsAdapter();mViewPager.setAdapter(mTopNewsAdapter);mIndicator.setViewPager(mViewPager);// 将指示器和viewpager绑定mIndicator.setSnap(true);// 快照模式mIndicator.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {//System.out.println("position:" + position);TopNews topNews = mTopNewsList.get(position);tvTopNewsTitle.setText(topNews.title);}@Overridepublic void onPageScrolled(int position,float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageScrollStateChanged(int state) {}});mIndicator.onPageSelected(0);// 将小圆点位置归零, 解决它会在页面销毁时仍记录上次位置的bugtvTopNewsTitle.setText(mTopNewsList.get(0).title);// 初始化第一页标题 }// 初始化新闻列表mNewsList = mNewsTabData.data.news;if (mNewsList != null) {mNewsAdapter = new NewsAdapter();lvList.setAdapter(mNewsAdapter);}if (mHandler == null) {mHandler = new Handler() {public void handleMessage(android.os.Message msg) {int currentItem = mViewPager.getCurrentItem();if (currentItem < mTopNewsList.size() - 1) {currentItem++;} else {currentItem = 0;}mViewPager.setCurrentItem(currentItem);mHandler.sendEmptyMessageDelayed(0, 2000);};};// 延时2秒切换广告条mHandler.sendEmptyMessageDelayed(0, 2000);mViewPager.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:System.out.println("ACTION_DOWN");// 删除所有消息mHandler.removeCallbacksAndMessages(null);break;case MotionEvent.ACTION_CANCEL:// 事件取消(当按下后,然后移动下拉刷新,导致抬起后无法响应ACTION_UP,// 但此时会响应ACTION_CANCEL,也需要继续播放轮播条)case MotionEvent.ACTION_UP:// 延时2秒切换广告条mHandler.sendEmptyMessageDelayed(0, 2000);break;default:break;}return false;}});}} else {// 加载更多ArrayList<News> moreData = mNewsTabData.data.news;mNewsList.addAll(moreData);// 追加数据mNewsAdapter.notifyDataSetChanged();// 刷新listview }}class TopNewsAdapter extends PagerAdapter {BitmapUtils mBitmapUtils;public TopNewsAdapter() {// 初始化xutils中的加载图片的工具mBitmapUtils = new BitmapUtils(mActivity);// 设置默认加载图片 mBitmapUtils.configDefaultLoadingImage(R.drawable.topnews_item_default);}@Overridepublic int getCount() {return mTopNewsList.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {ImageView view = new ImageView(mActivity);view.setScaleType(ScaleType.FIT_XY);// 设置图片填充效果, 表示填充父窗体// 获取图片链接, 使用链接下载图片, 将图片设置给ImageView, 考虑内存溢出问题, 图片本地缓存 mBitmapUtils.display(view, mTopNewsList.get(position).topimage);container.addView(view);return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}class NewsAdapter extends BaseAdapter {public BitmapUtils mBitmapUtils;public NewsAdapter() {mBitmapUtils = new BitmapUtils(mActivity);mBitmapUtils.configDefaultLoadingImage(R.drawable.pic_item_list_default);}@Overridepublic int getCount() {return mNewsList.size();}@Overridepublic News getItem(int position) {return mNewsList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = View.inflate(mActivity, R.layout.list_item_news,null);holder = new ViewHolder();holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);holder.tvDate = (TextView) convertView.findViewById(R.id.tv_date);holder.ivIcon = (ImageView) convertView.findViewById(R.id.iv_icon);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}News news = getItem(position);holder.tvTitle.setText(news.title);holder.tvDate.setText(news.pubdate);mBitmapUtils.display(holder.ivIcon, news.listimage);// 标记已读和未读String readIds = PrefUtils.getString("read_ids", "", mActivity);if (readIds.contains(news.id)) {// 已读 holder.tvTitle.setTextColor(Color.GRAY);} else {// 未读 holder.tvTitle.setTextColor(Color.BLACK);}return convertView;}}static class ViewHolder {public TextView tvTitle;public TextView tvDate;public ImageView ivIcon;}}
TabDetailPager
public View initView() {
View view = View.inflate(mActivity, R.layout.pager_tab_detail, null);
ViewUtils.inject(this, view);
View header = View.inflate(mActivity, R.layout.list_header_topnews,
null);
ViewUtils.inject(this, header);// 必须也将头布局注入到ViewUtils
// 给listview添加头布局
lvList.addHeaderView(header);
// 设置下拉刷新监听
lvList.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
// 从网络加载数据
getDataFromServer();
}
@Override
public void loadMore() {
// 加载更多数据
if (mMoreUrl != null) {
System.out.println("加载下一页数据...");
getMoreDataFromServer();
} else {
lvList.onRefreshComplete(true);// 收起加载更多布局
Toast.makeText(mActivity, "没有更多数据了", Toast.LENGTH_SHORT)
.show();
}
}
});
lvList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
System.out.println("pos:" + position);
News news = mNewsList.get(position);
// 当前点击的item的标题颜色置灰
TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
tvTitle.setTextColor(Color.GRAY);
// 将已读状态持久化到本地
// key: read_ids; value: 1324,1325,1326
String readIds = PrefUtils.getString("read_ids", "", mActivity);
if (!readIds.contains(news.id)) {// 以前没有添加过,才添加进来
readIds = readIds + news.id + ",";// 1324,1325,
PrefUtils.putString("read_ids", readIds, mActivity);
}
// 跳到详情页
Intent intent = new Intent(mActivity, NewsDetailActivity.class);
intent.putExtra("url", news.url);
mActivity.startActivity(intent);
}
});
return view;
}
4、标记未读、已读,持续化到本地(TabDetailPager.java)
// 将已读状态持久化到本地
// key: read_ids; value: 1324,1325,1326
String readIds = PrefUtils.getString("read_ids", "", mActivity);
if (!readIds.contains(news.id)) {// 以前没有添加过,才添加进来
readIds = readIds + news.id + ",";// 1324,1325,
PrefUtils.putString("read_ids", readIds, mActivity);
}
在class NewsAdapter extends BaseAdapter中对已读灰色化
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(mActivity, R.layout.list_item_news,
null);
holder = new ViewHolder();
holder.tvTitle = (TextView) convertView
.findViewById(R.id.tv_title);
holder.tvDate = (TextView) convertView
.findViewById(R.id.tv_date);
holder.ivIcon = (ImageView) convertView
.findViewById(R.id.iv_icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
News news = getItem(position);
holder.tvTitle.setText(news.title);
holder.tvDate.setText(news.pubdate);
mBitmapUtils.display(holder.ivIcon, news.listimage);
// 标记已读和未读
String readIds = PrefUtils.getString("read_ids", "", mActivity);
if (readIds.contains(news.id)) {
// 已读
holder.tvTitle.setTextColor(Color.GRAY);
} else {
// 未读
holder.tvTitle.setTextColor(Color.BLACK);
}
return convertView;
}
转载于:https://www.cnblogs.com/ecollab/p/6054368.html
android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...相关推荐
- ListView的Item点击事件(消息传递)
转载请保留原文出处"http://my.oschina.net/gluoyer/blog",谢谢! 您可以到博客的"友情链接"中,"程序猿媛(最新下载 ...
- android listview边框颜色,Android实现带有边框的ListView和item的方法
本文实例讲述了Android实现带有边框的ListView和item的方法.分享给大家供大家参考,具体如下: 想为ListView和item四周添加边框有两种方法: 1.贴一张带有边框效果的背景图 2 ...
- android 机顶盒 view 焦点,AndroidTV/机顶盒 ListView获取焦点与点击事件问题处理方案...
AndroidTV/机顶盒 ListView获取焦点与点击事件问题处理方案 本人大二,最近在写一个Android机顶盒的小项目,遇到了这样一个问题.由于App的布局复杂,导致ListView用遥控器获 ...
- android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件
Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...
- 从源码角度入手实现RecyclerView的Item点击事件
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6758373.html RecyclerView 作为 ListView 和 GridView 的替代产物, ...
- Android学习笔记之ListView与Item的焦点冲突处理
由于ListView的Item需要焦点,Item里面的子控件(如ImageButton,Button,CheckBox等等)也需要焦点的时候,就会出现焦点冲突问题,导致Item无法获得焦点,无法相应I ...
- [Android]解决ClickableSpan中点击后ListView中item的长按冲突的问题
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3823429.html 项目中碰到一个问题,情景是这样的: 有一个Lis ...
- android 两列菜单,【Android】实战开发之ListView同一个item显示2列的实现方法(仿2列商品列表)...
Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用ListView,然后我们可以使用百度的自定义List ...
- android listview里item添加一个按钮点击事件,ListView Item点击事件跳转详情界面
有好久都没有碰安卓了,考试加五一双组合也真是让人蛋疼.好在都平安的度过了,所以又有时间gun回来弄弄我的小博客(虽然没多少人看= =).看了之前做的几个小demo,模式都差不多,但是每次写的时候都要在 ...
最新文章
- 如何用 Python 将 Excel 表格转成可视化图形?| 原力计划
- android textview改变部分文字的颜色和string.xml中文字的替换及部分内容设置颜色、字体、超链接、图片...
- ASP.Net MVC Relational KeyWord 4 Google 【More...】【欢迎补充】
- TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
- Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发
- 打开python环境_windows下切换Python运行环境。
- linux命令中tar后跟的zxvf是什么意思
- IDEA 创建maven jar、war、 pom项目
- SqlServer2000中作业无法删除的原因和解决办法
- 如何利用nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查
- 怎样得到对方的电脑名_吸引力法则让他想念你,让对方主动找你
- SVN增加文件后,文件无法自动包括在项目中的原因
- HDU 2028Lowest Common Multiple Plus
- 使matlab2018支持使用VS2019编译
- 软件工程的23种设计模式
- win10写java工具_推荐三款录屏工具:也许是电脑录屏最实用的软件
- “逆鬼”muma企图隐蔽发展 被360独家击杀
- iOS11界面交互设计规范(iOS 11 Human Interface Guidelines)
- 拉格朗日乘数法(Lagrange multiplier)
- 轻量化网络-SqueezeNet(2016)
热门文章
- mvc ajax_返回数据
- Windows Phone 7 开“.NET研究”发之:工具栏
- Nginx + Tomcat 负载均衡集群配置
- 绝对经典的滑轮新闻显示(javascript+css)实现
- php模板引擎如何实现,php模板引擎技术简单实现
- 服务器用户设置备份,用户管理的备份
- 两个点 定位_深圳Mark点定位的一般原理与步骤
- 关于学习Python的一点学习总结(36->基本序列和映射协议)
- 点分治问题 ----------- 2019西安邀请赛 j and and and[点分治]
- 数据治理展示血缘关系的工具_Nebula Graph 在微众银行数据治理业务的实践