仿微信朋友圈/qq空间评论 下载刷新下拉加载回复、评论等
来源:互联网 发布:淘宝店铺刷信誉多少钱 编辑:程序博客网 时间:2024/04/30 02:03
<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() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubString 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() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubflag=false;ll_po.setVisibility(View.GONE);ll_bo.setVisibility(View.VISIBLE);}}); ll_bo.setOnClickListener(new OnClickListener() {@Overridepublic 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 stubpw=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 stubfor(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 stubadapter=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{@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mlList.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn mlList.get(arg0);}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn arg0;}@SuppressWarnings("unchecked")@Overridepublic View getView(final int position, View convertview, ViewGroup arg2) {// TODO Auto-generated method stubholder=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() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubshowInput();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;}@Overridepublic void onRefresh() {// TODO Auto-generated method stubmlList.clear();addData();adapter.notifyDataSetChanged();onLoad();}@Overridepublic void onLoadMore() {// TODO Auto-generated method stub// TODO Auto-generated method stubaddData();adapter.notifyDataSetChanged();onLoad();}private void onLoad() {mListView.stopRefresh();mListView.stopLoadMore();mListView.setRefreshTime("刚刚");}class MyHFAdapter extends BaseAdapter{@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn list.get(arg0);}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn arg0;}@Overridepublic View getView(int arg0, View contentview, ViewGroup arg2) {// TODO Auto-generated method stubHolderView1 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 yprivate Scroller mScroller; // used for scroll backprivate OnScrollListener mScrollListener; // user's scroll listener// the interface to trigger refresh and load more.private IXListViewListener mListViewListener;// -- header viewprivate 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 heightprivate boolean mEnablePullRefresh = true;private boolean mPullRefreshing = false; // is refreashing.// -- footer viewprivate 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 durationprivate final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50pxprivate 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 viewmHeaderView = 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 viewmFooterView = new XListViewFooter(context);// init header heightmHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {mHeaderViewHeight = mHeaderViewContent.getHeight();getViewTreeObserver().removeGlobalOnLayoutListener(this);}});}@Overridepublic 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 contentmHeaderViewContent.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() {@Overridepublic 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 computeScrollinvalidate();}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();}}@Overridepublic 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; // resetif (getFirstVisiblePosition() == 0) {// invoke refreshif (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);}@Overridepublic void computeScroll() {if (mScroller.computeScrollOffset()) {if (mScrollBack == SCROLLBACK_HEADER) {mHeaderView.setVisiableHeight(mScroller.getCurrY());} else {mFooterView.setBottomMargin(mScroller.getCurrY());}postInvalidate();invokeOnScrolling();}super.computeScroll();}@Overridepublic void setOnScrollListener(OnScrollListener l) {mScrollListener = l;}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (mScrollListener != null) {mScrollListener.onScrollStateChanged(view, scrollState);}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {// send to user's listenermTotalItemCount = 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楂樺害涓?0LinearLayout.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>
4 0
- 仿微信朋友圈/qq空间评论 下载刷新下拉加载回复、评论等
- 模仿qq空间评论以及回复
- Jquery局部刷新--多用于评论回复等
- Android 朋友圈之评论回复列表
- qq空间评论bug?
- QQ空间秒赞秒评论
- 设置QQ空间评论回复权限,包括日志、相册、说说、留言板的评论回复和留言权限,限制名单成员无评论回复权限
- 实现类似微信朋友圈或者QQ空间,评论回复,九宫格布局。处理键盘弹出后定位到当前点击的被评论人处。另:滑动时候FPS在57-60之间,纵享丝滑
- 仿微信朋友圈(QQ空间)下拉刷新(头部放大动画效果)
- qq空间评论的功能
- ajax评论回复,注意刷新location.reload();
- 仿QQ空间、微信朋友圈点击评论弹出输入框
- 朋友圈评论回复的两种实现方式
- 数据库 评论和评论回复
- Android评论工具类,实现QQ空间文字评论效果
- QQ空间触屏版说说模拟评论
- 实现QQ空间评论列表样式
- 仿QQ空间文章列表+评论查询
- web开发总结
- linux pppoe移植方法
- 机器人视觉跟踪与控制研究(一)
- virtio-blk后端处理-请求接收、解析、提交
- 發佈無線充電IC系列產品
- 仿微信朋友圈/qq空间评论 下载刷新下拉加载回复、评论等
- hdu4549 矩阵快速幂
- 行孝——长沙爱之心老年公寓送温暖
- css基础学习笔记
- [学习笔记]SSH连接虚拟机上RedHat的问题
- ns2中程序未执行完无trace文件探究
- MySQL 获取连续范围
- MFC调试的几个技巧
- 信管14:类的继承示代码1