2016-02-10 4 views
-2

У меня есть задача сделать, в которой я должен показать данные из локальной базы данных в пользовательский listview, макет которого включает в себя 2 растровые и 2 текстовые данные.Бесконечный список прокрутки в android

Личные данные Я пробовал: "https://github.com/weixiao1984/Android-Infinite-Scroll-Listview".

Но у него так много, что меня смущает.

+0

почему вы используете библиотеку ListView – Madhur

+0

использования по умолчанию согу данных огромен, поэтому я хочу, чтобы реализовать бесконечную прокрутку ListView –

+1

lol это не имеет значения, используйте просмотр ресайклера или просмотр списка, он может обрабатывать большие данные или даже вы можете использовать разбиение на страницы с ним – Madhur

ответ

5

Попробуйте

MainActivity.java

package com.example.endlesslistview; 

import java.util.ArrayList; 
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AbsListView; 
import android.widget.ProgressBar; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.ListView; 


public class MainActivity extends Activity { 

    ListView lvTest; 
    int index=0; 
    ArrayList<ModelClass> model = new ArrayList<ModelClass>(); 
    AdapterClass adapter; 
    ProgressBar progressbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     progressbar = (ProgressBar) findViewById(R.id.progressbar); 
     lvTest = (ListView) findViewById(R.id.lvTest); 
     insertData(); 
     adapter = new AdapterClass(MainActivity.this, model); 
     lvTest.setAdapter(adapter); 

     lvTest.setOnScrollListener(new EndlessScrollListener()); 
    } 

    public void insertData(){ 
     for(int i=0;i<20;i++){ 
     model.add(new ModelClass("Data "+index, R.drawable.ic_launcher)); 
     index = index+1; 
     } 
    } 

    public void insertNewData(){ 
     for(int i=0;i<20;i++){ 
     model.add(new ModelClass("Data "+index, R.drawable.ic_launcher)); 
     index = index+1; 
     } 

     adapter.notifyDataSetChanged(); 
    } 


    public class EndlessScrollListener implements OnScrollListener { 

     private int visibleThreshold = 20; 
     private int currentPage = 0; 
     private int previousTotal = 0; 
     private boolean loading = true; 

     public EndlessScrollListener() { 
     } 
     public EndlessScrollListener(int visibleThreshold) { 
      this.visibleThreshold = visibleThreshold; 
     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
      if (loading) { 
       if (totalItemCount > previousTotal) { 
        loading = false; 
        previousTotal = totalItemCount; 
        currentPage++; 
       } 
      } 
      if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { 
       // I load the next page of gigs using a background task, 
       // but you can call any function here. 
       new ShowProgress().execute(); 
       loading = true; 
      } 
     } 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
     } 
    } 

    class ShowProgress extends AsyncTask<Void, Void, Void>{ 


     @Override 
     protected void onPreExecute() { 
      progressbar.setVisibility(View.VISIBLE); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      progressbar.setVisibility(View.GONE); 
      insertNewData(); 
     } 
    } 
} 

Activity_main.xml

<FrameLayout 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" 
    tools:context="com.example.endlesslistview.MainActivity" > 

    <ListView 
     android:id="@+id/lvTest" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
    </ListView> 

    <ProgressBar 
     android:id="@+id/progressbar" 
     style="?android:attr/progressBarStyle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:visibility="visible" /> 

</FrameLayout> 

AdapterClass.java

package com.example.endlesslistview; 
import java.util.ArrayList; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class AdapterClass extends BaseAdapter{ 
    Context context; 
     private static LayoutInflater inflater=null; 
     ArrayList<ModelClass> model; 

    public AdapterClass(MainActivity mainActivity, ArrayList<ModelClass> model) { 
     // TODO Auto-generated constructor stub 
     this.model = model; 
     context=mainActivity; 
     inflater = (LayoutInflater)context. 
       getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return model.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    public class Holder 
    { 
     TextView tv; 
     ImageView img; 
    } 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     Holder holder=new Holder(); 
     View rowView;  
      rowView = inflater.inflate(R.layout.row_layout, null); 
      holder.tv=(TextView) rowView.findViewById(R.id.textView1); 
      holder.img=(ImageView) rowView.findViewById(R.id.imageView1);  
     holder.tv.setText(model.get(position).getData()); 
     holder.img.setImageResource(model.get(position).getImage());   
     rowView.setOnClickListener(new OnClickListener() {    
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(context, "You Clicked "+model.get(position).getData(), Toast.LENGTH_LONG).show(); 
      } 
     }); 
     return rowView; 
    } 

} 

row_layout.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="match_parent" 
    android:orientation="horizontal" 
    android:layout_gravity="center_vertical" 
    android:gravity="center_vertical" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TextView" 
     android:layout_marginRight="10dp" /> 

</LinearLayout> 

ModelClass.java

package com.example.endlesslistview; 

public class ModelClass { 

    String data; 
    int image; 

    public ModelClass(String data, int image) { 
     this.data = data; 
     this.image = image; 
    } 
    public String getData() { 
     return data; 
    } 
    public void setData(String data) { 
     this.data = data; 
    } 
    public int getImage() { 
     return image; 
    } 
    public void setImage(int image) { 
     this.image = image; 
    } 



} 
+0

thnx man всего 1 проблема. как остановить просмотр списка из загрузки большего количества items.by, используя этот пример, все в порядке, но загрузка listview даже после того, как данные пустые. –

+0

Вы можете добавить условие . if (! Loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { // Загружаю следующую страницу концертов с помощью фоновой задачи, // но вы можете вызвать любую функцию здесь. \t \t (hasMoreDataAvailable) { новый ShowProgress(). Execute(); loading = true; } } –

Смежные вопросы