English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android: imitation de la mise à jour de la liste déroulante de la nouvelle technologie de Silicon Valley/Chargement supplémentaire par glissement vers le bas

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.)

Vous pourriez aussi aimer