仿微信朋友圈/qq空间评论 下载刷新下拉加载回复、评论等
时间:2015-04-21 18:14:55
收藏:0
阅读:465
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> D</span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);">emo下载地址http://download.csdn.net/detail/u012303938/8616647</span>
示意图:
思路 :采用Xlistview套listview方法实现,Xlistview下载地址前面说过http://blog.csdn.net/u012303938/article/details/43818259
直接上代码
MainActivity
package com.example.test_pinglun; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import com.example.test_pinglun.XListView.IXListViewListener; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements IXListViewListener{ private ArrayList<Map<String, Object>> mlList,mmList,list; private Context context; private LinearLayout ll_bo,ll_po; private PopupWindow pw; private RelativeLayout rl; private EditText et_pop; private TextView tv_qs,tv_hf; private MyAdapter adapter; private XListView mListView; private ListView lv_hf; private MyHFAdapter myHFAdapter; private HolderView holder; private boolean flag=false;//判断是否回复某人 //点击回复某人内容的位置 private int pos=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); findView(); addData(); loadData(); addListenr(); } private void addListenr() { // TODO Auto-generated method stub tv_hf.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub String content=et_pop.getText().toString(); Map<String, Object> map=new HashMap<String, Object>(); map.put("name", "we草莓:"); map.put("content", content); if(flag){ if(list!=null){ mlList.remove(pos); Map<String, Object> ap=new HashMap<String, Object>(); ap.put("name", "we微笑"+pos); ap.put("content", "num"+pos); ArrayList<Map<String,Object>> st=new ArrayList<Map<String,Object>>(); for(int j=0;j<3;j++){ Map<String, Object> mp=new HashMap<String, Object>(); mp.put("name", "we微笑"+pos); mp.put("content", ": hello"+j); st.add(mp); } st.add(map); ap.put("replys", st); mlList.add(pos, ap); } }else{ ArrayList<Map<String,Object>> st=new ArrayList<Map<String,Object>>(); for(int j=0;j<3;j++){ Map<String, Object> mp=new HashMap<String, Object>(); mp.put("name", "we微笑"+pos); mp.put("content", ": hello"+j); st.add(mp); } map.put("replys", st); mlList.add(map); adapter.notifyDataSetChanged(); } et_pop.getText().clear(); ll_po.setVisibility(View.GONE); ll_bo.setVisibility(View.VISIBLE); } }); tv_qs.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub flag=false; ll_po.setVisibility(View.GONE); ll_bo.setVisibility(View.VISIBLE); } }); ll_bo.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // ll_po.setFocusable(true); // tv_pop.setFocusable(true); // tv_pop.setFocusableInTouchMode(true); //ll_po.requestFocus(); showInput(); } }); } /* * 显示回复的内容框 */ public void showInput(){ ll_bo.setVisibility(View.GONE); ll_po.setVisibility(View.VISIBLE); et_pop.setFocusable(true); et_pop.requestFocus(); ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)). showSoftInput(et_pop, 0); } private void findView() { // TODO Auto-generated method stub context=this; //回复列表内容 mlList=new ArrayList<Map<String,Object>>(); mListView=(XListView) findViewById(R.id.lv); ll_bo=(LinearLayout) findViewById(R.id.ll_bo); ll_po=(LinearLayout) findViewById(R.id.ll_po); rl=(RelativeLayout) findViewById(R.id.rl); et_pop=(EditText) findViewById(R.id.tv_pop); tv_qs=(TextView) findViewById(R.id.tv_qs); tv_hf=(TextView) findViewById(R.id.tv_hf); mListView.setPullLoadEnable(true); mListView.setXListViewListener(this); lv_hf=(ListView) findViewById(R.id.lv_hf); } private void addPop() { // TODO Auto-generated method stub pw=new PopupWindow(context); pw.setWidth(LinearLayout.LayoutParams.MATCH_PARENT); pw.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT); pw.setContentView(View.inflate(context, R.layout.ll_bottom, null)); pw.setFocusable(true); pw.setOutsideTouchable(true); pw.showAtLocation(rl, Gravity.BOTTOM, 0, 0); } private void addData() { // TODO Auto-generated method stub for(int i=0;i<5;i++){ Map<String, Object> map=new HashMap<String, Object>(); map.put("name", "we微笑"+i); map.put("content", "num"+i); mmList=new ArrayList<Map<String,Object>>(); for(int j=0;j<3;j++){ Map<String, Object> mp=new HashMap<String, Object>(); mp.put("name", "we微笑"+i); mp.put("content", ": hello"+j); mmList.add(mp); } map.put("replys", mmList); mlList.add(map); } Log.i("test", ":"+mmList.size()); } private void loadData() { // TODO Auto-generated method stub adapter=new MyAdapter(); mListView.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public class MyAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return mlList.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return mlList.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @SuppressWarnings("unchecked") @Override public View getView(final int position, View convertview, ViewGroup arg2) { // TODO Auto-generated method stub holder=new HolderView(); if(convertview==null){ convertview=View.inflate(context, R.layout.tiezi_item, null); holder.tv_name=(TextView) convertview.findViewById(R.id.tv_name); holder.tv_hf=(TextView) convertview.findViewById(R.id.tv_hf); holder.tv_content=(TextView) convertview.findViewById(R.id.tv_content); holder.lv_hf=(ListView) convertview.findViewById(R.id.lv_hf); convertview.setTag(holder); }else{ holder=(HolderView) convertview.getTag(); } holder.tv_name.setText(mlList.get(position).get("name").toString()); if(!"".equals(mlList.get(position).get("content").toString())){ holder.tv_content.setVisibility(View.VISIBLE); holder.tv_content.setText(mlList.get(position).get("content").toString()); } list=(ArrayList<Map<String, Object>>) mlList.get(position).get("replys"); myHFAdapter=new MyHFAdapter(); holder.lv_hf.setAdapter(myHFAdapter); setListViewHeightBasedOnChildren(holder.lv_hf); myHFAdapter.notifyDataSetChanged(); Log.i("test", ""+list.size()); holder.tv_hf.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub showInput(); pos=position; flag=true; Toast.makeText(context, pos+"", 1).show(); } }); return convertview; } }private class HolderView{ private TextView tv_name,tv_hf,tv_content; private ListView lv_hf; } @Override public void onRefresh() { // TODO Auto-generated method stub mlList.clear(); addData(); adapter.notifyDataSetChanged(); onLoad(); } @Override public void onLoadMore() { // TODO Auto-generated method stub // TODO Auto-generated method stub addData(); adapter.notifyDataSetChanged(); onLoad(); } private void onLoad() { mListView.stopRefresh(); mListView.stopLoadMore(); mListView.setRefreshTime("刚刚"); } class MyHFAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return list.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int arg0, View contentview, ViewGroup arg2) { // TODO Auto-generated method stub HolderView1 view1=new HolderView1(); if(contentview==null){ contentview=View.inflate(context, R.layout.hf_item, null); view1.tv_name1=(TextView) contentview.findViewById(R.id.tv_name1); view1.tv_content1=(TextView) contentview.findViewById(R.id.tv_content1); contentview.setTag(view1); }else{ view1=(HolderView1) contentview.getTag(); } view1.tv_name1.setText(list.get(arg0).get("name").toString()); view1.tv_content1.setText(list.get(arg0).get("content").toString()); return contentview; } class HolderView1{ private TextView tv_name1,tv_content1; } } public static void setListViewHeightBasedOnChildren(ListView listView) { //获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { //listAdapter.getCount()返回数据项的数目 View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); //计算子项View 的宽高 totalHeight += listItem.getMeasuredHeight(); //统计所有子项的总高度 } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); //listView.getDividerHeight()获取子项间分隔符占用的高度 //params.height最后得到整个ListView完整显示需要的高度 listView.setLayoutParams(params); } }XListview
/** * @file XListView.java * @package me.maxwin.view * @create Mar 18, 2012 6:28:41 PM * @author Maxwin * @description An ListView support (a) Pull down to refresh, (b) Pull up to load more. * Implement IXListViewListener, and see stopRefresh() / stopLoadMore(). */ package com.example.test_pinglun; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.animation.DecelerateInterpolator; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Scroller; import android.widget.TextView; public class XListView extends ListView implements OnScrollListener { private float mLastY = -1; // save event y private Scroller mScroller; // used for scroll back private OnScrollListener mScrollListener; // user's scroll listener // the interface to trigger refresh and load more. private IXListViewListener mListViewListener; // -- header view private XListViewHeader mHeaderView; // header view content, use it to calculate the Header's height. And hide it // when disable pull refresh. private RelativeLayout mHeaderViewContent; private TextView mHeaderTimeView; private int mHeaderViewHeight; // header view's height private boolean mEnablePullRefresh = true; private boolean mPullRefreshing = false; // is refreashing. // -- footer view private XListViewFooter mFooterView; private boolean mEnablePullLoad; private boolean mPullLoading; private boolean mIsFooterReady = false; // total list items, used to detect is at the bottom of listview. private int mTotalItemCount; // for mScroller, scroll back from header or footer. private int mScrollBack; private final static int SCROLLBACK_HEADER = 0; private final static int SCROLLBACK_FOOTER = 1; private final static int SCROLL_DURATION = 400; // scroll back duration private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px private final static float OFFSET_RADIO = 1.8f; // support iOS like pull // feature. /** * @param context */ public XListView(Context context) { super(context); initWithContext(context); } public XListView(Context context, AttributeSet attrs) { super(context, attrs); initWithContext(context); } public XListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initWithContext(context); } private void initWithContext(Context context) { mScroller = new Scroller(context, new DecelerateInterpolator()); // XListView need the scroll event, and it will dispatch the event to // user's listener (as a proxy). super.setOnScrollListener(this); // init header view mHeaderView = new XListViewHeader(context); mHeaderViewContent = (RelativeLayout) mHeaderView .findViewById(R.id.xlistview_header_content); mHeaderTimeView = (TextView) mHeaderView .findViewById(R.id.xlistview_header_time); addHeaderView(mHeaderView); // init footer view mFooterView = new XListViewFooter(context); // init header height mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mHeaderViewHeight = mHeaderViewContent.getHeight(); getViewTreeObserver() .removeGlobalOnLayoutListener(this); } }); } @Override public void setAdapter(ListAdapter adapter) { // make sure XListViewFooter is the last footer view, and only add once. if (mIsFooterReady == false) { mIsFooterReady = true; addFooterView(mFooterView); } super.setAdapter(adapter); } /** * enable or disable pull down refresh feature. * * @param enable */ public void setPullRefreshEnable(boolean enable) { mEnablePullRefresh = enable; if (!mEnablePullRefresh) { // disable, hide the content mHeaderViewContent.setVisibility(View.INVISIBLE); } else { mHeaderViewContent.setVisibility(View.VISIBLE); } } /** * enable or disable pull up load more feature. * * @param enable */ public void setPullLoadEnable(boolean enable) { mEnablePullLoad = enable; if (!mEnablePullLoad) { mFooterView.hide(); mFooterView.setOnClickListener(null); //make sure "pull up" don't show a line in bottom when listview with one page setFooterDividersEnabled(false); } else { mPullLoading = false; mFooterView.show(); mFooterView.setState(XListViewFooter.STATE_NORMAL); //make sure "pull up" don't show a line in bottom when listview with one page setFooterDividersEnabled(true); // both "pull up" and "click" will invoke load more. mFooterView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startLoadMore(); } }); } } /** * stop refresh, reset header view. */ public void stopRefresh() { if (mPullRefreshing == true) { mPullRefreshing = false; resetHeaderHeight(); } } /** * stop load more, reset footer view. */ public void stopLoadMore() { if (mPullLoading == true) { mPullLoading = false; mFooterView.setState(XListViewFooter.STATE_NORMAL); } } /** * set last refresh time * * @param time */ public void setRefreshTime(String time) { mHeaderTimeView.setText(time); } private void invokeOnScrolling() { if (mScrollListener instanceof OnXScrollListener) { OnXScrollListener l = (OnXScrollListener) mScrollListener; l.onXScrolling(this); } } private void updateHeaderHeight(float delta) { mHeaderView.setVisiableHeight((int) delta + mHeaderView.getVisiableHeight()); if (mEnablePullRefresh && !mPullRefreshing) { // 鏈浜庡埛鏂扮姸鎬侊紝鏇存柊绠ご if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) { mHeaderView.setState(XListViewHeader.STATE_READY); } else { mHeaderView.setState(XListViewHeader.STATE_NORMAL); } } setSelection(0); // scroll to top each time } /** * reset header view's height. */ private void resetHeaderHeight() { int height = mHeaderView.getVisiableHeight(); if (height == 0) // not visible. return; // refreshing and header isn't shown fully. do nothing. if (mPullRefreshing && height <= mHeaderViewHeight) { return; } int finalHeight = 0; // default: scroll back to dismiss header. // is refreshing, just scroll back to show all the header. if (mPullRefreshing && height > mHeaderViewHeight) { finalHeight = mHeaderViewHeight; } mScrollBack = SCROLLBACK_HEADER; mScroller.startScroll(0, height, 0, finalHeight - height, SCROLL_DURATION); // trigger computeScroll invalidate(); } private void updateFooterHeight(float delta) { int height = mFooterView.getBottomMargin() + (int) delta; if (mEnablePullLoad && !mPullLoading) { if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load // more. mFooterView.setState(XListViewFooter.STATE_READY); } else { mFooterView.setState(XListViewFooter.STATE_NORMAL); } } mFooterView.setBottomMargin(height); // setSelection(mTotalItemCount - 1); // scroll to bottom } private void resetFooterHeight() { int bottomMargin = mFooterView.getBottomMargin(); if (bottomMargin > 0) { mScrollBack = SCROLLBACK_FOOTER; mScroller.startScroll(0, bottomMargin, 0, -bottomMargin, SCROLL_DURATION); invalidate(); } } private void startLoadMore() { mPullLoading = true; mFooterView.setState(XListViewFooter.STATE_LOADING); if (mListViewListener != null) { mListViewListener.onLoadMore(); } } @Override public boolean onTouchEvent(MotionEvent ev) { if (mLastY == -1) { mLastY = ev.getRawY(); } switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mLastY = ev.getRawY(); break; case MotionEvent.ACTION_MOVE: final float deltaY = ev.getRawY() - mLastY; mLastY = ev.getRawY(); if (getFirstVisiblePosition() == 0 && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) { // the first item is showing, header has shown or pull down. updateHeaderHeight(deltaY / OFFSET_RADIO); invokeOnScrolling(); } else if (getLastVisiblePosition() == mTotalItemCount - 1 && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) { // last item, already pulled up or want to pull up. updateFooterHeight(-deltaY / OFFSET_RADIO); } break; default: mLastY = -1; // reset if (getFirstVisiblePosition() == 0) { // invoke refresh if (mEnablePullRefresh && mHeaderView.getVisiableHeight() > mHeaderViewHeight) { mPullRefreshing = true; mHeaderView.setState(XListViewHeader.STATE_REFRESHING); if (mListViewListener != null) { mListViewListener.onRefresh(); } } resetHeaderHeight(); } if (getLastVisiblePosition() == mTotalItemCount - 1) { // invoke load more. if (mEnablePullLoad && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA && !mPullLoading) { startLoadMore(); } resetFooterHeight(); } break; } return super.onTouchEvent(ev); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { if (mScrollBack == SCROLLBACK_HEADER) { mHeaderView.setVisiableHeight(mScroller.getCurrY()); } else { mFooterView.setBottomMargin(mScroller.getCurrY()); } postInvalidate(); invokeOnScrolling(); } super.computeScroll(); } @Override public void setOnScrollListener(OnScrollListener l) { mScrollListener = l; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (mScrollListener != null) { mScrollListener.onScrollStateChanged(view, scrollState); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // send to user's listener mTotalItemCount = totalItemCount; if (mScrollListener != null) { mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } } public void setXListViewListener(IXListViewListener l) { mListViewListener = l; } /** * you can listen ListView.OnScrollListener or this one. it will invoke * onXScrolling when header/footer scroll back. */ public interface OnXScrollListener extends OnScrollListener { public void onXScrolling(View view); } /** * implements this interface to get refresh/load more event. */ public interface IXListViewListener { public void onRefresh(); public void onLoadMore(); } }
XListViewFooter
/** * @file XFooterView.java * @create Mar 31, 2012 9:33:43 PM * @author Maxwin * @description XListView's footer */ package com.example.test_pinglun; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; public class XListViewFooter extends LinearLayout { public final static int STATE_NORMAL = 0; public final static int STATE_READY = 1; public final static int STATE_LOADING = 2; private Context mContext; private View mContentView; private View mProgressBar; private TextView mHintView; public XListViewFooter(Context context) { super(context); initView(context); } public XListViewFooter(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public void setState(int state) { mHintView.setVisibility(View.INVISIBLE); mProgressBar.setVisibility(View.INVISIBLE); mHintView.setVisibility(View.INVISIBLE); if (state == STATE_READY) { mHintView.setVisibility(View.VISIBLE); mHintView.setText(R.string.xlistview_footer_hint_ready); } else if (state == STATE_LOADING) { mProgressBar.setVisibility(View.VISIBLE); } else { mHintView.setVisibility(View.VISIBLE); mHintView.setText(R.string.xlistview_footer_hint_normal); } } public void setBottomMargin(int height) { if (height < 0) return ; LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams(); lp.bottomMargin = height; mContentView.setLayoutParams(lp); } public int getBottomMargin() { LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams(); return lp.bottomMargin; } /** * normal status */ public void normal() { mHintView.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.GONE); } /** * loading status */ public void loading() { mHintView.setVisibility(View.GONE); mProgressBar.setVisibility(View.VISIBLE); } /** * hide footer when disable pull load more */ public void hide() { LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams(); lp.height = 0; mContentView.setLayoutParams(lp); } /** * show footer */ public void show() { LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams(); lp.height = LayoutParams.WRAP_CONTENT; mContentView.setLayoutParams(lp); } private void initView(Context context) { mContext = context; LinearLayout moreView = (LinearLayout)LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null); addView(moreView); moreView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); mContentView = moreView.findViewById(R.id.xlistview_footer_content); mProgressBar = moreView.findViewById(R.id.xlistview_footer_progressbar); mHintView = (TextView)moreView.findViewById(R.id.xlistview_footer_hint_textview); } }
XListViewHeader
/** * @file XListViewHeader.java * @create Apr 18, 2012 5:22:27 PM * @author Maxwin * @description XListView's header */ package com.example.test_pinglun; import android.content.Context; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; public class XListViewHeader extends LinearLayout { private LinearLayout mContainer; private ImageView mArrowImageView; private ProgressBar mProgressBar; private TextView mHintTextView; private int mState = STATE_NORMAL; private Animation mRotateUpAnim; private Animation mRotateDownAnim; private final int ROTATE_ANIM_DURATION = 180; public final static int STATE_NORMAL = 0; public final static int STATE_READY = 1; public final static int STATE_REFRESHING = 2; public XListViewHeader(Context context) { super(context); initView(context); } /** * @param context * @param attrs */ public XListViewHeader(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } private void initView(Context context) { // 鍒濆鎯呭喌锛岃缃笅鎷夊埛鏂皏iew楂樺害涓?0 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, 0); mContainer = (LinearLayout) LayoutInflater.from(context).inflate( R.layout.xlistview_header, null); addView(mContainer, lp); setGravity(Gravity.BOTTOM); mArrowImageView = (ImageView)findViewById(R.id.xlistview_header_arrow); mHintTextView = (TextView)findViewById(R.id.xlistview_header_hint_textview); mProgressBar = (ProgressBar)findViewById(R.id.xlistview_header_progressbar); mRotateUpAnim = new RotateAnimation(0.0f, -180.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION); mRotateUpAnim.setFillAfter(true); mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION); mRotateDownAnim.setFillAfter(true); } public void setState(int state) { if (state == mState) return ; if (state == STATE_REFRESHING) { // 鏄剧ず杩涘害 mArrowImageView.clearAnimation(); mArrowImageView.setVisibility(View.INVISIBLE); mProgressBar.setVisibility(View.VISIBLE); } else { // 鏄剧ず绠ご鍥剧墖 mArrowImageView.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.INVISIBLE); } switch(state){ case STATE_NORMAL: if (mState == STATE_READY) { mArrowImageView.startAnimation(mRotateDownAnim); } if (mState == STATE_REFRESHING) { mArrowImageView.clearAnimation(); } mHintTextView.setText(R.string.xlistview_header_hint_normal); break; case STATE_READY: if (mState != STATE_READY) { mArrowImageView.clearAnimation(); mArrowImageView.startAnimation(mRotateUpAnim); mHintTextView.setText(R.string.xlistview_header_hint_ready); } break; case STATE_REFRESHING: mHintTextView.setText(R.string.xlistview_header_hint_loading); break; default: } mState = state; } public void setVisiableHeight(int height) { if (height < 0) height = 0; LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContainer .getLayoutParams(); lp.height = height; mContainer.setLayoutParams(lp); } public int getVisiableHeight() { return mContainer.getHeight(); } }
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rl" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.example.test_pinglun.XListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:divider="#dedede" android:dividerHeight="5dp" > </com.example.test_pinglun.XListView> <LinearLayout android:id="@+id/ll_bo" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" > <include layout="@layout/ll_bottom" /> </LinearLayout> <LinearLayout android:visibility="gone" android:id="@+id/ll_po" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" > <include layout="@layout/ll_pop" /> </LinearLayout> </RelativeLayout>
hf_item
<?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="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/tv_name1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv_content1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </LinearLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item_textview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp" android:textColor="#000" android:textSize="16sp" > </TextView>
ll_bottom.xml
<?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="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#dedede" android:orientation="horizontal" > <LinearLayout android:layout_width="0dp" android:layout_weight="7" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginLeft="25dp" android:layout_marginRight="5dp" android:layout_marginTop="10dp" android:background="@drawable/input_back_ios" android:gravity="center_vertical" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@drawable/pub2" android:gravity="center_vertical" android:text="回复也是一种鼓励" android:textColor="#dedede" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:gravity="center_vertical" android:layout_weight="1"> <TextView android:drawableTop="@drawable/quan_comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#aaaaaa" android:text="回复"/> </LinearLayout> </LinearLayout> </LinearLayout>
ll_pop.xml
<?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="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#dedede" android:orientation="horizontal" > <LinearLayout android:layout_width="0dp" android:layout_weight="7" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginLeft="25dp" android:layout_marginRight="5dp" android:layout_marginTop="10dp" android:background="@drawable/input_back_ios" android:gravity="center_vertical" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@drawable/pub2" android:gravity="center_vertical" android:text="回复也是一种鼓励" android:textColor="#dedede" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:gravity="center_vertical" android:layout_weight="1"> <TextView android:drawableTop="@drawable/quan_comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#aaaaaa" android:text="回复"/> </LinearLayout> </LinearLayout> </LinearLayout>
tiezi_item.xml
<?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="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:src="@drawable/head_default" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="名字" android:textColor="#ff0000" android:textSize="18sp" /> <TextView android:layout_marginBottom="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:drawableLeft="@drawable/act_local" android:text=" 济南" android:textColor="#cdcdcd" android:textSize="14sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:background="#dedede" android:orientation="vertical" > <ImageView android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/face_a1" /> <TextView android:visibility="gone" android:id="@+id/tv_content" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_marginRight="10dp" android:layout_marginTop="5dp" android:background="#dedede" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ListView android:id="@+id/lv_hf" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView> </LinearLayout> <RelativeLayout android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginTop="10dp" android:drawableLeft="@drawable/bbs_time" android:text=" 1小时前" android:textColor="#cdcdcd" android:textSize="14sp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:background="@drawable/btn_huifu" android:orientation="horizontal" > <TextView android:id="@+id/tv_hf" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@drawable/bbs_message" android:padding="5dp" android:text=" 回复" android:textColor="@color/blue" /> </LinearLayout> </RelativeLayout> </LinearLayout> </LinearLayout> </LinearLayout>
xlistview_footer
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <RelativeLayout android:id="@+id/xlistview_footer_content" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dp" > <ProgressBar android:id="@+id/xlistview_footer_progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="invisible" /> <TextView android:id="@+id/xlistview_footer_hint_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="@string/xlistview_footer_hint_normal" /> </RelativeLayout> </LinearLayout>
xlsitview_header
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#dedede" android:gravity="bottom" > <RelativeLayout android:id="@+id/xlistview_header_content" android:layout_width="fill_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:orientation="vertical" android:id="@+id/xlistview_header_text"> <TextView android:id="@+id/xlistview_header_hint_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/xlistview_header_hint_normal" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/xlistview_header_last_time" android:textSize="12sp" /> <TextView android:id="@+id/xlistview_header_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" /> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/xlistview_header_arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/xlistview_header_text" android:layout_centerVertical="true" android:layout_marginLeft="-35dp" android:src="@drawable/xlistview_arrow" /> <ProgressBar android:id="@+id/xlistview_header_progressbar" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignLeft="@id/xlistview_header_text" android:layout_centerVertical="true" android:layout_marginLeft="-40dp" android:visibility="invisible" /> </RelativeLayout> </LinearLayout>
评论(0)