2013-10-26 49 views
0

刷新不能在Listview中工作;已经在si; ilar主题上查询了许多其他回复,但无法解决问题。刷新列表视图不能在对话框后工作

1 listview with order items +一个打开对话框来设置数量的按钮。 2数据库在对话框中用用户手动输入的数量进行更新;这样可行。 3从对话框返回到列表视图布局不刷新数据库的内容。 4当我点击主要活动的按钮来再次显示列表视图时,是的,然后显示数据库内容。

如何使其自动刷新。已尝试.notifyDataSetChanged()和.invalidate()未成功。

下面是代码: XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="80dp" 
     android:layout_height="80dp" 
     android:contentDescription="@string/image" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" /> 

    <CheckBox 
     android:id="@+id/chkImage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/chkImage" /> 

    <TextView 
     android:id="@+id/quantity" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/icon" 
     android:paddingBottom="2dp" 
     android:textColor="#CC0033" 
     android:textSize="28dp" /> 

    <TextView 
     android:id="@+id/desc" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/quantity" 
     android:paddingBottom="2dp" 
     android:textColor="#CC0033" 
     android:textSize="16dp" /> 
</RelativeLayout> 

这里是主要的活动

public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    currentOrderNumber = getCurrentOrderNumber(); 

    od_listview = (ListView) findViewById(R.id.list); 
    txtViewOrderCount=(TextView)findViewById(R.id.orderCount); 
    txtViewCatalogCount=(TextView)findViewById(R.id.catalogCount); 

    buildUpCurrentOrderList(); 
    addListenerOnButton(); 
    } 

    public void addListenerOnButton() { 
    button4 = (ImageButton) findViewById(R.id.button4); 
    button4.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View arg0) { 
      buildUpCurrentOrderList(); 
      } 
}); 
    private void buildUpCurrentOrderList() { 
     ListView listview = (ListView) findViewById(R.id.list); 
     S_DAO db = new S_DAO(this) ; 
     db.open(); 
     db.set_orderdetailChangedToN(this); 
     list.clear(); 

     List<OrderDetail> orderdetails = new ArrayList<OrderDetail>(); 
     orderdetails = db.getOrderDetailList(); 
     orderCount=orderdetails.size(); 
     final ArrayList<OrderDetail> orderdetailsReverse = new ArrayList<OrderDetail>(orderdetails); 
     Collections.reverse(orderdetailsReverse); 

     final CustomOrderViewAdapter adapter = new CustomOrderViewAdapter(this, 
      R.layout.scans_list, orderdetailsReverse); 

     listview.setAdapter(adapter); 

     txtViewOrderCount.setText(Integer.toString(orderCount)); 
     txtViewOrderCount.bringToFront(); 


    }  

这里是适配器代码:

public class CustomOrderViewAdapter extends ArrayAdapter<OrderDetail> { 

    Context context; 

    public CustomOrderViewAdapter(Context context, int resourceId, 
     List<OrderDetail> items) { 
    super(context, resourceId, items); 
     this.context = context; 
} 

/*private view holder class*/ 
private class ViewHolder { 

    ImageView imageView; 
    TextView txtBarcode; 
    TextView txtDesc; 
    TextView txtBrand; 
    TextView txtMeasure; 
    TextView txtWeightVol; 
    TextView txtPackItems; 
    TextView txtQuantity; 
    CheckBox chkImage; 
    ImageView icon; 
    ImageButton buttonMore; 
} 
public void updateOrderdetailList() { 
    this.notifyDataSetChanged(); 
} 

public View getView(int position, View convertView, final ViewGroup parent) { 
    ViewHolder viewholder = null; 
    final OrderDetail orderdetail = getItem(position); 
    final int pos = position; 

    LayoutInflater mInflater = (LayoutInflater) context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.scans_list, null); 
     viewholder = new ViewHolder(); 

     viewholder.txtBarcode = (TextView) convertView.findViewById(R.id.barcode); 
     viewholder.txtDesc = (TextView) convertView.findViewById(R.id.desc); 
     viewholder.txtBrand = (TextView) convertView.findViewById(R.id.brand); 
     viewholder.imageView = (ImageView) convertView.findViewById(R.id.icon); 
     viewholder.txtMeasure = (TextView) convertView.findViewById(R.id.measure); 
     viewholder.txtWeightVol = (TextView) convertView.findViewById(R.id.weightvol); 
     viewholder.txtPackItems = (TextView) convertView.findViewById(R.id.packitems); 
     viewholder.txtQuantity = (TextView) convertView.findViewById(R.id.quantity); 

     viewholder.chkImage = (CheckBox) convertView.findViewById(R.id.chkImage); 
     viewholder.icon = (ImageView) convertView.findViewById(R.id.icon); 
     viewholder.buttonMore = (ImageButton) convertView.findViewById(R.id.buttonMore); 

