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

Android: Imitation des Silicon Valley News-Abwurfs und der Neuladefunktion/Nach oben ziehen und mehr laden

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

Gefällt mir