English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1.Fügt das Lade mehr Layout hinzu
1_Initialisierungs- und Versteckter Code
wird im Konstruktor von RefreshListView aufgerufen
private void initFooterView(Context context) { View footerView = View.inflate(context, R.layout.refresh_listview_footer, null); //Versteckter Code footerView.measure(0, 0); int footerViewHeight = footerView.getMeasuredHeight(); footerView.setPadding(0, -footerViewHeight, 0, 0); this.addFooterView(footerView); }
2_layout_file_refresh_listview_footer.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="wrap_content" android:gravity="center" android:orientation="horizontal" > <ProgressBar android:layout_margin="5dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminateDrawable="@drawable/custom_progressbar" /> <TextView android:layout_marginLeft="10dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Lade mehr..." android:textColor="#ff0000" android:textSize="25sp" /> </LinearLayout>
2.Wenn Sie nach unten ziehen und bis zum Ende der Liste gelangen
/** * Seiten der Nachrichten-Registerkarte, die der Menüseite entsprechen * Insgesamt12Ein * @author Administrator * */ public class TabMenuDetailPager extends MenuDetailBasePager implements OnPageChangeListener { /** * Nachrichtenzentrum-Daten, die dem News-Menü-Tag entsprechen */ private NewCenterTag newCenterTag; ..................... /** * URL zum Laden weiterer Daten */ private String moreUrl; /** * Ob mehr Daten geladen werden */ protected boolean isLoadingMore = false; ................... @Override public View initView() { View view = View.inflate(mActivity, R.layout.tab_detail, null); //Fügen Sie View in das XUtils-Framework ein ViewUtils.inject(this, view); .......................... //Einstellen Sie den Abfrage-Abhörer für das Pull-Down-Refresh mListView.setOnRefreshListener(new OnRefreshListener() { @Override public void onPullDownRefresh() {}} isPullDownRefreshing = true; getDataFromNet(); } @Override public void onLoadingMore() { if(TextUtils.isEmpty(moreUrl)){ Toast.makeText(mActivity, "Es gibt keine mehr Daten", 1).show(); mListView.onRefreshFinish(false); } else { //Es gibt mehr Daten, und mehr Daten müssen geladen werden getMoreDataFromNet(); } } }); return view; } /** * Das Laden weiterer Daten */ protected void getMoreDataFromNet() { HttpUtils httpUtils = new HttpUtils(); httpUtils.send(HttpMethod.GET, moreUrl, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { System.out.println("Das Laden weiterer Daten war erfolgreich:");+responseInfo.result); mListView.onRefreshFinish(false); isLoadingMore = true; processData(responseInfo.result); } @Override public void onFailure(HttpException error, String msg) { mListView.onRefreshFinish(false); System.out.println("Das Laden weiterer Daten ist fehlgeschlagen:");+ msg); } }); } /** * Verarbeitung und Analyse von JSON-Daten * @param json */ protected void processData(String json) { TabDetailBean bean = parserJson(json); if(!isLoadingMore){ System.out.println(bean.data.news.get(0).title); topnews = bean.data.topnews; //ViewPager für die Anpassung eines Adapters TabDetailAdapter adapter = new TabDetailAdapter(); mViewPager.setAdapter(adapter); // 清除所有的View ll_point_group.removeAllViews(); for(int i=0;i<topnews.size();i++{ View point = new View(mActivity); LayoutParams params = new LayoutParams(5, 5); point.setBackgroundResource(R.drawable.tab_detail_point_bg); if(i!=0){ params.leftMargin = 10; } point.setEnabled(false); point.setLayoutParams(params); ll_point_group.addView(point); } previousPointPosition = 0; //设置默认的图片描述和指示点 mtv_title_description.setText(topnews.get(previousPointPosition).title); ll_point_group.getChildAt(previousPointPosition).setEnabled(true); //设置页面改变的监听 mViewPager.setOnPageChangeListener(this); //设置适配器和对应的数据 newsLists = bean.data.news; listViewAdapter = new ListViewAdapter(); mListView.setAdapter(listViewAdapter); // mListView.addHeaderView(v) ;//以一端的方式将一个视图添加到ListView中 } else { //取出列表新闻,加载到以前的集合中,刷新数据 isLoadingMore = false; List<News>moreDataNews = bean.data.news; newsLists.addAll(moreDataNews); listViewAdapter.notifyDataSetChanged();//Daten aktualisieren } } ................ /** * Verwenden Sie das Open-Source-Projekt Gson, um JSON zu parsen * @param json */ private TabDetailBean parserJson(String json) { Gson gson = new Gson(); TabDetailBean bean = gson.fromJson(json, TabDetailBean.class); moreUrl = bean.data.more; if(TextUtils.isEmpty(moreUrl)){ moreUrl = null; } else { moreUrl = ConstantUtils.server_url+moreUrl; } return bean; } @Override public void onPageScrollStateChanged(int arg0) { // TODO Automatisch-generierter Methodenstubs } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Automatisch-generierter Methodenstubs } ............... }
3.kompletter Code
package com.atguigu.refreshlistview; import android.content.Context; import android.util.AttributeSet; 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.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; /** * Funktion: Eigenständige Pull-to-Refresh-ListView */ public class RefreshListview extends ListView { /** * Pull-to-Refresh und obere Schlitzanzeige */ private LinearLayout headerView; /** * Nach unten ziehen und neu laden */ private View ll_pull_down_refresh; private ImageView iv_arrow; private ProgressBar pb_status; private TextView tv_status; private TextView tv_time; /** * Höhe des Abwärtsscrollen-Refresh-Controls */ private int pullDownRefreshHeight; /** * Dropdown-Aktualisierung */ public static final int PULL_DOWN_REFRESH = 0; /** * Freilassen zum Aktualisieren */ public static final int RELEASE_REFRESH = 1; /** * Wird aktualisiert */ public static final int REFRESHING = 2; /** * Aktuelle Status */ private int currentStatus = PULL_DOWN_REFRESH; private Animation upAnimation; private Animation downAnimation; /** * Anzeiger zum Laden mehrer Daten */ private View footerView; /** * Höhe des Ladezustandsanzeigers */ private int footerViewHeight; /** * Bereits mehr geladen */ private boolean isLoadMore = false; /** * Teil der oberen Schlitzanzeige */ private View topNewsView; /** * Listansicht auf der Y-Achse */ private int listViewOnScreenY = -1; public RefreshListview(Context context) { this(context, null); } public RefreshListview(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RefreshListview(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initHeaderView(context); initAnimation(); initFooterView(context); } private void initFooterView(Context context) { footerView = View.inflate(context, R.layout.refresh_footer, null); footerView.measure(0, 0); footerViewHeight = footerView.getMeasuredHeight(); footerView.setPadding(0, -footerViewHeight, 0, 0); //Footer zur ListView hinzufügen addFooterView(footerView); //beobachten Sie das Scrollen der ListView setOnScrollListener(new MyOnScrollListener()); } /** * hinzufügen eines oberen Karussells * @param topNewsView */ public void addTopNewsView(View topNewsView) { Wenn (topNewsView != null) { this.topNewsView = topNewsView; headerView.addView(topNewsView); } } class MyOnScrollListener implements OnScrollListener{ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //wenn sich der Scroll-Vorgang ruhig bewegt oder durch Inertia gerollt wird if(scrollState == OnScrollListener.SCROLL_STATE_IDLE || scrollState == OnScrollListener.SCROLL_STATE_FLING){ //und es ist der letzte sichtbare Eintrag if(getLastVisiblePosition()>=getCount())-1{ //1.Anzeigen des Lademores-Layouts footerView.setPadding(8,8,8,8); //2.Statusänderung isLoadMore = true; //3.Rückrufinterface if(mOnRefreshListener != null){ mOnRefreshListener.onLoadMore(); } } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } } private void initAnimation() { upAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); upAnimation.setDuration(500); upAnimation.setFillAfter(true); downAnimation = new RotateAnimation(-180, -360, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); downAnimation.setDuration(500); downAnimation.setFillAfter(true); } private void initHeaderView(Context context) { headerView = (LinearLayout) View.inflate(context, R.layout.refresh_header, null); //Nach unten ziehen und neu laden ll_pull_down_refresh = headerView.findViewById(R.id.ll_pull_down_refresh); iv_arrow = (ImageView) headerView.findViewById(R.id.iv_arrow); pb_status = (ProgressBar) headerView.findViewById(R.id.pb_status); tv_status = (TextView) headerView.findViewById(R.id.tv_status); tv_time = (TextView) headerView.findViewById(R.id.tv_time); //Messung ll_pull_down_refresh.measure(0, 0); pullDownRefreshHeight = ll_pull_down_refresh.getMeasuredHeight(); //Standardmäßig die nach unten ziehen, um neu zu laden, Kontrollelemente ausblenden // View.setPadding(0,-控件高,0,0);//vollständig versteckt //View.setPadding(0, 0, 0, 0);//vollständig angezeigt ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0); //Listview-Kopf hinzufügen addHeaderView(headerView); } private float startY = -1; @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: //1.Erste Koordinate aufzeichnen startY = ev.getY(); break; case MotionEvent.ACTION_MOVE: falls (startY == -1) { startY = ev.getY(); } //Prüfen, ob die obere Slideshow vollständig angezeigt wird, nur wenn vollständig angezeigt, gibt es einen nach unten ziehen, um neu zu laden boolean isDisplayTopNews = isDisplayTopNews(); falls (!isDisplayTopNews) { //Laden weiterer Elemente break; } //Wenn gerade aktualisiert wird, soll nicht noch einmal aktualisiert werden falls (currentStatus == REFRESHING) { break; } //2.Neue Koordinate erreichen float endY = ev.getY(); //3.Distanz des Scrollens aufzeichnen float distanceY = endY - startY; falls (distanceY > 0) {//Nach unten ziehen //int paddingTop = -Kontrollhöhe + distanceY; int paddingTop = (int) (-pullDownRefreshHeight + distanceY); falls (paddingTop < 0 && currentStatus != PULL_DOWN_REFRESH) { //Status der Dropdown-Aktualisierung currentStatus = PULL_DOWN_REFRESH; //Aktualisieren Sie den Status refreshViewState(); sonst wenn (paddingTop > 0 && currentStatus != RELEASE_REFRESH) { //Status des Loslassens currentStatus = RELEASE_REFRESH; //Aktualisieren Sie den Status refreshViewState(); } ll_pull_down_refresh.setPadding(0, paddingTop, 0, 0); //View.setPadding(0,paddingTop,0,0);//Dynamische Anzeige des Pull-Down-Refresh-Controls } break; case MotionEvent.ACTION_UP: startY = -1; Wenn (currentStatus == PULL_DOWN_REFRESH) { // View.setPadding(0,-控件高,0,0);//vollständig versteckt ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0); } else if (currentStatus == RELEASE_REFRESH) { //Setzen Sie den Status auf正在刷新 currentStatus = REFRESHING; refreshViewState(); // View.setPadding(0,0,0,0);//vollständig angezeigt ll_pull_down_refresh.setPadding(0, 0, 0, 0); //Rückrufinterface Wenn (mOnRefreshListener != null) { mOnRefreshListener.onPullDownRefresh(); } } break; } return super.onTouchEvent(ev); } /** * Prüfen, ob der obere Nachrichtenbanner vollständig angezeigt wird * Wenn die Y-Achsenkoordinate des ListView auf dem Bildschirm kleiner oder gleich der Y-Achsenkoordinate des oberen Nachrichtenbanners ist, wird der obere Nachrichtenbanner vollständig angezeigt * @return */ private boolean isDisplayTopNews() { Wenn (topNewsView != null) { //1.erhalten die Koordinaten des ListView auf dem Bildschirm int[] location = new int[2; Wenn (listViewOnScreenY === -1{ getLocationOnScreen(location); listViewOnScreenY = location[1; } //2.erhalten die Koordinaten des oberen Nachrichtenbanners auf dem Bildschirm topNewsView.getLocationOnScreen(location); int topNewsViewOnScreenY = location[1; // Wenn (listViewOnScreenY <= topNewsViewOnScreenY) { // return true; // } else { // return false; // } return listViewOnScreenY <= topNewsViewOnScreenY; } else { return true; } } private void refreshViewState() { switch (currentStatus) { case PULL_DOWN_REFRESH://Status der Dropdown-Aktualisierung iv_arrow.startAnimation(downAnimation); tv_status.setText("Dropdown-Aktualisierung...") break; case RELEASE_REFRESH://Status des Loslassens iv_arrow.startAnimation(upAnimation); tv_status.setText("Hand los aktualisieren...") break; case REFRESHING://Status der Aktualisierung tv_status.setText("Wird aktualisiert...") pb_status.setVisibility(VISIBLE); iv_arrow.clearAnimation(); iv_arrow.setVisibility(GONE); break; } } /** * Rufen Sie diese Methode zurück, wenn das Internet erfolgreich oder fehlgeschlagen ist * Wiederherstellung des Benutzerstatus * * @param sucess */ public void onRefreshFinish(boolean sucess) { if(isLoadMore){ //Laden weiterer Elemente isLoadMore = false; //Verbergen Sie das Layout zum Laden weiterer Elemente footerView.setPadding(0,-footerViewHeight,0,0); } else { //Dropdown-Aktualisierung tv_status.setText("Dropdown-Aktualisierung...") currentStatus = PULL_DOWN_REFRESH; iv_arrow.clearAnimation(); pb_status.setVisibility(GONE); iv_arrow.setVisibility(VISIBLE); //Verbergen Sie das Dropdown-Aktualisierungssteuerungselement ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0); if (sucess) { //Setzen Sie die neueste Aktualisierungszeit tv_time.setText("Letzte Aktualisierungszeit:") + getSystemTime()); } } } /** * Ermitteln Sie die aktuelle Zeit des Android-Betriebssystems * * @return */ private String getSystemTime() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return format.format(new Date()); } /** * Öffnen Sie das Gerät zum Refresh */ public interface OnRefreshListener { /** * Rufen Sie diese Methode auf, wenn nach unten gescrollt wird */ public void onPullDownRefresh(); /** Rufen Sie diese Methode auf, wenn mehr geladen wird */ public void onLoadMore(); } private OnRefreshListener mOnRefreshListener; /** * Setzen Sie den Refresh-Listener, der von außen gesetzt wird */ public void setOnRefreshListener(OnRefreshListener l) { this.mOnRefreshListener = l; } }
Wie oben erwähnt, habe ich den Android-Simulate-Silicon-News-下拉刷新介绍给大家。/Nach oben scrollen, um mehr zu laden, hoffentlich hilfreich. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht, ich werde mich so schnell wie möglich bei Ihnen melden. Ich möchte auch allen für ihre Unterstützung der呐喊教程网站 danken!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetnutzern freiwillig bereitgestellt und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt keine rechtlichen Verantwortlichkeiten. Wenn Sie Inhalte mit Urheberrechtsverletzungen finden, freuen wir uns über eine E-Mail an notice#w.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine Beschwerde einreichen, und fügen Sie relevante Beweise bei. Bei nachgewiesener Infringement wird die Website sofort die beanstandeten Inhalte löschen.)