我是Android开发的新手。我正在开发一个读取条形码的简单应用程序。我对适配器和片段有一点问题。
我有一个适配器类和一个片段类。在适配器中,我使用ViewHolder类,但无法使用检查条形码是否已扫描并将该项目(如果条形码有效)添加到另一个列表中的函数。
我的适配器类具有以下代码:
private Context context;
List<ProdottiList> mItems;
public static int mCaller;
public static int IDDocumento;
public static TBLSOGGETTI mSoggetto;
public static int mAvanzamentoDoc;
public static int AdapterMode = MethodsProducts.kAdapterModeList;
public static ProductsAdapter savedAdapter;
private static ListView mListView;
public static int IDProdotto = 0;
public static int myPosition = 0;
public static ViewHolder holder;
public static List<OmaggiList> list1;
public static View mProductView;
public static View finalMProductView1;
public static DocumentiRigheList row;
public ProductsAdapter(Context context, int listview_products_item, List<ProdottiList> listProdottiFiltered, int itemMenuCatalog, int textViewResourceId) {
super(context, textViewResourceId);
}
public ProductsAdapter(Context context, int resource, List<ProdottiList> items, int caller, int idDocumento, TBLSOGGETTI soggetto, int AvanzamentoDoc, ListView listView) {
super(context, resource, items);
this.mItems = items;
this.context = context;
this.mCaller = caller;
this.IDDocumento = idDocumento;
this.mSoggetto = soggetto;
this.mAvanzamentoDoc = AvanzamentoDoc;
this.mListView = listView;
}
public static void saveAdapter(ProductsAdapter item)
{
savedAdapter = item;
}
public static class ViewHolder {
public TextView txtNome;
public TextView txtQuantita;
public TextView txtTotale;
public Button btnAggiungiUnitaQuantita;
public Button btnRimuoviUnitaQuantita;
public ImageButton imgCarello;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final MySQLiteManager db = new MySQLiteManager(context);
mProductView = convertView;
if (mProductView == null) {
if (mAvanzamentoDoc == DocumentsFragment.StatoDocumentoBozza)
{
mProductView = inflater.inflate(R.layout.listview_products_item_qta, parent, false);
}
else
{
mProductView = inflater.inflate(R.layout.listview_products_item, parent, false);
}
holder = new ViewHolder();
holder.txtNome = (TextView) mProductView.findViewById(R.id.txtNome);
holder.txtQuantita = (TextView) mProductView.findViewById(R.id.txtQuantita);
holder.btnAggiungiUnitaQuantita = (Button) mProductView.findViewById(R.id.btnAggiungiUnitaQuantita);
holder.btnRimuoviUnitaQuantita = (Button) mProductView.findViewById(R.id.btnRimuoviUnitaQuantita);
holder.btnQuantitaSelezionata = (Button) mProductView.findViewById(R.id.btnQuantitaSelezionata);
holder.imgCarello = (ImageButton) mProductView.findViewById(R.id.imgCarello);
mProductView.setTag(holder);
}
final ViewHolder viewHolder = (ViewHolder) mProductView.getTag(); //I NEED TO PASS IT
final ProdottiList product = getItem(position);
if (product.prodotto != null) {
final View finalMProductView = mProductView;
finalMProductView1 = mProductView;
db.close();
viewHolder.txtNome.setTag(mProductView);
viewHolder.txtNome.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mAvanzamentoDoc == ProductsFragment2.k_AVANZAMENTO_DOC_APERTO_BOZZA)
{) {
MethodsProducts.btnAggiungiUnitaQuantitaClick(context, viewHolder.btnAggiungiUnitaQuantita, viewHolder.btnQuantitaSelezionata, position, getItem(position), AdapterMode, savedAdapter, null, mSoggetto, mAvanzamentoDoc, IDDocumento, list);
notifyDataSetChanged();
}
else if (mAvanzamentoDoc == ProductsFragment2.k_AVANZAMENTO_DOC_MOSTRA_CARRELLO) //sono nel carrello. Ogni click e una rimozione
{
MethodsProducts.btnRimuoviUnitaQuantitaClick(context, viewHolder.btnAggiungiUnitaQuantita, viewHolder.btnQuantitaSelezionata, position, getItem(position), AdapterMode, savedAdapter, null, mSoggetto, mAvanzamentoDoc, IDDocumento, list);
}
}
});
viewHolder.btnAggiungiUnitaQuantita.setTag(mProductView);
viewHolder.btnAggiungiUnitaQuantita.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MethodsProducts.btnAggiungiUnitaQuantitaClick(context, viewHolder.btnAggiungiUnitaQuantita, viewHolder.btnQuantitaSelezionata, position, getItem(position), AdapterMode, savedAdapter, null, mSoggetto, mAvanzamentoDoc, IDDocumento, list);
if (mAvanzamentoDoc == ProductsFragment2.k_AVANZAMENTO_DOC_MOSTRA_CARRELLO) {
Log.d(ClassName, "btnAggiungiUnitaQuantita.setOnClickListener - Sono nel carrello - chiamo il notifyDataSetChanged()");
notifyDataSetChanged();
}
if (mAvanzamentoDoc == ProductsFragment2.k_AVANZAMENTO_DOC_APERTO_BOZZA) {
if (HomeActivity.agente.getFlagModQtaInCarrello() == 1) {
Log.d(ClassName, "btnRimuoviUnitaQuantita.setOnClickListener - Sono nel carrello - chiamo il notifyDataSetChanged()");
notifyDataSetChanged();
}
}
}
});
viewHolder.btnRimuoviUnitaQuantita.setTag(mProductView);
viewHolder.btnRimuoviUnitaQuantita.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MethodsProducts.btnRimuoviUnitaQuantitaClick(context, viewHolder.btnAggiungiUnitaQuantita, viewHolder.btnQuantitaSelezionata, position, getItem(position), AdapterMode, savedAdapter, null, mSoggetto, mAvanzamentoDoc, IDDocumento, list);
if (mAvanzamentoDoc == ProductsFragment2.k_AVANZAMENTO_DOC_MOSTRA_CARRELLO) {
notifyDataSetChanged();
}
if (mAvanzamentoDoc == ProductsFragment2.k_AVANZAMENTO_DOC_APERTO_BOZZA) {
if (HomeActivity.agente.getFlagModQtaInCarrello() == 1) {
Log.d(ClassName, "btnRimuoviUnitaQuantita.setOnClickListener - Sono nel carrello - chiamo il notifyDataSetChanged()");
notifyDataSetChanged();
}
}
}
});
MethodsProducts.SettingDetailOrderRow(context, mCaller, mProductView, product, IDDocumento, 1, position, mSoggetto, mAvanzamentoDoc, list);
new setRowProductAsync(context, mProductView, position, viewHolder, product, mSoggetto, IDDocumento, mAvanzamentoDoc, list, row).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
return mProductView;
}
这是我在片段类中使用的函数,用于在找到文章时进行确认对话框并添加它。我在“ onCreateView”中使用它:
public void OpenConfirmDialog()
{
if (!ProductsFragment2.getPreviousWindow()) {
if (_barcode != "") {
MySQLiteManager db = new MySQLiteManager(getActivity());
String articleName = db.GetProductDescriptionFromBarcode(_barcode, IDClienteValue);
String Message = getActivity().getString(R.string.ArticleDetailDialog_txt).replace("[DESCRIZIONE]", articleName);
final AlertDialog.Builder confermInserimentoDialog = new AlertDialog.Builder(getActivity());
// confermInserimentoDialog.setView(R.id.layoutConfermaInserimento);
confermInserimentoDialog.setTitle("Attenzione");
confermInserimentoDialog.setCancelable(false);
confermInserimentoDialog.setMessage(Message)
.setPositiveButton("Aggiungi", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
if (mAvanzamentoDoc == ProductsFragment2.k_AVANZAMENTO_DOC_APERTO_BOZZA) {
MethodsProducts.btnAggiungiUnitaQuantitaClick(context, viewHolder.btnAggiungiUnitaQuantita, viewHolder.btnQuantitaSelezionata, position, getItem(position), AdapterMode, savedAdapter, null, mSoggetto, mAvanzamentoDoc, IDDocumento, list);
Toast.makeText(getActivity(), "Aggiunto", Toast.LENGTH_LONG).show();
productsAdapter.Call_notifyDataSetChanged();
}
}
})
.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
Toast.makeText(getActivity(), "Articolo non aggiunto", Toast.LENGTH_LONG).show();
dialog.dismiss();
}
});
AlertDialog alert = confermInserimentoDialog.create();
alert.show();
MethodsProducts.SettingDetailOrderRow(getActivity(),ProductsAdapter.mCaller,ProductsAdapter.mProductView, ProductsAdapter.savedAdapter.getItem(ProductsAdapter.getPosition(_barcode, getActivity())), ProductsAdapter.IDDocumento, 1, ProductsAdapter.myPosition,ProductsAdapter.mSoggetto,ProductsAdapter.mAvanzamentoDoc, null);
new ProductsAdapter.setRowProductAsync(getActivity(),ProductsAdapter.mProductView, ProductsAdapter.myPosition,ProductsAdapter.holder, ProductsAdapter.savedAdapter.getItem(ProductsAdapter.myPosition),ProductsAdapter.mSoggetto, ProductsAdapter.IDDocumento,ProductsAdapter.mAvanzamentoDoc, null, ProductsAdapter.row).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
}
我的目标是创建一个确认对话框,如果用户单击“确认”按钮,我会将条形码添加到订单中。第一步,我在适配器的getView方法中使用了“ OpenConfirmDilalog”,但由于我的对话框出现了9次,因此效果不佳。添加条形码的方法是“ MethodsProducts.AggiungiUnitaQuantita”。主要是我的问题是,当我扫描同一篇文章时,应用程序不会将其放在数量= 2的同一行中,而是放在两行中,并且我希望它们位于同一行中。我看到问题出在视图持有人的过去。我需要在表单打开时运行代码。
对不起,如果代码中出现错误,但是: a)我是语言和android studio的新手 b)我删除了注释代码
P.s:我的英语也很抱歉
谢谢您的帮助!
答案 0 :(得分:0)
notifyDataSetChanged();
仅在您更改了数据(this.mItems
)时有效,但是看不到有修改数据的代码。
答案 1 :(得分:0)
问题解决了删除ViewHolder参数并将数据首先保存在本地数据库中并刷新ListView