如何实现无休止的滚动列表视图

Adi*_*tya -1 android json android-listview endlessscroll

我正在创建一个应用程序,我在其中使用Json解析来解析数据.我已经实现了listview,在我的回复中我有totalpagecurrent page对象,

新用户将从第一页获取项目.当用户滚动列表视图时,列表会扩展下一页中的项目(以及下一页和下一页等)

这是我的回复 http://pastie.org/10259792

以下是我尝试过的代码:

HomeFragment

public class HomeFragment extends Fragment {
// Listview Adapter
        ListViewAdapter adapters;

            // Connection detector
            ConnectionDetector cd;

            // Alert dialog manager
            AlertDialogManager alert = new AlertDialogManager();

            // Progress Dialog
            private ProgressDialog pDialog;

            // Creating JSON Parser object
            JSONparserr jsonParser = new JSONparserr();

            ArrayList<HashMap<String, String>> WebsiteList;

            // albums JSONArray
            JSONArray data = null;
            String link_url;

            ArrayList<HashMap<String, String>> arrayTemplist;

            private AutoCompleteTextView inputSearch;

            private ListView lv;

            private static final String URL_ALBUMS = "";

            private static final String WEBSITE_MENU_ID ="Brand_name";

            private static final String TAG_MATCH="data";
            //private static final String TAG_NAME="Brand_name";
            private static final String TAG_PROFILE="id";
            private static final String TAG_CAST="Company";

public HomeFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_home, container, false);

    lv = (ListView)rootView.findViewById(R.id.listpehlu);


    cd = new ConnectionDetector(getActivity());


    WebsiteList = new ArrayList<HashMap<String, String>>();

 // Loading Albums JSON in Background Thread
 new LoadAlbums().execute();

    // get listview

    inputSearch = (AutoCompleteTextView)rootView.findViewById(R.id.autoCompleteTextViewhomefrag);

    inputSearch.addTextChangedListener(new TextWatcher() {


        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

            arrayTemplist= new ArrayList<HashMap<String,String>>();
            String searchString =inputSearch.getText().toString().toLowerCase();

            for (int i = 0; i < WebsiteList.size(); i++)
            {
                String currentString =WebsiteList.get(i).get(HomeFragment.this.WEBSITE_MENU_ID);
                if (currentString.toLowerCase().startsWith(searchString ))
                {
                    arrayTemplist.add(WebsiteList.get(i));
                }
            }

            for (int i = 0; i < arrayTemplist.size(); i++)
            {
                String currentstrin = arrayTemplist.get(i).get(HomeFragment.this.WEBSITE_MENU_ID);
                //Toast.makeText(getApplicationContext(), currentstrin, Toast.LENGTH_LONG).show();

            }
      SimpleAdapter adapters = new SimpleAdapter(getActivity(), arrayTemplist,R.layout.list_item_match, new String[] {WEBSITE_MENU_ID,TAG_CAST
            }, new int[] {
                    R.id.txtbrndnm,R.id.txtbrndcomp});
            lv.setAdapter(adapters);

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub                         
        }
    });


    lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int position,
                long arg3) {


            Selected_Product_Listing tf = new Selected_Product_Listing();
             Bundle bundle = new Bundle();
             bundle.putString("prducts_name", WebsiteList.get(position).get((WEBSITE_MENU_ID)));
            // bundle.putString("prducts_name", aList.get(position).get(INTEREST_ACCEPT_NAME));
             tf.setArguments(bundle);
              FragmentManager fm = getFragmentManager();
              FragmentTransaction ft = fm.beginTransaction();
              ft.replace(R.id.frame_container, tf);
              ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
              ft.addToBackStack(null);
              ft.commit();

            // Toast.makeText(getActivity(),"lets"+ WebsiteList.get(position).get(convertToBase64(convertToBase64(WEBSITE_MENU_ID))), Toast.LENGTH_LONG).show();

        }
    });   

    lv.setOnScrollListener(new OnScrollListener() {

        public void onScrollStateChanged(AbsListView view, int scrollState) {


        }

        public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

        if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0)
        {

        }
        }
        });



    return rootView;
}

