一. ListView属性大全
1. 背景色: listView设置背景色android:background="@drawable/bg",拖动或者点击list空白位置的时候发现ListItem都变成黑色。 因为默认的ListItem背景是透明的,而ListView的背景是固定不变的,所以在滚动条滚动的过程中如果实时地去将当前每个Item的显示内容跟背景进行混合运算,所以android系统为了优化这个过程用,就使用了一个叫做android:cacheColorHint的属性,在黑色主题下默认的颜色值是#191919,所以就出现了刚才的画面,有一半是黑色的。
如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色;如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了,当然为了美化是要牺牲一些效率的。
2. android:fadingEdge="none" 去掉上边和下边黑色的阴影
3. android:divider="@drawable/list_driver" 其中 @drawable/list_driver 是一个图片资源lsitview的每一项之间需要设置一个图片做为间隔
设置Item之间无间隙
android:divider="#00000000" 或者在javaCode中如下定义:listView.setDividerHeight(0);
4. android:listSelector="@color/pink" listView item 选中时的颜色。默认为橙黄底色。
5. android:divider="@drawable/list_driver" 设置分割线的图片资源,如果则只要设置为
android:divider="@drawable/@null" 不想显示分割线
6. android:scrollbars="none" setVerticalScrollBarEnabled(true); 隐藏listView的滚动条
7. android:fadeScrollbars="true" 设置为true就可以实现滚动条的自动隐藏和显示
8. android:transcriptMode="alwaysScroll" 用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。
android:fastScrollEnabled="false"
android:fastScrollEnabled = "true" 加快滑动速度
android:drawSelectorOnTop="false"
android:scrollingCache="false"
android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到
android:drawSelectorOnTop="false" 点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的
二 listView上拉加载更多和下拉刷新1.布局
<net.hyww.widget.xlistview.PullToRefreshView android:id="@+id/main_pull_refresh_view" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:scrollbars="none" android:id="@+id/lv_time" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@android:color/transparent" android:divider="@drawable/line_gray" android:listSelector="@android:color/transparent" android:dividerHeight="1px" android:paddingBottom="5dip" android:fadingEdgeLength="0dp"/> <!-- </LinearLayout> --> </net.hyww.widget.xlistview.PullToRefreshView>2.在fragment或者activity初始化时候
mPullToRefreshView = (PullToRefreshView) findViewById(R.id.main_pull_refresh_view); mPullToRefreshView.setOnHeaderRefreshListener(this); mPullToRefreshView.setOnFooterRefreshListener(this);3. listview添加头和尾
头:
circleHeadView = setHeadView(); if (circleHeadView != null) { lv_time.addHeaderView(circleHeadView); }尾:
footerView = LayoutInflater.from(mContext).inflate(R.layout.weibo_details_frg_footer,null);
尾的布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center" android:visibility="gone"> <ProgressBar android:layout_width="30dp" android:layout_height="30dp" android:id="@+id/progressBar" android:indeterminate="false" android:visibility="gone"/> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:text="正在加载中..." android:textSize="18.0sp" android:textColor="@color/color_666666" android:visibility="gone"/> </LinearLayout>
4 刷新方法
* 刷新所有 */ private void reflashAll() { doRequest(true); } @Override public void onHeaderRefresh(PullToRefreshView view) { reflashAll(); } @Override public void onFooterRefresh(PullToRefreshView view) {doRequest(false);}
/** * 请求页面 * * @param isRefresh */ protected void doRequest(final boolean isRefresh) { if (!UserUtils.getInstance().isOnline(mContext)) { return; } if (isRefresh) current_page = 1; else current_page++; final LoadingDialog loadingDialog = LoadingDialog.newInstance(); if (mAdapter.getCount() == 0) { loadingDialog.show(getChildFragmentManager(), "loading"); } String requestStr=RequestBuilder.getInstance().buildConditionRequest(App.getUser().user_id, getClassId(), setRequestType(), Cfg.PAGE.PAGE_SIZE, current_page,showCircleRange()); RequestTarget.URL_TARGET target = getUrlTarget(); VolleryFactory.getInstance().JsonPostAES(getActivity(), target,requestStr, new BaseRequest() { @Override public void requestSucceed(Object object) { try { loadingDialog.dismissAllowingStateLoss(); } catch (Exception e) { } if (current_page == 1) { lastPullRlashTime = TimeUtils.getCurrentTime("HH:mm"); } finishReflush(); result = (TimeLineResult) object; if (result == null || !TextUtils.isEmpty(result.error)) { return; } ArrayList<TimeLineResult.Condition> list = new ArrayList<TimeLineResult.Condition>(); if (ListUtils.getSize(result.statuses) > 0) { for (TimeLineResult.Condition condition : result.statuses) { if (condition.is_essence == Cfg.TimeLinePostType.NOMAL_POST || condition.is_essence == Cfg.TimeLinePostType.ESSENCE_POST || condition.is_essence == Cfg.TimeLinePostType.AD_POST || condition.is_essence == Cfg.TimeLinePostType.ACTIVITY_POST) { list.add(condition); } } } if (current_page == 1) { if (ListUtils.getSize(list) > 0) { no_content_show.setVisibility(View.GONE); } else { no_content_show.setVisibility(View.VISIBLE); } mAdapter.setList(list); if (circleHeadView != null) {//更新headerview try { // requestClassStar(); circleHeadView.reflash(true); } catch (Exception e) { e.printStackTrace(); } } saveDataCache(list); } else { List<TimeLineResult.Condition> currentList = mAdapter.getList(); if (currentList != null && currentList.size() > 0) { currentList.addAll(list); } // else { // mAdapter.setList(list); // //TODO:结果小于每页条目,则翻页到底了。 // } } mAdapter.notifyDataSetChanged(); } @Override public void requestFailed() { try { loadingDialog.dismissAllowingStateLoss(); } catch (Exception e) { } finishReflush(); } } ); }/** * 保存第一页缓存数据 * * @param list */ public void saveDataCache(ArrayList<TimeLineResult.Condition> list) { if(App.getUser().class_id==getClassId()) SharedUtil.saveObjectCache(mContext,setDataCacheName(), list); }
//完成刷新
private void finishReflush() { // dismissDialog(DialogCreater.DIALOG_LOADING); mPullToRefreshView.onFooterRefreshComplete(); mPullToRefreshView.onHeaderRefreshComplete(lastPullRlashTime); }//获取本地数据
getData();/** * 获取本地缓存数据 */ protected void getData() { new LoadCacheData().execute(); }public class LoadCacheData extends AsyncTask<Void,Void,ArrayList<TimeLineResult.Condition>>{ @Override protected ArrayList<TimeLineResult.Condition> doInBackground(Void... params) { ArrayList<TimeLineResult.Condition> list = SharedUtil.getObjectCache(mContext,setDataCacheName(), new TypeToken<ArrayList<TimeLineResult.Condition>>() { }.getType()); return list; } @Override protected void onPostExecute(ArrayList<TimeLineResult.Condition> list) { if (ListUtils.getSize(list) > 0) { mAdapter.setList(list); }else{ mAdapter.setList(null); } mAdapter.notifyDataSetChanged(); /** * 圈子缓存2小时数据不刷新,其他继承EssenceCircleBaseFrg 实时刷新 */ if(subscriptViewVisibale()){ long cache_rircle_time = SharedDataCacheTimeUtil.getLongCommon(mContext, SharedDataCacheTimeUtil.SHARE_CIRCLE_TIME_KEY); if(cache_rircle_time!=-1&& TimestampUtils.compareTimestampHour(System.currentTimeMillis(), cache_rircle_time)<2){ if (circleHeadView != null) { circleHeadView.reflash(false); } return; } } reGetData(); } }
/** * 刷新未读记录 */ private void requestUnreadMsgNumber() { subscriptView.setVisibility(View.VISIBLE); VolleryFactory.getInstance().JsonPostAES(mContext, RequestTarget.URL_TARGET.MSG_BOX_UNREAD_NUMBER, RequestBuilder.getInstance().buildMsgBoxUnreadNumberRequest(App.getUser().user_id), new BaseRequest() { @Override public void requestSucceed(Object object) { MsgUnreadNumberResult result = (MsgUnreadNumberResult) object; if (result == null || !TextUtils.isEmpty(result.error)) { return; } int unreadCount=0; if(App.getClientType()==Cfg.UserRole.PARENT){ unreadCount = result.number+result.study_number; }else{ unreadCount = result.number; } if (unreadCount > 0) { subscriptView.setText("" + unreadCount); subscriptView.setTextVisibility(View.VISIBLE); } else { subscriptView.setTextVisibility(View.GONE); } if (listener != null) listener.callBack(unreadCount); } @Override public void requestFailed() { } } ,false); }//回传圈子是否有新消息给activity public interface RefreshCircleTabCallBack { public void callBack(int num);//value为传入的值 }@Override public void onResume() { super.onResume(); try { if (subscriptViewVisibale()) { requestUnreadMsgNumber(); } if(circleHeadView!=null){ circleHeadView.onResume(); } // reflashAll(); } catch (Exception e) { e.printStackTrace(); } } @Override public void onPause() { if(circleHeadView!=null){ circleHeadView.onPause(); } super.onPause(); }