2014-11-04 41 views
0

从对话框的ListView我有一个ListView用具有不同文本视图自定义布局和按钮动态膨胀。点击按钮后,用户在对话窗口中指定选项,并将数据返回到列表视图中的选定项目。组文成TextViews在Android中

我希望数据插入到列表视图中相应项目的文本视图中。但是,如果列表中的项目数量少于不可滚动的项目,则在关闭对话框时以及有足够的项目可滚动时,根本不会插入任何数据,数据会插入到列表中错误项目的文本视图中。我不知道我做错了,这里是我的代码:

public double COST_EM = 0.00, COST = 0.00, NUM_CO = 0.00; 
private Spinner mPSpinner, mMediSpinner; 
private ArrayAdapter<String> pmedi, numCo; 
private TextView mPTv, mCoTv, mSubMain, mSubTv; 

@Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) { 
      View view = null; 
      LayoutInflater inflater = (LayoutInflater) mContext 
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.item_custom_layout, parent, false); 

      // Display image in the ImageView widget 
      TempP tphoto = tempPList.get(position); 


      mPTv = (TextView) view.findViewById(R.id.p_tv_po); 
      mCoTv = (TextView) view.findViewById(R.id.co_tv_po); 
      mSubMain = (TextView) view.findViewById(R.id.sub_list); 

      mModify = (Button) view.findViewById(R.id.modify_btn_po); 
      mModify.setOnClickListener(new View.OnClickListener() { 

       // calculate the order cost 
       protected void calculateCost() { 

        mSub = ((COST_EM + COST) * NUM_CO); 

        mSubtv.setText("" + Double.toString(mSub)); 
       } 

       @Override 
       public void onClick(View v) { 

        mDialog = new Dialog(PCustom.this); 
        mDialog.setContentView(R.layout.item_custom_dialog); 
        mDialog.setTitle("Modify specifications"); 

        mPSpinner = (Spinner) mDialog.findViewById(R.id.ces_sp_dialog); 
        mSubTv = (TextView) mDialog.findViewById(R.id.sub_der_dialog); 

        // set spinner adapters (code truncated for brevity) 
        pmedi = new ArrayAdapter<String>(MyApplication 
          .getContext(), R.layout.spinner_style, pmedi); 
        mPSpinner.setAdapter(pmedi); 

        mPSpinner 
          .setOnItemSelectedListener(new OnItemSelectedListener() { 
           public void onItemSelected(AdapterView<?> arg0, 
             View arg1, int pos, long arg3) { 

            if (mPSpinner.getSelectedItem() == "Glossy") { 
             COST = 2000.00; 
            } else if (mPSpinner 
              .getSelectedItem() == "Standard") { 
             COST = 1500.00; 
            } else if (mPSpinner 
              .getSelectedItem() == "Other") { 
             COST = 1000.00; 
            } 

            // calculate the cost 
            calculateCost(); 
           } 

           public void onNothingSelected(
             AdapterView<?> arg0) { 
           } 
          }); 

        Button save = (Button) mDialog 
          .findViewById(R.id.save_btn_po_dialog); 
        Button cancel = (Button) mDialog 
          .findViewById(R.id.cancel_btn_po_dialog); 

        save.setOnClickListener(new View.OnClickListener() { 

         public void onClick(View v) { 
          // String newnumber = 
          // mobileNumber.getText().toString(); 

          mPTv.setText("" + mPSpinner 
            .getSelectedItem()); 
          mCoTv.setText((String) mNCoSpinner 
            .getSelectedItem()); 
          mSubMain.setText(Double.toString(mSub)); 

          mDialog.dismiss(); 
         } 
        }); 

        cancel.setOnClickListener(new View.OnClickListener() { 

         @Override 
         public void onClick(View v) { 
          mDialog.dismiss(); 
         } 
        }); 

        mDialog.show(); 

       } 
      }); 

      return view; 
     } 

回答

1

的方法getView()返回一个项目视图每次的ListView与特定的“位置”参数调用它,所以有时它是所谓的不少于它所拥有的物品数量。所以,你的成员变量mPTv,mCoTv和mSubMain将被重新分配很多次,最后在getView()的最终调用中有它们的值,这就是为什么你遇到这个问题。

解决你的问题,你需要有正确的TextViews当“保存按钮”是clicked.Here是如何找到那些正确TextViews:

在mModify的OnClickListener按钮,在“V”参数在onClick(View v)方法中是mModify本身的同一个实例。所以,你可以用它来找到那些正确的TextView。也许你可以设置项目根View作为它的标签,并在onClick(View v)中获得根View,然后用它来找到所有正确的TextView。以下是如何改变你的代码:

mModify = (Button) view.findViewById(R.id.modify_btn_po); 
    // set the root view as the tag of "modify button". 
    mModify.setTag(view); 
    mModify.setOnClickListener(new View.OnClickListener() { 

     // calculate the order cost 
     protected void calculateCost() { 

      mSub = ((COST_EM + COST) * NUM_CO); 

      mSubtv.setText("" + Double.toString(mSub)); 
     } 

     @Override 
     public void onClick(View v) { 
      // retrieve the root view here, it's the root view of the item on which you  
      // clicked the "modify button". 
      View view = (View)v.getTag(); 
      // find the correct TextViews here. 
      mPTv = (TextView) view.findViewById(R.id.p_tv_po); 
      mCoTv = (TextView) view.findViewById(R.id.co_tv_po); 
      mSubMain = (TextView) view.findViewById(R.id.sub_list); 

顺便说一句,你不优化您的ListView,所以它可能无法流畅滚动,但这并不是什么原因造成你的problem.You可以参考这个: How to optimize Android ListView?

+0

谢谢@Leog,我会尝试实施您的更改并查看它的行为。 – Dadani 2014-11-05 13:47:32

+0

再一次感谢,它像一个魅力。 +1为这个伟大的帮助。 – Dadani 2014-11-06 14:31:08

+0

@Dadani很高兴帮助。 – 2014-11-07 02:40:31

相关问题