2012-01-13 10 views
0

シナリオ:Android - onClickアダプタが動作しない

ユーザーがボタンをクリックして、行(アダプタ)が追加されました。ユーザは、値を入力し、生成されたボタンをクリックする。値は計算され、編集テキストで表示されます。

問題:この値は計算されず、編集テキストにも表示されません。私は間違って何をしていますか?

custom_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 

<LinearLayout 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_marginTop="10dp" 
android:gravity="center"> 

<EditText 
android:id="@+id/name" 
android:layout_width="125dp" 
android:layout_height="wrap_content" 
android:hint="Name" 
android:maxLength="10" 
/> 

<EditText 
android:id="@+id/price" 
android:layout_width="80dp" 
android:layout_height="wrap_content" 
android:hint="Price" 
android:inputType="numberDecimal" 
android:maxLength="5" 
/> 

<Button 
android:id="@+id/calculate" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Calculate" 
/> 

</LinearLayout> 

<EditText 
android:id="@+id/result" 
android:layout_width="150dp" 
android:layout_height="wrap_content" 
android:layout_gravity="center_horizontal" 
android:editable="false" 
android:cursorVisible="false" 
android:text="$0.00" 
/>  

main.java <<EDITTED>>

public class AdvancedBillSplitter extends Activity{ 

ArrayList<String> noteList = new ArrayList<String>(); 
FancyAdapter aa = null; 

Button calculate; 
//EditText price; 
EditText result; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ListView myListView = (ListView)findViewById(R.id.noteList); 
    aa = new FancyAdapter(); 

    myListView.setAdapter(aa); 

    myListView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> arg0, View arg1, 
       int position, long arg3) { 
      EditText price = (EditText)findViewById(R.id.price); 
      price = (EditText)findViewById(R.id.price); 
      double price1 = Double.parseDouble(price.getText().toString()); 
      double total = price1 *1.1; 
      String resultPrice = Double.toString(total); 
      result.setText(resultPrice); 
      System.out.println(total); 

     } 
    }); 
    aa.notifyDataSetChanged(); 


    Button btnSimple = (Button)findViewById(R.id.btnSimple);   

    btnSimple.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) 
     { 
      noteList.add(0, ""); 
      aa.notifyDataSetChanged(); 

     } 
    });   

} 

class FancyAdapter extends ArrayAdapter<String> 
{ 
    Button calculate; 
    EditText price; 
    EditText result; 

    FancyAdapter() 
    { 
     super(AdvancedBillSplitter.this, android.R.layout.simple_list_item_1, noteList); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View row = convertView;  

     if(row == null) 
     { 
      LayoutInflater inflater = getLayoutInflater(); 
      row = inflater.inflate(R.layout.custom_list_item, null); 
     } 

     return (row); 
    } 
} 

} 

答えて

2

たぶん、あなたは代わりにListViewに推奨される方法setOnItemClickListener()を使用したい - 私はそれが悪いスタイルだと思いますアダプター内でリスナーを直接設定します。

+0

私はmyListViewを行います。私のメインのsetOnItemClickListener()? – Hend

+0

はい、私はあなたが得るものを教えてください。 –

+0

私はそれをコードに含めましたが、まだ動作していません。私は私が持っている更新されたコードで私の質問を編集しました – Hend

0

ハンドラーを使用してビューを更新することができます。このよう

Handler mHandler = new Handler() { 
@Override 

    public void handleMessage(Message msg) { 
     switch (msg.what) { 
     case 0: 
      aa.notifyDataSetChanged(); 
      break; 
     default: 
      break; 
     } 

    }}; 

btnSimple.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) 
    { 
     noteList.add(0, ""); 
     mHandler.sendEmptyMessage(0); 
    } 
}); 
0

代わりnew AdapterView.OnItemClickListener()を使用しての、あなたがimport android.widget.AdapterView.OnItemClickListener;

いけない(つまり、リストビュー用)膨張したレイアウトと、親のレイアウトのクリックリスナーを持っているインポートnew OnItemClickListener()使用することができます。膨らんだレイアウトのクリックリスナーを使用している場合、コントロールはそこで直接転送します。

myListViewmyListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, 
        int position, long arg3) { 
        price = (EditText)findViewById(R.id.price); 
        double price1 = Double.parseDouble(price.getText().toString()); 
        double total = price1 *1.1; 
        String resultPrice = Double.toString(total); 
        result.setText(resultPrice); 

      } 
     }); 

これはあなたにいくつかの考えを与えるかもしれないと思います。データが変更されたらnotifyDataSetChanged()メソッドを呼び出すと、ビューが更新されます。

すべて最高です。

class FancyAdapter extends BaseAdapter 
{ 
Button calculate; 
EditText price; 
EditText result; 



    @Override 
    public int getCount() { 
     return noteList.length; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView;  

      if(row == null) 
      { 
       LayoutInflater inflater = getLayoutInflater(); 
       row = inflater.inflate(R.layout.custom_list_item, null); 
      } 

      return (row); 
    } 

} 
+0

私はそれに応じて私のコードを変更しましたが、それでも動作していません。編集テキストからデータを取得していません。 – Hend

+0

'price =(EditText)arg1.findViewById(R.id.price);'それが 'edittext'を識別しているかどうかを確認してください – Hussain

+0

まだ編集テキストからデータを取得していません。 – Hend

4

シンプル加え、

<Button 
android:id="@+id/calculate" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:focusable="false" 
android:focusableInTouchMode="false" 
android:text="Calculate" 
/> 

そのリストはfocussable(リスト項目、ボタン)している2つの項目を持っているので、今あいまいな状況をthatsのクリックイベントをキャッチしていません。ボタンは焦点を合わせないようにしてください。それでもクリックイベントが検出されます。

+1

私は編集しますが、それは6文字以上ではありませんので、私は傾けることができます。 Focusableはここで間違って綴られています - "焦点を合わせる" - 単純なコピー/ペーストは動作しません。 android:focusable = "false" –

+1

@BrandonRomano ..編集。 – ngesh

1

べきではない

のEditText価格=(のEditText)findViewById(R.id.price)。

こと

のEditText価格=(のEditText)view1.findViewById(R.id.price)。

(VIEW1注)

また、あなたは二回findViewById()ラインを持っています。

+0

ありがとうありがとう – user1324936

関連する問題