     convertView.setTag(viewholder); 
    } else 
     viewholder = (ViewHolder) convertView.getTag(); 

    viewholder.txtBarcode.setText(orderdetail.get_od_p_Barcode()); 
    S_DAO db = new S_DAO(context) ; 
    db.open(); 
    final String tmpBarcode=orderdetail.get_od_p_Barcode(); 
    final String tmpDesc = db.readProduct(context, tmpBarcode).get_p_DescLong(); 
    final int tmpPackItems =db.readProduct(context, tmpBarcode).get_p_PackItems(); 
    final int tmpWeightVol = db.readProduct(context, tmpBarcode).get_p_WeightVol(); 
    final int tmpQuantity=orderdetail.get_od_Quantity(); 

    viewholder.txtBrand.setText(db.readProduct(context, tmpBarcode).get_p_Brand()); 
    viewholder.txtDesc.setText(tmpDesc); 
    viewholder.txtMeasure.setText(db.readProduct(context, tmpBarcode).get_p_Measure()); 
    viewholder.txtWeightVol.setText(Integer.toString(tmpWeightVol)); 
    viewholder.txtPackItems.setText(Integer.toString(tmpPackItems)); 
    viewholder.txtQuantity.setText(Integer.toString(tmpQuantity)); 

    int imageResource = context.getResources().getIdentifier(db.readProduct(context, tmpBarcode).get_p_ImageName(), "drawable", context.getPackageName()); 

    db.close(); 

    viewholder.imageView.setImageResource(imageResource); 

    viewholder.buttonMore.setOnClickListener(new AdapterView.OnClickListener() { 
     public void onClick(View v) { 
      orderdetailDialog(orderdetail, tmpPackItems, tmpDesc, tmpQuantity, pos, v, parent); 


     } 
     }); 


    viewholder.icon.setOnClickListener(new AdapterView.OnClickListener() { 
     public void onClick(View v) { 

      setCyan(orderdetail, parent, pos, v); 
     } 
     }); 


    viewholder.chkImage.setOnClickListener(new AdapterView.OnClickListener() { 
     public void onClick(View v) { 
      setCyan(orderdetail, parent, pos, v); 
     } 
     }); 

    return convertView; 


} 
在同一个适配器类

:该类打开对话框

public void orderdetailDialog (final OrderDetail orderdetail, int itemsPerPack, String p_desc, int p_quantity, int pos, View v, ViewGroup parent) { 
    LayoutInflater factory = (LayoutInflater) context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    final View textEntryView = factory.inflate(R.layout.scans_more, null); 
    //text_entry is an Layout XML file containing two text field to display in alert dialog 
    final EditText inputQuantity = (EditText) textEntryView.findViewById(R.id.quantity); 
    final TextView inputItemsPerPack = (TextView) textEntryView.findViewById(R.id.itemsPerPack);    

    inputQuantity.setText(Integer.toString(p_quantity), TextView.BufferType.EDITABLE); 
    inputItemsPerPack.setText(Integer.toString(itemsPerPack), TextView.BufferType.EDITABLE); 

    final AlertDialog.Builder alert = new AlertDialog.Builder(context); 

    alert.setIcon(R.drawable.more2) 
      .setTitle(p_desc) 
      .setView(textEntryView) 
      .setPositiveButton("Save", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 

         updateOrderDetail(orderdetail, Integer.parseInt(inputQuantity.getText().toString())); 

        } 
       }) 
      .setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, 
         int whichButton) { 
        } 
       }); 
    alert.show(); 
} 

则该类对数据库进行更新:

private void updateOrderDetail (OrderDetail orderdetail, int quantity) { 

     S_DAO db = new S_DAO(context) ; 
     db.open(); 
     db.updateOrderDetailWithQuantity(context, orderdetail, quantity); 
     db.close(); 
} 

谢谢您的repsonses。

回答

0

您是否在任何地方调用invalidate()或postInvalidate()方法?您想刷新表格的那一刻就必须打电话给他们中的一个。

+0

不,我不知道。在哪里放? – user2923594

+0

无效,我试过但没有成功 – user2923594

+0

我猜想在onClick处理程序中你应该调用od_listview.invalidate(); – karvoynistas

1

您可以尝试拨打notifyDataSetChanged()UIThread?像那样

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
      notifyDataSetChanged(); 
    } 
} 

并将其称为您数据库更新的位置。

private void updateOrderDetail (OrderDetail orderdetail, int quantity) { 
     S_DAO db = new S_DAO(context) ; 
     db.open(); 
     List<OrderDetail> orderdetails = new ArrayList<OrderDetail>(); 
     db.updateOrderDetailWithQuantity(context, orderdetail, quantity); 
     orderdetails = db.getOrderDetailList(); 
     final ArrayList<OrderDetail> orderdetailsReverse = new ArrayList<OrderDetail>(orderdetails); 
     Collections.reverse(orderdetailsReverse); 
     clear(); 
     addAll(orderdetailsReverse); 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       notifyDataSetChanged(); 
      } 
     } 
     db.close(); 
    } 
+0

我添加它adaper内:但没有成功,私人无效buildUpCurrentOrderList(){ ... runOnUiThread(新的Runnable(){ \t @覆盖 \t公共无效的run(){ \t \t adapter.notifyDataSetChanged(); \t} \t}); } – user2923594

+0

不存在您应该添加此更新列表的位置,它是updateOrderDetail函数。 – yilmazburk

+0

您可以尝试我编辑的解决方案。 – yilmazburk