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点击事件,将已读状态持久化到本地)...相关推荐

  1. ListView的Item点击事件(消息传递)

    转载请保留原文出处"http://my.oschina.net/gluoyer/blog",谢谢! 您可以到博客的"友情链接"中,"程序猿媛(最新下载 ...

  2. android listview边框颜色,Android实现带有边框的ListView和item的方法

    本文实例讲述了Android实现带有边框的ListView和item的方法.分享给大家供大家参考,具体如下: 想为ListView和item四周添加边框有两种方法: 1.贴一张带有边框效果的背景图 2 ...

  3. android 机顶盒 view 焦点,AndroidTV/机顶盒 ListView获取焦点与点击事件问题处理方案...

    AndroidTV/机顶盒 ListView获取焦点与点击事件问题处理方案 本人大二,最近在写一个Android机顶盒的小项目,遇到了这样一个问题.由于App的布局复杂,导致ListView用遥控器获 ...

  4. android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件

    Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...

  5. 从源码角度入手实现RecyclerView的Item点击事件

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6758373.html RecyclerView 作为 ListView 和 GridView 的替代产物, ...

  6. Android学习笔记之ListView与Item的焦点冲突处理

    由于ListView的Item需要焦点,Item里面的子控件(如ImageButton,Button,CheckBox等等)也需要焦点的时候,就会出现焦点冲突问题,导致Item无法获得焦点,无法相应I ...

  7. [Android]解决ClickableSpan中点击后ListView中item的长按冲突的问题

    以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3823429.html 项目中碰到一个问题,情景是这样的: 有一个Lis ...

  8. android 两列菜单,【Android】实战开发之ListView同一个item显示2列的实现方法(仿2列商品列表)...

    Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用ListView,然后我们可以使用百度的自定义List ...

  9. android listview里item添加一个按钮点击事件,ListView Item点击事件跳转详情界面

    有好久都没有碰安卓了,考试加五一双组合也真是让人蛋疼.好在都平安的度过了,所以又有时间gun回来弄弄我的小博客(虽然没多少人看= =).看了之前做的几个小demo,模式都差不多,但是每次写的时候都要在 ...

最新文章

  1. 如何用 Python 将 Excel 表格转成可视化图形?| 原力计划
  2. android textview改变部分文字的颜色和string.xml中文字的替换及部分内容设置颜色、字体、超链接、图片...
  3. ASP.Net MVC Relational KeyWord 4 Google 【More...】【欢迎补充】
  4. TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
  5. Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发
  6. 打开python环境_windows下切换Python运行环境。
  7. linux命令中tar后跟的zxvf是什么意思
  8. IDEA 创建maven jar、war、 pom项目
  9. SqlServer2000中作业无法删除的原因和解决办法
  10. 如何利用nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查
  11. 怎样得到对方的电脑名_吸引力法则让他想念你,让对方主动找你
  12. SVN增加文件后,文件无法自动包括在项目中的原因
  13. HDU 2028Lowest Common Multiple Plus
  14. 使matlab2018支持使用VS2019编译
  15. 软件工程的23种设计模式
  16. win10写java工具_推荐三款录屏工具:也许是电脑录屏最实用的软件
  17. “逆鬼”muma企图隐蔽发展 被360独家击杀
  18. iOS11界面交互设计规范(iOS 11 Human Interface Guidelines)
  19. 拉格朗日乘数法(Lagrange multiplier)
  20. 轻量化网络-SqueezeNet(2016)

热门文章

  1. mvc ajax_返回数据
  2. Windows Phone 7 开“.NET研究”发之:工具栏
  3. Nginx + Tomcat 负载均衡集群配置
  4. 绝对经典的滑轮新闻显示(javascript+css)实现
  5. php模板引擎如何实现,php模板引擎技术简单实现
  6. 服务器用户设置备份,用户管理的备份
  7. 两个点 定位_深圳Mark点定位的一般原理与步骤
  8. 关于学习Python的一点学习总结(36->基本序列和映射协议)
  9. 点分治问题 ----------- 2019西安邀请赛 j and and and[点分治]
  10. 数据治理展示血缘关系的工具_Nebula Graph 在微众银行数据治理业务的实践