日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

下拉刷新:继承listView控件

發(fā)布時(shí)間:2023/12/9 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 下拉刷新:继承listView控件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、首先初始化的時(shí)候給控件監(jiān)聽(tīng)OnScrollListener,其中onScroll的參數(shù)里得到第一個(gè)顯示的條目,當(dāng)?shù)谝粋€(gè)條目為0的時(shí)候就可以執(zhí)行下啦刷新了。第二覆寫的方法是

onScrollStateChanged就是滑動(dòng)狀態(tài)的監(jiān)聽(tīng),3種狀態(tài)都是常量:快速滑動(dòng),觸摸移動(dòng),閑置狀態(tài),當(dāng)為第二種時(shí)候調(diào)用getlastVisiableposition()得到顯示的最后一個(gè)條目,當(dāng)為總條目的個(gè)數(shù)-1時(shí)就可以上移加載更多沒(méi)在初始化的時(shí)候跟header一樣加上Foot。當(dāng)顯示最后一個(gè)的時(shí)候就顯示foot,并加載數(shù)據(jù)。

1下啦刷新時(shí)候,可以給listview加一個(gè)頭,為了開(kāi)始隱藏頭就必須知道頭的高度,調(diào)用setpadding方法,但是在定義控件時(shí)候不知道view的高度,手動(dòng)調(diào)用header.measure()方法測(cè)量高度時(shí)候出現(xiàn)異常,因?yàn)檫€沒(méi)有顯示是無(wú)法測(cè)量的(個(gè)人認(rèn)為,在看的較早的視頻里發(fā)現(xiàn)過(guò)定義時(shí)候測(cè)量的)。我們可以在主程序加載后立即來(lái)用measure和setpadding,隱藏listview的頭(本文是通過(guò)主程序獲得后在控件定義中處理的,如果主程序中實(shí)現(xiàn),則ontouchevent和OnScrollListener都得在主程序里實(shí)現(xiàn))。其他的接口之類跟上一篇類似,就不多說(shuō)了。同樣的方法也可以實(shí)現(xiàn):上劃到底部加載更多的條目。

注意:方法中簡(jiǎn)單的設(shè)計(jì)了觸摸移動(dòng),沒(méi)有監(jiān)聽(tīng)到如果開(kāi)始1看不見(jiàn),從頂部劃到底部到1出現(xiàn)然后刷新,其中沒(méi)有記下downY,因此最好的方法是給屏幕上設(shè)置3種狀態(tài):看不見(jiàn)1和最后一個(gè)item;看到1;看到最后一條的狀態(tài)。一旦看到1就記下為DownY,若看到最后一條則為UpY,其后下啦刷新和上啦加載更多都分三種狀態(tài),以下啦為例:下啦、拉到大于一半釋放刷新、拉到一定距離后上移。

2、其實(shí)每一個(gè)空間都是通過(guò)計(jì)算后才滑到屏幕上的,分別通過(guò)measure、onLayout()、ondraw三層,每個(gè)控件的大小都是由其父視圖和本身決定的,這里不多說(shuō)看下面幾篇文章:http://blog.csdn.net/fengye810130/article/details/9181531;http://blog.csdn.net/guolin_blog/article/details/16330267;http://blog.csdn.net/cauchyweierstrass/article/details/41317247

?下面是自定義的一個(gè)下拉刷新的操作:

?3給出code

xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.refresh.MainActivity$PlaceholderFragment" ><com.example.refresh.myListView.MyListViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/mylist"/></RelativeLayout>

  header的文件

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><ProgressBarandroid:id="@+id/progressBar1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="3dp" android:visibility="invisible"/><ImageViewandroid:id="@+id/arrow"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/common_listview_headview_red_arrow" android:layout_marginLeft="20dp"android:layout_marginTop="3dp"/><TextView android:id="@+id/tev1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_marginTop="15dp"android:text="下拉刷新"/><TextView android:id="@+id/tev2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/tev1"android:layout_centerHorizontal="true"/> </RelativeLayout>

  3控件定義:

