Android 如何构建滚动时加载更多数据的listView

Android 如何构建滚动时加载更多数据的listView,android,listview,arraylist,Android,Listview,Arraylist,我有一张我的班级作业单的列表。此ArrayList用于填充ListView,但是,当我的SELECT返回非常大的结果时,我在填充ListView时遇到问题。好奇的人会根据我的需要加载信息。搜索时,我找到了一些使用setOnScrollListener事件的方法,但不清楚信息是如何上传到listView的。 我的疑问是: 如何加载信息?必须根据需要从服务器请求它们,或者我们填充整个ArrayList,然后再进行控制 在哪里可以找到满足我需要的简单教程 要填充我的listView,我使用以下代码

我有一张我的班级作业单的列表。此ArrayList用于填充ListView,但是,当我的SELECT返回非常大的结果时,我在填充ListView时遇到问题。好奇的人会根据我的需要加载信息。搜索时,我找到了一些使用setOnScrollListener事件的方法,但不清楚信息是如何上传到listView的。 我的疑问是:

  • 如何加载信息?必须根据需要从服务器请求它们,或者我们填充整个ArrayList,然后再进行控制

  • 在哪里可以找到满足我需要的简单教程

要填充我的listView,我使用以下代码:

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.pending_wos);
    new LoadPendingWorkOrders().execute();
    }

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

    @Override
    protected void onPreExecute() {

        progress = ProgressDialog.show(PendingWorkOrders.this,
                getResources().getString(R.string.Wait), getResources()
                        .getString(R.string.LoadingPendingWOs));
    }

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

        try {

            worker = Application.getInstance().getUser();

            WorkOrderQueries woQ = WorkOrderQueriesFactory
                    .createWorkOrderQueriesFactory();

            pendingWorkOrders = woQ
                    .selectPendingWorkOrders(asset, fromDate, workType,
                            workRequestType, workOrderState);

                for (WorkOrder w : pendingWorkOrders) {
                    if (w.getDataCompare() >= 0) {
                        w.setFlag(getResources().getDrawable(
                                R.drawable.green));
                    } else {
                        w.setFlag(getResources()
                                .getDrawable(R.drawable.red));
                    }
                }

        } catch (QueryException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        } catch (ParseException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        setListAdapter(new PendingWOArrayAdapter(getApplicationContext(),
                R.layout.pending_wos_list, pendingWorkOrders));

        ListView listView = getListView();
        listView.setTextFilterEnabled(true);

        if (progress != null)
            progress.dismiss();

    }
    }
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.pending_wos);
新建LoadPendingWorkOrders().execute();
}
私有类LoadPendingWorkOrders扩展异步任务{
@凌驾
受保护的void onPreExecute(){
progress=ProgressDialog.show(PendingWorkOrders.this,
getResources().getString(R.string.Wait),getResources()
.getString(R.string.LoadingPendingWOs));
}
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
worker=Application.getInstance().getUser();
WorkOrderQueries woQ=WorkOrderQueriesFactory
.createWorkOrderQueriesFactory();
待处理工单=woQ
.选择PendingWorkOrders(资产、起始日期、工作类型、,
workRequestType、workOrderState);
用于(工作订单w:挂起工作订单){
如果(w.getDataCompare()>=0){
w、 setFlag(getResources().getDrawable(
R.可拉深(绿色);
}否则{
w、 setFlag(getResources()
.getDrawable(R.drawable.red));
}
}
}捕获(查询异常e){
Log.e(“Error”,e.getMessage());
e、 printStackTrace();
}捕获(解析异常){
Log.e(“Error”,e.getMessage());
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
setListAdapter(新的PendingWOArrayAdapter(getApplicationContext()),
R.layout.pending_wos_list,pendingWorkOrders);
ListView ListView=getListView();
setTextFilterEnabled(true);
如果(进度!=null)
进步。解散();
}
}
这是我的适配器类:

public class PendingWOArrayAdapter extends ArrayAdapter<WorkOrder> {

private List<WorkOrder> workOrders = new ArrayList<WorkOrder>();

public PendingWOArrayAdapter(Context context, int textViewResourceId,
        List<WorkOrder> objects) {
    super(context, textViewResourceId, objects);
    this.workOrders = objects;
}

static class ViewHolder {
    protected ImageView flagIcon;
    protected TextView workOrderName;
    protected TextView workOrderState;
    protected TextView priority;
    protected TextView plannedDate;
    protected TextView asset;
    protected CheckBox chkDownloadWorkOrder;
}

public int getCount() {
    return this.workOrders.size();
}

public WorkOrder getItem(int index) {
    return this.workOrders.get(index);
}

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    WorkOrder pendingWO = getItem(position);

    if (row == null) {
        LayoutInflater inflater = (LayoutInflater) this.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.pending_wos_list, parent, false);

        final ViewHolder viewHolder = new ViewHolder();

        viewHolder.flagIcon = (ImageView) row.findViewById(R.id.flagIcon);
        viewHolder.workOrderName = (TextView) row
                .findViewById(R.id.TxtWorkOrder);
        viewHolder.workOrderState = (TextView) row
                .findViewById(R.id.TxtWorkOrderState);
        viewHolder.priority = (TextView) row.findViewById(R.id.TxtPriority);
        viewHolder.plannedDate = (TextView) row
                .findViewById(R.id.TxtPlannedDate);
        viewHolder.asset = (TextView) row.findViewById(R.id.TxtAsset);
        viewHolder.chkDownloadWorkOrder = (CheckBox) row
                .findViewById(R.id.ChkDownloadWorkOrder);

        viewHolder.chkDownloadWorkOrder
                .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        WorkOrder workOrder = (WorkOrder) viewHolder.chkDownloadWorkOrder
                                .getTag();
                        workOrder.setSelected(buttonView.isChecked());

                    }
                });

        row.setTag(viewHolder);
        viewHolder.chkDownloadWorkOrder.setTag(pendingWO);
    } else {
        ((ViewHolder) row.getTag()).chkDownloadWorkOrder.setTag(workOrders
                .get(position));
    }

    ViewHolder holder = (ViewHolder) row.getTag();
    holder.workOrderName.setText(pendingWO.toString());
    holder.workOrderState.setText("Estado OS: " + pendingWO.getWorkOrderState() + " - "
            + pendingWO.getWorkOrderStateName());
    holder.priority.setText("Prioridade: " + pendingWO.getPriority());
    holder.plannedDate.setText("Data Prevista: "
            + pendingWO.getPlannedDate());
    holder.asset.setText("Ativo: " + pendingWO.getAsset() + " - "
            + pendingWO.getAssetName());
    holder.flagIcon.setImageDrawable(pendingWO.getFlag());
    holder.chkDownloadWorkOrder.setChecked(pendingWO.isSelected());

    if (pendingWO.isChkVisible()) {
        holder.chkDownloadWorkOrder.setVisibility(View.VISIBLE);
    } else {
        holder.chkDownloadWorkOrder.setVisibility(View.GONE);
    }

    return row;
}
公共类PendingWOArrayAdapter扩展了ArrayAdapter{
private List workOrders=new ArrayList();
公共PendingWOArrayAdapter(上下文,int textViewResourceId,
列出对象){
超级(上下文、textViewResourceId、对象);
this.workOrders=对象;
}
静态类视窗夹{
受保护的图像视图标志图标;
受保护的文本视图workOrderName;
受保护的文本视图工作顺序状态;
受保护的文本视图优先级;
受保护的文本视图计划日期;
受保护的文本视图资产;
受保护复选框chkDownloadWorkOrder;
}
public int getCount(){
返回此.workOrders.size();
}
公共工单getItem(整数索引){
返回此.workOrders.get(索引);
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
待处理工单WO=getItem(位置);
if(行==null){
LayoutInflater充气器=(LayoutInflater)this.getContext()
.getSystemService(上下文布局\充气机\服务);
行=充气机。充气(R.layout.pending\u wos\u list,父级,false);
最终ViewHolder ViewHolder=新的ViewHolder();
viewHolder.flagIcon=(ImageView)row.findViewById(R.id.flagIcon);
viewHolder.workOrderName=(文本视图)行
.findViewById(R.id.TxtWorkOrder);
viewHolder.workOrderState=(文本视图)行
.findViewById(R.id.TxtWorkOrderState);
viewHolder.priority=(TextView)row.findViewById(R.id.TxtPriority);
viewHolder.plannedDate=(文本视图)行
.findViewById(R.id.TxtPlannedDate);
viewHolder.asset=(TextView)row.findViewById(R.id.TxtAsset);
viewHolder.chkDownloadWorkOrder=(复选框)行
.findViewById(R.id.ChkDownloadWorkOrder);
viewHolder.chkDownloadWorkOrder
.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,
布尔值(已检查){
WorkOrder WorkOrder=(WorkOrder)viewHolder.chkDownloadWorkOrder
.getTag();
workOrder.setSelected(buttonView.isChecked());
}
});
row.setTag(viewHolder);
viewHolder.chkDownloadWorkOrder.setTag(pendingWO);
}否则{
((ViewHolder)row.getTag()).chkDownloadWorkOrder.setTag(workOrders
.获得(职位);
}
ViewHolder=(ViewHolder)row.getTag();
holder.workOrderName.setText(pendingWO.toString());
holder.workOrderState.setText(“Estado操作系统:+pendingWO.getWorkOrderState()+”-“
+pendingWO.getWorkOrderStateName());
holder.priority.setText(“Prioridade:+pendingWO.getPriority());
holder.plannedDate.setText(“数据前置:
+pendingWO.getPlannedDate());
holder.asset.setText(“Ativo:+pendingWO.getAsset()+”-“
+pendingWO.getAssetName());
holder.flagIcon.setImageDrawable(pendingWO.getFlag());
holder.chkDownloadWorkOrder.setChecked(pendingWO.isSelected());
if(pendingWO.isChkVisible()){
holder.chkDownloadWorkOrder.setVisibility(视图V