English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1.Add loading more layout
1_Initialization and hidden code
Called in the RefreshListView constructor
private void initFooterView(Context context) { View footerView = View.inflate(context, R.layout.refresh_listview_footer, null); //Code hidden 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="Chargement des données supplémentaires..." android:textColor="#ff0000" android:textSize="25sp" /> </LinearLayout>
2lorsque vous faites glisser jusqu'au bas
/** * La page des onglets des nouvelles correspondante à la page du menu * Il y a au total12un * @author Administrator * */ public class TabMenuDetailPager extends MenuDetailBasePager implements OnPageChangeListener { /** * Centre des nouvelles-Les données correspondantes à l'étiquette du menu des nouvelles */ private NewCenterTag newCenterTag; ..................... /** * L'URL de chargement des données supplémentaires */ private String moreUrl; /** * Est-ce que les données supplémentaires sont en cours de chargement */ protected boolean isLoadingMore = false; ................... @Override public View initView() { View view = View.inflate(mActivity, R.layout.tab_detail, null); //Injeter View dans le cadre XUtils ViewUtils.inject(this, view); .......................... //Configurer l'écouteur de rafraîchissement descendant mListView.setOnRefreshListener(new OnRefreshListener() { @Override public void onPullDownRefresh() {}} isPullDownRefreshing = true; getDataFromNet(); } @Override public void onLoadingMore() { if(TextUtils.isEmpty(moreUrl)){ Toast.makeText(mActivity, "Il n'y a plus de données", 1).show(); mListView.onRefreshFinish(false); }else{ //Il y a plus de données, il faut charger plus de données getMoreDataFromNet(); } } }); return view; } /** * Charger plus de données */ 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("Succès du chargement de plus de données : ");+responseInfo.result); mListView.onRefreshFinish(false); isLoadingMore = true; processData(responseInfo.result); } @Override public void onFailure(HttpException error, String msg) { mListView.onRefreshFinish(false); System.out.println("Échec du chargement de plus de données : ");+ msg); } }); } /** * Traiter et analyser les données JSON * @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; //Configurer le ViewPager avec l'adaptateur TabDetailAdapter adapter = new TabDetailAdapter(); mViewPager.setAdapter(adapter); // Clear all Views 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; //Set the default image description and indicator point mtv_title_description.setText(topnews.get(previousPointPosition).title); ll_point_group.getChildAt(previousPointPosition).setEnabled(true); //Set the listener for page changes mViewPager.setOnPageChangeListener(this); //Set the adapter and corresponding data newsLists = bean.data.news; listViewAdapter = new ListViewAdapter(); mListView.setAdapter(listViewAdapter); // mListView.addHeaderView(v) ;//Add a view in the form of a head to the ListView }else{ //Extract the list of news, load it into the previous collection, and refresh the data isLoadingMore = false; List<News>moreDataNews = bean.data.news; newsLists.addAll(moreDataNews); listViewAdapter.notifyDataSetChanged();//Refresh data } } ................ /** * Parsing json using the Gson open-source project * @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 Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } ............... }
3.complete 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; /** * Fonction : ListView personnalisé pour le rafraîchissement en descendant */ public class RefreshListview extends ListView { /** * Rafraîchissement en descendant et roue publicitaire en haut */ private LinearLayout headerView; /** * Contrôle de rafraîchissement en descendant */ private View ll_pull_down_refresh; private ImageView iv_arrow; private ProgressBar pb_status; private TextView tv_status; private TextView tv_time; /** * Hauteur du contrôle de rafraîchissement en descendant */ private int pullDownRefreshHeight; /** * Rafraîchissement en descendant */ public static final int PULL_DOWN_REFRESH = 0; /** * Rafraîchissement après relâchement */ public static final int RELEASE_REFRESH = 1; /** * En train de rafraîchir */ public static final int REFRESHING = 2; /** * Statut actuel */ private int currentStatus = PULL_DOWN_REFRESH; private Animation upAnimation; private Animation downAnimation; /** * Contrôle de chargement supplémentaire */ private View footerView; /** * Hauteur du contrôle de chargement supplémentaire */ private int footerViewHeight; /** * Est-ce que plus de données ont été chargées? */ private boolean isLoadMore = false; /** * Partie de la roue publicitaire en haut */ private View topNewsView; /** * Coordonnées en Y de la ListView */ 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); //ajouter le footer à ListView addFooterView(footerView); //écouter le défilement de ListView setOnScrollListener(new MyOnScrollListener()); } /** * ajouter le carrousel en haut * @param topNewsView */ public void addTopNewsView(View topNewsView) { si (topNewsView != null) { this.topNewsView =topNewsView; headerView.addView(topNewsView); } } class MyOnScrollListener implements OnScrollListener{ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //lorsque le défilement est statique ou par inertie if(scrollState ==OnScrollListener.SCROLL_STATE_IDLE||scrollState ==OnScrollListener.SCROLL_STATE_FLING){ //et ce soit la dernière ligne visible if(getLastVisiblePosition()>=getCount())-1{ //1.afficher le layout de chargement supplémentaire footerView.setPadding(8,8,8,8); //2.changement d'état isLoadMore = true; //3.interface de rappel 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); //Contrôle de rafraîchissement en descendant 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); //mesure ll_pull_down_refresh.measure(0, 0); pullDownRefreshHeight = ll_pull_down_refresh.getMeasuredHeight(); //cacher par défaut le contrôle de rafraîchissement en bas // View.setPadding(0,-控件高,0,0);//complètement caché //View.setPadding(0, 0, 0, 0);//complètement visible ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0); //ajouter l'en-tête de ListView ajouterHeaderView(headerView); } private float startY = -1; @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { cas MotionEvent.ACTION_DOWN: //1.enregistrer la coordonnée de départ startY = ev.getY(); break; cas MotionEvent.ACTION_MOVE: si (startY == -1) { startY = ev.getY(); } //jugez si le carrousel en haut de l'écran est complètement affiché, il n'y a que lorsqu'il est complètement affiché que le rafraîchissement en bas peut être effectué boolean isDisplayTopNews = isDisplayTopNews(); si (!isDisplayTopNews) { //Charger plus break; } //Si il est en train de rafraîchir, il ne permet pas de rafraîchir à nouveau si (currentStatus == REFRESHING) { break; } //2.arriver à la nouvelle coordonnée float endY = ev.getY(); //3.enregistrer la distance glissée float distanceY = endY - startY; si (distanceY > 0) {//déroulement en bas //int paddingTop = -hauteur du contrôle + distanceY; int paddingTop = (int) (-pullDownRefreshHeight + distanceY); si (paddingTop < 0 et currentStatus != PULL_DOWN_REFRESH) { //États de rafraîchissement en descendant currentStatus = PULL_DOWN_REFRESH; //mise à jour de l'état refreshViewState(); sinon si (paddingTop > 0 et currentStatus != RELEASE_REFRESH) { //États de rafraîchissement après relâchement currentStatus = RELEASE_REFRESH; //mise à jour de l'état refreshViewState(); } ll_pull_down_refresh.setPadding(0, paddingTop, 0, 0); //View.setPadding(0, paddingTop, 0, 0);//affichage dynamique du contrôle de mise à jour de glisser vers le bas } break; case MotionEvent.ACTION_UP: startY = -1; si (currentStatus == PULL_DOWN_REFRESH) { // View.setPadding(0,-控件高,0,0);//complètement caché ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0); } else if (currentStatus == RELEASE_REFRESH) { //définir l'état en cours de mise à jour currentStatus = REFRESHING; refreshViewState(); // View.setPadding(0,0,0,0);//complètement visible ll_pull_down_refresh.setPadding(0, 0, 0, 0); //interface de rappel si (mOnRefreshListener != null) { mOnRefreshListener.onPullDownRefresh(); } } break; } return super.onTouchEvent(ev); } /** * jugez si la bannière en haut de l'écran est complètement visible * lorsque la coordonnée Y de la liste sur l'écran est inférieure ou égale à la coordonnée Y de la bannière en haut de l'écran, la bannière en haut de l'écran est complètement visible * @return */ private boolean isDisplayTopNews() { si (topNewsView != null) { //1.obtenir les coordonnées de la liste en haut de l'écran int[] location = new int[2; si (listViewOnScreenY === -1{ getLocationOnScreen(location); listViewOnScreenY = location[1; } //2.obtenir les coordonnées de la bannière en haut de l'écran topNewsView.getLocationOnScreen(location); int topNewsViewOnScreenY = location[1; // si (listViewOnScreenY <= topNewsViewOnScreenY) { // return true; // }else{ // return false; // } return listViewOnScreenY <= topNewsViewOnScreenY; }else{ return true; } } private void refreshViewState() { switch (currentStatus) { case PULL_DOWN_REFRESH://États de rafraîchissement en descendant iv_arrow.startAnimation(downAnimation); tv_status.setText("Rafraîchissement en descendant..."); break; case RELEASE_REFRESH://États de rafraîchissement après relâchement iv_arrow.startAnimation(upAnimation); tv_status.setText("Relâcher pour rafraîchir..."); break; case REFRESHING://États de rafraîchissement en cours tv_status.setText("En train de rafraîchir..."); pb_status.setVisibility(VISIBLE); iv_arrow.clearAnimation(); iv_arrow.setVisibility(GONE); break; } } /** * Appel de cette méthode lors du succès ou de l'échec de la connexion réseau * Restauration de l'état utilisateur après rafraîchissement * * @param sucess */ public void onRefreshFinish(boolean sucess) { if(isLoadMore){ //Charger plus isLoadMore = false; //Cacher le布局 de chargement supplémentaire footerView.setPadding(0,-footerViewHeight,0,0); }else{ //Rafraîchissement en descendant tv_status.setText("Rafraîchissement en descendant..."); currentStatus = PULL_DOWN_REFRESH; iv_arrow.clearAnimation(); pb_status.setVisibility(GONE); iv_arrow.setVisibility(VISIBLE); //Cacher le contrôle de rafraîchissement en descendant ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0); if (sucess) { //Définir le temps de mise à jour le plus récent tv_time.setText("Dernière mise à jour : "); + getSystemTime()); } } } /** * Obtenir l'heure actuelle du système Android * * @return */ private String getSystemTime() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss); return format.format(new Date()); } /** * Écouter les mises à jour du contrôle */ public interface OnRefreshListener { /** * Retourner cette méthode lorsque le défilement vers le bas est nécessaire */ public void onPullDownRefresh(); /** Retourner cette méthode lorsque plus de chargement est nécessaire */ public void onLoadMore(); } private OnRefreshListener mOnRefreshListener; /** * Définir l'écouteur de mise à jour, configuré par l'extérieur */ public void setOnRefreshListener(OnRefreshListener l) { this.mOnRefreshListener = l; } }
Ce que j'ai décrit ci-dessus est le défilement vers le bas imitation de la nouvelle de Silicon Valley que j'ai présenté aux amis./Défilement vers le bas pour charger plus, j'espère que cela vous aidera. Si vous avez des questions, laissez-moi un message, l'éditeur répondra à temps. Je tiens également à remercier tous ceux qui soutiennent le site de tutoriels d'alarme !
Déclaration : le contenu de cet article est issu d'Internet, propriété des auteurs respectifs, partagé par les utilisateurs d'Internet de manière volontaire et téléversé. Ce site ne détient pas de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique. Si vous trouvez du contenu présumé de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu présumé de violation de droits d'auteur.)