ListView控件onScroll添加更多的商品 [英] ListView onScroll add more items

查看:196
本文介绍了ListView控件onScroll添加更多的商品的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

    private class getArticles extends AsyncTask<Void, Void, Void> {

    String url;

    getArticles(String paramUrl) {
        this.url = paramUrl;
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog = new ProgressDialog(App.this);
        mProgressDialog.setMessage("Učitavanje artikala...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {

        arraylist = new ArrayList<>();

        try {

            Document document = Jsoup.connect(url).get();
            Elements els = document.select("ul.category3 > li");

            for (Element el : els) {

                HashMap<String, String> map = new HashMap<>();

                Elements slika = el.select("div.category3-image > a > img");
                Elements naslov = el.select("div.category3-text > a.main-headline");
                Element datum_noformat = el.select("div.category3-text > div.headlines-info > ul.headlines-info > li").first();
                Element datum = datum_noformat.html(datum_noformat.html().replaceAll("Posted ", ""));
                Elements desc = el.select("div.category3-text > p");
                Elements link = el.select("div.category3-text > a.main-headline");
                Element br_kom = el.select("div.category3-text > div.headlines-info > ul.headlines-info > li.comments-icon").first();

                map.put("naslov", naslov.text());
                map.put("datum", datum.text());
                map.put("desc", desc.text());
                map.put("ikona", slika.attr("src"));
                map.put("link", link.attr("abs:href"));
                map.put("brkom", br_kom.text());
                arraylist.add(map);


            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        listview = (ListView) findViewById(R.id.listview);
        adapter = new ArtikliAdapter(App.this, arraylist);
        listview.setAdapter(adapter);
        mProgressDialog.dismiss();
    }

我搜索了很多codeS为onlistview滚动,但不知道如何实现它。问题是,当我打电话给我的AsyncTask,我有一个URL参数,
新getArticles(http://example.com).execute();

我想实现一个onscrolllistener,但它是这样的,我的参数通常被设置为: http://www.example.com/category/categoryname/ ,所以第二页是这样 http://www.example.com/category/categoryname/page/2/ ,第三个进入 HTTP ://www.example.com/category/categoryname/page/3/ 等。每个页面都已经得到了7个项目需要进行解析。

I want to implement an onscrolllistener, but it goes like this, my param is usually set to: http://www.example.com/category/categoryname/, so the second page goes like http://www.example.com/category/categoryname/page/2/, the third one goes http://www.example.com/category/categoryname/page/3/ and so on. Each page has got 7 items that need to be parsed.

我怎么能实现onscrolllistener,因为URL参数的?

How could I implement onscrolllistener, because of the url param?

先谢谢了。

推荐答案

在此的链接,我已经写了如下的解决方案来添加元素(每次30元,也就是页面大小= 30),以异步的ListView。

Base on this link, I have written following solution to add elements ( 30 elements at a time, i.e page size = 30) to listview asynchronously.

创建一个名为EndlessListView类,如下所示:

Create a class named EndlessListView as follows:

public class EndlessListView extends ListView implements OnScrollListener {

private View footer;
private boolean isLoading;
private EndlessListener listener;// listner
private EndlessAdapter endlessAdapter;// adapter.

private int maxNoOfElement;

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

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

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

public void setListener(EndlessListener listener) {
    this.listener = listener;
}

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

    if (getAdapter() == null)
        return;

    if (getAdapter().getCount() == 0 || getAdapter().getCount() <= 5)
        return;

    int l = visibleItemCount + firstVisibleItem;
    if (l >= totalItemCount && !isLoading) {
        // It is time to add new data. We call the listener
        Log.e("LOAD", "DATA");
        isLoading = true;
        listener.loadData();

    }
}

public void setMaxElemnt(int maxNoOfElement) {
    this.maxNoOfElement = maxNoOfElement;
}

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

public void setLoadingView(int resId) {
    LayoutInflater inflater = (LayoutInflater) super.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    footer = (View) inflater.inflate(resId, null);
    this.addFooterView(footer);
}

public void setAdapter(EndlessAdapter adapter) {
    super.setAdapter(adapter);
    this.endlessAdapter = adapter;

}

public void addNewData(List<Integer> data) {
    endlessAdapter.setData(data);
    endlessAdapter.notifyDataSetChanged();
    isLoading = false;
}

public static interface EndlessListener {
    public void loadData();

}

 }

在此之后,我们必须为它创建适配器,名为

After this we have to create the adapter for it,called

EndlessAdapter

EndlessAdapter

public class EndlessAdapter extends BaseAdapter {
private List<Integer> mIntegers;
private Context context;

public EndlessAdapter(Context context) {
    this.context = context;
}

public void setData(List<Integer> mIntegers) {
    this.mIntegers = mIntegers;
}

@Override
public int getCount() {
    if (mIntegers == null)
        return 0;
    return mIntegers.size();
}

@Override
public Integer getItem(int index) {

    if (mIntegers == null) {
        return null;
    } else {
        return mIntegers.get(index);
    }
}

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

class ViewHolder {
    TextView textView;
}

@Override
public View getView(int index, View view, ViewGroup viewGroup) {
    ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        view = ((LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(R.layout.rows, viewGroup, false);
        holder.textView = (TextView) view.findViewById(R.id.mtext);
        view.setTag(holder);

    } else {
        holder = (ViewHolder) view.getTag();
    }
    holder.textView.setText(getItem(index) + "");
    return view;
}

   }

现在在活动中,我们可以使用Endl​​essListView(以com.example.stackoverflow包)如下XML:

Now in xml of the activity we could use EndlessListView(in com.example.stackoverflow package) as follows :

<RelativeLayout 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" >

<com.example.stackoverflow.EndlessListView
    android:id="@+id/endlessListView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</RelativeLayout>

这一步之后,我们需要做以下在MainActivity变化

After this step we need to make following change in the MainActivity

    public class MainActivity extends Activity implements EndlessListener {
private EndlessAdapter adapter;
private EndlessListView endlessListView;
private List<Integer> data;
private int gStartIndex = 30;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    endlessListView = (EndlessListView) findViewById(R.id.endlessListView);
    adapter = new EndlessAdapter(this);
    data = new ArrayList<Integer>();

    endlessListView.setLoadingView(R.layout.footer);
    // endlessListView.showFooter();
    endlessListView.setListener(this);
    endlessListView.setAdapter(adapter);
    gStartIndex = 0;
    fillData(gStartIndex);
}

private void fillData(int startIndex) {

    new AsyncLoadData().execute(startIndex);

}

@Override
public void loadData() {

    fillData(gStartIndex);

}

private class AsyncLoadData extends AsyncTask<Integer, Integer, Void> {

    @Override
    protected Void doInBackground(Integer... params) {
        int gendIndex = params[0] + 30;
        gStartIndex = gendIndex;
        /***
         * Here you could add your n/w code. To simulate the n/w comm. i am
         * adding elements to list and making it sleep for few sec.
         * */
        for (int i = params[0]; i < gendIndex; i++) {
            publishProgress(i);

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

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        data.add(values[0]);
    }

    @Override
    protected void onPostExecute(Void result) {
        endlessListView.addNewData(data);
    }
}

    }

这篇关于ListView控件onScroll添加更多的商品的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