public String convertToBase64(String text) {
    byte[] data = null;
    try {
        data = text.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return Base64.encodeToString(data, Base64.DEFAULT);
}

class LoadAlbums extends AsyncTask<String, String, String> {

    private JSONObject jsonObj;


    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Loading...");
        pDialog.setIndeterminate(true);
        pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress));

        pDialog.setCancelable(false);
        pDialog.show();
    }
    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        // getting JSON string from URL
        String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET",
                params);

        // Check your log cat for JSON reponse
        Log.d("Albums JSON: ", "> " + json);
        if (json != null) {
            try {
                jsonObj = new JSONObject(json);
                // Getting JSON Array node
                data = jsonObj.getJSONArray(TAG_MATCH);

                String totpage=jsonObj.getString("total_page");
                System.out.println("Total Page"+totpage);

                String curpage=jsonObj.getString("current_page");
                System.out.println("Total Page"+curpage);



                // looping through All Contacts
                for (int i = 0; i < data.length(); i++) {
                    JSONObject c = data.getJSONObject(i);
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(WEBSITE_MENU_ID,c.getString(WEBSITE_MENU_ID));
                 map.put(TAG_PROFILE, c.getString(TAG_PROFILE));
                    map.put(TAG_CAST, c.getString(TAG_CAST));

                    WebsiteList.add(map);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }
       return null;
    }


    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all albums
        pDialog.dismiss();
        // updating UI from Background Thread

                ListAdapter adapter = new SimpleAdapter(
                        getActivity(), WebsiteList,
                        R.layout.list_item_match, new String[] {WEBSITE_MENU_ID,TAG_CAST
                         }, new int[] {
                                R.id.txtbrndnm,R.id.txtbrndcomp});


               lv.setAdapter(adapter); 

            }


    }
Run Code Online (Sandbox Code Playgroud)

EndlessAdapter

 public class EndLessAdapter extends ArrayAdapter<String> {

private Context context;
private List<String> items;
private int layoutId;

public EndLessAdapter(Context context, List<String> items, int LayoutId) {
    super(context,LayoutId,items);
    this.context = context;
    this.items = items;
    this.layoutId = LayoutId;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if(convertView == null)
        convertView = ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(layoutId,parent,false);

    TextView tView = (TextView)convertView.findViewById(R.id.txt);
    tView.setText(items.get(position));

    return convertView;
}
 }
Run Code Online (Sandbox Code Playgroud)

EndlessLisView

public class EndlessListView extends ListView implements OnScrollListener {

private Context context;
private View footer;
private boolean isLoading;
private EndLessListener listener;

private BaseAdapter  adapter;

public EndlessListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);        
    this.setOnScrollListener(this);

    this.context = context;
}

public EndlessListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.setOnScrollListener(this);

    this.context = context;
}

public EndlessListView(Context context) {
    super(context);     
    this.setOnScrollListener(this);

    this.context = context;
}

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

}   

//  4
public void addNewData() {
    this.removeFooterView(footer);
   //       adapter.addAll(products);

    adapter.notifyDataSetChanged();
    isLoading = false;
}
public void setLoading()
{
    isLoading = false;
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {

    if(getAdapter() == null)
        return;

    if(getAdapter().getCount() == 0)
        return;

    int l = visibleItemCount + firstVisibleItem;
    System.out.println("List View Total Item Count = "+totalItemCount+" , l = "+l+", is_loading = "+isLoading);
    if(l >= totalItemCount && !isLoading){

        //  add footer layout
        this.addFooterView(footer);

        //  set progress boolean
        isLoading = true;
        System.out.println("$$$$$$$$$ call loaddata $$$$$$$$$$$");
        //  call interface method to load new data
        listener.loadData();
    }
}

//  Calling order from MainActivity
//  1
public void setLoadingView(int resId) {

    footer = ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(resId, null);      //      footer = (View)inflater.inflate(resId, null);
    this.addFooterView(footer);
    System.out.println("addfooter ====@@@@@@");
}   

//  2
public void setListener(EndLessListener listener) {
    this.listener = listener;
}   

//  3
public void setAdapter(BaseAdapter adapter) {       

    super.setAdapter(adapter);
    this.adapter = adapter;

    this.removeFooterView(footer);
}

public void removeFooter(){
    this.removeFooterView(footer);
}
Run Code Online (Sandbox Code Playgroud)

}

kul*_*ngh 8

您可以通过在github中使用以下库来实现此目的

https://github.com/nicolasjafelle/PagingListView

简单地创建您的PagingAdapter并将其添加到com.paging.listview.PagingListView.您必须实现新的Pagingable接口及其onLoadMoreItems()方法.例如:

listView.setHasMoreItems(true);
listView.setPagingableListener(new PagingListView.Pagingable() {
    @Override
    public void onLoadMoreItems() {
        if (pager < 3) {
            new CountryAsyncTask(false).execute();
        } else {
            listView.onFinishLoading(false, null);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用onFinishLoading(boolean hasMoreItems,List newItems)方法来更新列表.

listView.onFinishLoading(true, newItems);
Run Code Online (Sandbox Code Playgroud)

还记得在布局文件中使用此包:

<com.paging.listview.PagingListView
    android:id="@+id/paging_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)