我有一个 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();
}
}
这对我来说非常脏,我遇到了一个问题:如果数据库发生变化并且适配器已更新,我可以收到订单已经启动但我不知道如何从活动中绘制它,我是新的使用自定义适配器,我对我应该做什么感到困惑,我可以直接在适配器中绘制已启动的订单,但这打破了我在活动中已经做过的逻辑(已发布的代码)因为我不知道活动订单开始(检查活动中一个项目的属性)。
对不起,如果问题难以理解或解释不清楚,我很难传达我的问题
答案 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();
然后列表将获得数据源中填写的所有新数据