收到DB数据或按下按钮时如何更新UI(ListView)

时间:2016-07-28 12:29:33

标签: android listview user-interface android-arrayadapter

我有一个 ListView代表一个订单列表,还有一个listAdapter,用于将收到的数据从DB设置为listView,我想动态地执行:

  • 如果未选择或启动项目,则绘制白色
  • 如果选择了项目(但未启动),则
  • 绘制绿色
  • 如果启动了选择的项目(按下按钮),则
  • 绘制橙色
  • 如果按下完成按钮则删除项目

*(带涂料我是指项目的setBackground颜色)

**(订单有一个属性“状态”,以了解它们是否已启动)

目前我只在按下按钮时这样做,我还想在收到订单时更新UI并重新绘制项目,如果一个订单开始画它

OrdersActivity的一些代码:

private void updateOrders() {
        if (!listItemIsSelected) {
            orderAdapter.clear();
            orderAdapter.notifyDataSetChanged();
            populateListView();
        } else {
            debugLog("item is selected, list not updated");
        }
    }

    private void populateListView() {
        try {
            // Read items from server
            Log.d("LSO", "Reading from Database");
            ListObtainer listObtainer = new ListObtainer(this);
            listObtainer.getTmOfsDTOList(user, orderAdapter); // this method returns list of objects from DB and populates adapter
        } catch (Exception e) {
            e.printStackTrace();
        }
        configureAdapter();
    }

    private void configureAdapter() {

    // Configure listview
    listView = (ListView) findViewById(R.id.lvOrdenes);
    listView.setAdapter(orderAdapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            try {
                OrderRO orderRO = (OrderRO) parent.getItemAtPosition(position);
                listItemIsSelected = true;
                lastChildSelected = currentChildSelected;
                currentChildSelected = (View) listView.getChildAt(position);
                uptadteUI();

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
}
private void uptadteUI() {

    try {

        if (lastChildSelected != null) {
            lastChildSelected.setBackgroundColor(getResources().getColor(R.color.transparent));
        }
        if (orderIsStarted) {  // Block scroll, disable start, paint item
            disableIniciarOrden();
            disableBotonSalir();
            enableTerinarOrden();
            currentChildSelected.setBackgroundColor(getResources().getColor(R.color.light_orange));
            listView.setEnabled(false);
        } else {// if there is no started order
            listView.setEnabled(true);
            enableBotonSalir();
            disableTerminarOrden();
            if (listItemIsSelected) {  // enable start, paint item
                enableIniciarOrden();
                currentChildSelected.setBackgroundColor(getResources().getColor(R.color.light_green));
            }
        }
    } catch (Exception e) {
        Log.e("error", "error updating UI" + e);
    }
}

   public class UpdateOrdersAsync extends AsyncTask {
        @Override
        protected Object doInBackground(Object[] params) {
            while (updateService == true) {
                try {
                    Thread.sleep(180000);

                } catch (InterruptedException e) {
                    e.printStackTrace();

                }
                publishProgress();

            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Object[] values) {
            //super.onProgressUpdate(values);
            debugLog(". . . calling list update");
            updateOrders();
        }
    }

这对我来说非常,我遇到了一个问题:如果数据库发生变化并且适配器已更新,我可以收到订单已经启动但我不知道如何从活动中绘制它,我是新的使用自定义适配器,我对我应该做什么感到困惑,我可以直接在适配器中绘制已启动的订单,但这打破了我在活动中已经做过的逻辑(已发布的代码)因为我不知道活动订单开始(检查活动中一个项目的属性)。

对不起,如果问题难以理解或解释不清楚,我很难传达我的问题

4 个答案:

答案 0 :(得分:1)

因此,您希望在收到更多信息时更新ListView上的项目列表,对吗? 我稍微修改了你的代码以增强可读性。

假设您有一个包含以下项目的列表:

List<Items> listItems = new List<Items>;
listItems.add(item1);
listItems.add(item2);
listItems.add(item3);

与适配器相关联。然后,您只需将适配器与listView相关联,如:

ArrayAdapter<String> orderAdapter = new ArrayAdapter<String>(this,android.R.layout.listem_item, listItems);
listView.setAdapter(orderAdapter);

现在你拥有了所有物品。让我们说这些项目改变如下:

listItems.remove(item1); // you remove item1
listItems.add(item4); // and you add item4

现在您要通知适配器您已更改基础数据 你可以这样做:

listView.getAdapter().notifyDataSetChanged();

我强烈建议您将背景颜色与行的模型实例相关联,而不是将其关联。这样,如果重新绘制视图,信息仍然是存储在模型中。

public class OrderRo
    ...
    String color = "red";
    boolean isOrderStarted = false;
    ...

    ...
    public boolean isOrderStarted(){
        return isOrderStarted;
    }

    public void setIsOrderStarted(boolean isOrderStarted){
        this.isOrderStarted = isOrderStarted;
    }

    public String getColor(){
        return this.color;
    }

    public void setColor(String color){
        this.color = color;
    }
    ....

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            try {
                OrderRO orderRO = listView.getAdapter().getItem(position);
                orderRO.setColor("orange");
                orderRO.setIsOrderStarted(true);
                uptadteUI(orderRO, (View) listView.getChildAt(position));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
private void uptadteUI(OrderRO order, View selectChild) {
    try {
        if (selectChild != null) {
            selectChild.setBackgroundColor(getResources().getColor(R.color.transparent));
        }
        if (order.isOrderStarted()) {  // Block scroll, disable start, paint item
            disableIniciarOrden();
            disableBotonSalir();
            enableTerminarOrden();
            selectChild.setBackgroundColor(getResources().getColor(R.color.light_orange));
            listView.setEnabled(false);
        } else {// if there is no started order
            listView.setEnabled(true);
            enableBotonSalir();
            disableTerminarOrden();
            if (listItemIsSelected) {  // enable start, paint item
                enableIniciarOrden();
                selectChild.setBackgroundColor(getResources().getColor(R.color.light_green));
            }
        }
    } catch (Exception e) {
        Log.e("error", "error updating UI" + e);
    }
}

答案 1 :(得分:0)

我认为你应该在你的OrderRO类中保持状态。当状态改变时,调用notifyDataSetChanged.In getView方法,根据OrderRO中的状态绘制不同颜色的视图。

答案 2 :(得分:0)

将状态属性添加到OrderRO类,如启动,按下等。在适配器中,通过膨胀listview项检查此状态并设置视图颜色。在onItemClick方法更改项目状态并致电adapter.notifyDataSetChanged()

答案 3 :(得分:0)

首先,您必须填充ListView从中获取数据的数据源,然后调用该方法:

listView.getAdapter().notifyDataSetChanged();

然后列表将获得数据源中填写的所有新数据