带片段的观察者

时间:2018-09-24 07:29:57

标签: android android-fragments

我是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:我的英语也很抱歉

谢谢您的帮助!

2 个答案:

答案 0 :(得分:0)

notifyDataSetChanged(); 

仅在您更改了数据(this.mItems)时有效,但是看不到有修改数据的代码。

答案 1 :(得分:0)

问题解决了删除ViewHolder参数并将数据首先保存在本地数据库中并刷新ListView