模拟新浪微博随便看看栏目ListView

来源:互联网 发布:cad图纸合并软件 编辑:程序博客网 时间:2024/06/08 02:36

  最近学习了ListView,想要尝试做一个“模拟新浪微博随便看看栏目”,希望可以和你们一起,愿我们在学习安卓的道路上越走越远······

   下载源代码:http://download.csdn.net/detail/hou1620089770/8656693点击打开链接

MainActivity.java

package bzu.edu.hou;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Random;import bzu.edu.hou.adapter.ArticleAdapter;import bzu.edu.hou.adapter.Messages;import bzu.edu.hou.view.MyListView;import android.R.integer;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.content.res.TypedArray;import android.view.Menu;import android.view.Window;import android.widget.ArrayAdapter;import android.widget.BaseAdapter;import android.widget.LinearLayout;public class MainActivity extends Activity {private MyListView mylistview=null;private List<Messages> list_msg=null;private BaseAdapter adapter=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);init();if(list_msg==null){getData();}adapter=new ArticleAdapter(this,list_msg);mylistview.setOnRershListener(new OnRershListener());//设置监听器mylistview.setAdapter(adapter);}private void getData() {// TODO Auto-generated method stub//获得xml的资源String names[];String article[];TypedArray img;int i;names=getResources().getStringArray(R.array.name);article=getResources().getStringArray(R.array.article);img=getResources().obtainTypedArray(R.array.head_photo);list_msg=new ArrayList<Messages>();for(i=0;i<names.length;i++){Messages message=new Messages();message.setImg(img.getDrawable(i));message.setName(names[i]);message.setArticel(article[i]);message.setRq("人气:"+String.valueOf(new Random().nextInt(1000)));Date date=new Date();SimpleDateFormat simple=new SimpleDateFormat("MM-dd");message.setTime(simple.format(date));list_msg.add(message);}}private void init() {// TODO Auto-generated method stubmylistview=(MyListView)findViewById(R.id.myListView1);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}Handler handler=new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message arg0) {// TODO Auto-generated method stubif(arg0.what==0){//结束刷新mylistview.endOnRersh();}return false;}});//刷新接口实现类class OnRershListener implements OnRersh{    //实现刷新接口的 方法,,在MyList中会回调该方法。//模拟@Overridepublic void OnRershListener() {// TODO Auto-generated method stubnew Thread(new Run()).start();//启动一个线程}}//线程接口实现类class Run implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubtry {Thread.sleep(2000);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}handler.sendEmptyMessage(0);}}}


ArticleAdapter.java