package com.example.refresh.myListView;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;import com.example.refresh.R;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.rtp.RtpStream; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.AbsListView; import android.widget.ListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ProgressBar; import android.widget.TextView;public class MyListView extends ListView implements OnScrollListener {private Context context;private final static int UP_MOVE=2;private final static int PREPARE_FLASHING=1;private final static int DOWN_MOVE=0;public View header;private int firstCellIndex;private int headHignt=100;private LoadDatasListener loadDatasListener;public void setOnloadDatasListener(LoadDatasListener l){this.loadDatasListener=l;}public MyListView(Context context) {super(context);this.context=context;init();}public MyListView(Context context, AttributeSet attrs) {super(context, attrs);this.context=context;init();}public MyListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.context=context;init();}public void init(){addHeader(); // int h=header.getHeight();//測(cè)量出現(xiàn)異常 // System.out.println(h);setOnScrollListener(this);//監(jiān)聽(tīng)滑動(dòng)事件,時(shí)刻找到第一個(gè)顯示的控件,即onScroll的第二個(gè)參數(shù)。}int downY=0;int currentY=0;int dis=0;//記住上一次的移動(dòng)距離@Overridepublic boolean onTouchEvent(MotionEvent ev) {if(firstCellIndex==0){switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:downY=(int) ev.getY();ProgressBar bar2=(ProgressBar) header.findViewById(R.id.progressBar1);bar2.setVisibility(INVISIBLE);header.findViewById(R.id.arrow).setBackgroundResource(R.drawable.common_listview_headview_red_arrow);header.findViewById(R.id.arrow).setVisibility(VISIBLE);((TextView)header.findViewById(R.id.tev1)).setText("下啦刷新");break;case MotionEvent.ACTION_MOVE:currentY=(int) ev.getY();int dis2=currentY-downY;//pad值int dis3=currentY-downY;//實(shí)際disif(dis2>=headHignt){dis2=headHignt;((TextView)header.findViewById(R.id.tev1)).setText("釋放刷新");} // header.setPadding(0, -headHignt+dis, 0, 0);if(dis3>=dis)header.findViewById(R.id.arrow).setBackgroundResource(R.drawable.common_listview_headview_red_arrow);if(dis3<dis){//向上移動(dòng)時(shí)header.findViewById(R.id.arrow).setBackgroundResource(R.drawable.up);}dis=dis3;header.setPadding(0, dis2-headHignt, 0, 0);break;case MotionEvent.ACTION_UP:Calendar c = Calendar.getInstance();int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH)+1;//月是從0開(kāi)始的 int date = c.get(Calendar.DATE); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); String time="上次刷新:"+year+"-"+month+"-"+date+" "+hour+":"+minute;TextView t=(TextView) header.findViewById(R.id.tev2);t.setText(time);ProgressBar bar=(ProgressBar) header.findViewById(R.id.progressBar1);bar.setVisibility(View.VISIBLE);header.findViewById(R.id.arrow).setVisibility(INVISIBLE);((TextView)header.findViewById(R.id.tev1)).setText("正在刷新");if(dis>headHignt/2)header.setPadding(0, 0, 0, 0);else{header.setPadding(0, -headHignt, 0, 0);loadDatasListener.onloadData();}dis=0;break;default:break;}}return super.onTouchEvent(ev);}public void addHeader(){header=View.inflate(context, R.layout.header, null); // header.measure(0, 0);// System.out.println(this.getMeasuredHeight());addHeaderView(header);header.setPadding(0, -headHignt, 0, 0);}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// TODO Auto-generated method stub}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {firstCellIndex=firstVisibleItem;}}

  4控件接口:

package com.example.refresh.myListView;public interface LoadDatasListener {public void onloadData();}

  5 activity文件

public class MainActivity extends Activity {private MyListView list;private ArrayList<String> newsdata;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);list=(MyListView) findViewById(R.id.mylist);init();list.setAdapter(new MyListAdapter());list.measure(0, 0); // list.header.getMeasuredHeight();System.out.println(list.header.getMeasuredHeight());}class MyListAdapter extends BaseAdapter {@Overridepublic int getCount() {// TODO Auto-generated method stubreturn newsdata.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn newsdata.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView view=null;ViewHolder holder=null;if(convertView!=null){holder=(ViewHolder) convertView.getTag();view=holder.txview;}else {view=new TextView(MainActivity.this);holder=new ViewHolder();holder.txview=view;view.setTag(holder);}view.setText(newsdata.get(position));return view;}}static class ViewHolder {TextView txview;}public void init(){newsdata=new ArrayList<String>();for(int x=0;x<30;x++)newsdata.add("新聞條目:"+x);}}

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/bokeofzp/p/4769825.html

總結(jié)

以上是生活随笔為你收集整理的下拉刷新:继承listView控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。