package bzu.edu.hou.adapter;import java.util.List;import bzu.edu.hou.R;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;public class ArticleAdapter extends BaseAdapter {private List<Messages> list_mes=null;private Context context;public ArticleAdapter(Context context,List<Messages> list_mes) {// TODO Auto-generated constructor stubthis.list_mes=list_mes;this.context=context;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list_mes.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list_mes.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubListItem listitem;if(convertView==null){convertView=(LinearLayout)LayoutInflater.from(context).inflate(R.layout.list_layout, null);listitem=new ListItem();listitem.img=(ImageView)convertView.findViewById(R.id.head_img);listitem.name=(TextView)convertView.findViewById(R.id.name);listitem.time=(TextView)convertView.findViewById(R.id.time);listitem.rq=(TextView)convertView.findViewById(R.id.rq);listitem.article=(TextView)convertView.findViewById(R.id.article);convertView.setTag(listitem);}else {listitem=(ListItem)convertView.getTag();}listitem.img.setImageDrawable(list_mes.get(position).getImg());listitem.name.setText(list_mes.get(position).getName());listitem.time.setText(list_mes.get(position).getTime());listitem.rq.setText(list_mes.get(position).getRq());listitem.article.setText(list_mes.get(position).getArticel());return convertView;}public class ListItem{ImageView img;TextView name;TextView time;TextView rq;TextView article;}}


HeaderView.java

import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import bzu.edu.hou.R;import android.content.Context;import android.opengl.Visibility;import android.view.LayoutInflater;import android.view.View;import android.view.animation.RotateAnimation;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ProgressBar;import android.widget.TextView;public class HeaderView extends LinearLayout {private LinearLayout linear=null;//当前状态private int STATE=DOWN;//下拉状态public static final int DOWN=0;//上拉状态public static final int UP=1;//刷新状态public static final int UPDATA=2;//布局控件private TextView t1,t2=null;private ImageView img=null;private ProgressBar probar=null;//旋转动画对象private RotateAnimation rotate1,rotate2=null;public HeaderView(Context context) {super(context);// TODO Auto-generated constructor stub//初始化刷新头部initView(context);}private void initView(Context context) {// TODO Auto-generated method stub/* 1,加载header_view布局 2,初始化创建动画对象 * */linear=(LinearLayout)LayoutInflater.from(context).inflate(R.layout.header_view, null);//加载布局,第二个对象表示根视图,null表示此布局是根视图。LinearLayout.LayoutParams layoutparams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);this.addView(linear, layoutparams);//初始化布局控件t1=(TextView)linear.findViewById(R.id.text);t2=(TextView)linear.findViewById(R.id.text1);img=(ImageView)linear.findViewById(R.id.pull);probar=(ProgressBar)linear.findViewById(R.id.progress);//创建动画对象rotate1 = new RotateAnimation(0, -180, 1, 0.5f, 1, 0.5f);//中点逆时针旋转180度。rotate2 = new RotateAnimation(-180, 0, 1, 0.5f, 1, 0.5f);rotate1.setDuration(200);rotate2.setDuration(200);rotate1.setFillAfter(true);rotate2.setFillAfter(true);}/** * 设置view的高度 * */public void setHeaderViewHight(int height){if(height<0){height=0;}//获得HeaderView的布局设置LinearLayout.LayoutParams layp=(LayoutParams)linear.getLayoutParams();layp.height=height;//设置HeaderView的高度linear.setLayoutParams(layp);}public int getSTATE() {return STATE;}/** * 根据父容器MyListView的触摸位移 * 设置HeaderView的显示条的状态 * */public void setSTATE(int sTATE) {//显示条的3种状态/* * 1,下拉状态: * 显示img,隐藏进度条 * 判断上一个状态,如果是上拉则开始动画2,回到原始状态(触摸移动发生时,有向上移动)。 * 2,刷新状态 * 隐藏img,显示进度条 * 3,上拉状态 * 显示img,隐藏进度条 * 判断上一个状态,如果是下拉则开始动画1. * */switch (sTATE) {case DOWN://下拉状态t1.setText("下拉刷新");img.setVisibility(View.VISIBLE);probar.setVisibility(View.GONE);switch (STATE) {//某一时刻  开始动画。case DOWN:break;case UP:img.startAnimation(rotate2);//如果上一个状态是下拉,则返回原始break;}break;case UPDATA:t1.setText("正在刷新");img.clearAnimation();//清除动画img.setVisibility(View.GONE);probar.setVisibility(View.VISIBLE);switch (STATE) {case DOWN:break;case UPDATA:break;case UP:break;}break;case UP:t1.setText("松开刷新");img.setVisibility(View.VISIBLE);probar.setVisibility(View.GONE);switch (STATE) {case DOWN:img.startAnimation(rotate1);//如果上一个状态是旋转上拉动画,break;case UPDATA:break;case UP:break;}break;}STATE = sTATE;//设置当前的状态}/**获得header的高度*/public float getHeaderViewHight() {// TODO Auto-generated method stubreturn linear.getHeight();}public void setTime(){Date date=new Date();SimpleDateFormat simple=new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");String datatime=simple.format(date);t2.setText("刷新时间:"+datatime);}}


MyListView.java

package bzu.edu.hou.view;import bzu.edu.hou.OnRersh;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.ListView;public class MyListView extends ListView {private HeaderView head_view=null;//起始的y坐标private float pageY = 0f;//阻尼器private float DAMPER=1.25f;private OnRersh onRershListener=null;public MyListView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinitView(context);}private void initView(Context context) {// TODO Auto-generated method stubhead_view=new HeaderView(context);this.addHeaderView(head_view);}//触摸事件方法,发生屏幕按下、抬起、滑动,程序都回调该方法@Overridepublic boolean onTouchEvent(MotionEvent ev) {// TODO Auto-generated method stub/** 一,判断用户触发事件的三种状态 1,屏幕按下事件: 屏幕按下时,获得用户在屏幕的起始y坐标 2,屏幕移动事件: 屏幕移动时,动态的变化HeaderVeiw的状态 (1)获得移动的距离 (2)获得最终的y坐标 (3)首项item为HeaderView时,并且状态不是刷新, 则调用setHeaderViewHight()方法来设置高度,---设置状态 3,屏幕抬起事件: 屏幕抬起时:根据HeaderView当前显示条的状态判断是否刷新 (1)获得HeaderView的状态, 下拉时:不刷新 上拉时:刷新 刷新时: * */switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:pageY=ev.getY();break;case MotionEvent.ACTION_MOVE:float move=0;//移动的距离move=ev.getY()-pageY;pageY=ev.getY();if(head_view.getSTATE()!=HeaderView.UPDATA && getFirstVisiblePosition()==0 &&(move/DAMPER+head_view.getHeaderViewHight())>0){setHeaderViewHight(move/DAMPER);return true;}break;case MotionEvent.ACTION_UP:switch (head_view.getSTATE()) {case HeaderView.DOWN://下拉显示状态,不刷新,高度0setHeaderViewHight(-head_view.getHeaderViewHight());break;case HeaderView.UPDATA://刷新状态break;case HeaderView.UP://开始刷新setHeaderViewHight(75-head_view.getHeaderViewHight());//设置HeaderView的高为75head_view.setSTATE(HeaderView.UPDATA);head_view.setTime();//调用刷新接口if(onRershListener!=null){onRershListener.OnRershListener();}break;}break;}return super.onTouchEvent(ev);}/**设置HeaderView的高度,并根据滑动位移,设置其状态*/private void setHeaderViewHight(float f) {// TODO Auto-generated method stub//设置HeaderView的高度  并给HeaderView设置不同的状态。(不同的状态显示不同的header样式)/* *  1, 调用Headeview的方法设置其高度 2,判断Headeview的状态不是UPDATA 判断HeaderView的高度,来设置状态 (1)距离大于60---设置UP (2)否则大于0---设置Down */head_view.setHeaderViewHight((int)(f+head_view.getHeaderViewHight()));if(head_view.getSTATE()!=HeaderView.UPDATA){if(head_view.getHeaderViewHight()>75){head_view.setSTATE(HeaderView.UP);//上拉状态}else if(head_view.getHeaderViewHight()>0) {head_view.setSTATE(HeaderView.DOWN);}}}public void setOnRershListener(OnRersh onRershListener) {this.onRershListener = onRershListener;}/**结束刷新*/public void endOnRersh() {// TODO Auto-generated method stub//状态设置为Down(默认的初始状态),高度0head_view.setSTATE(HeaderView.DOWN);head_view.setHeaderViewHight(-(int)head_view.getHeaderViewHight());}}


MainActivity.java

package com.example.listviewproject;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic 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;}}


    现在还需要设置一个接口监听器

 

package bzu.edu.hou;public interface OnRersh {//刷新接口的监听器public void OnRershListener();}

 

建立一个实体类

package bzu.edu.hou.adapter;import android.graphics.drawable.Drawable;public class Messages {private Drawable img;private String name;private String time;private String rq;private String articel;public Drawable getImg() {return img;}public void setImg(Drawable img) {this.img = img;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public String getRq() {return rq;}public void setRq(String rq) {this.rq = rq;}public String getArticel() {return articel;}public void setArticel(String articel) {this.articel = articel;}}
0 0
原创粉丝点击