2011-10-25 8 views
0

私のリストの行のレイアウトにボタンがあります。ボタンのテキストに基づいてアクションを変更する必要があります。これらのテキストは、「元に戻す」または"行き方"。ボタンテキストが "Revert"の場合、私自身のアダプタクラスを作成しました。レイアウトに記載されているonclick関数はボタンテキスト "Directions"のために機能します。Android:ボタンリスト更新後にボタンが動作しない

//This is my Onclick() function mentioned in the layout 
public void changecolour(View v) { 
    LinearLayout vwParentRow = (LinearLayout) v.getParent(); 
    final Button btnChild = (Button) vwParentRow.getChildAt(2); 
    if (btnChild.getText().toString().equals("Directions")) { 
       Intent directiosin = new Intent(getApplicationContext(), 
         Directions.class); 
       startActivity(directiosin); 
    } 

以下に示すテキスト「復帰」のアダプタクラスの部分です。私はボタンを「戻す」をクリックして意思を正常に.Whenと呼ばれる「指示」ボタンIをクリックすると、このボタンは「directionsIn」をクリックすると、ボタンのテキストを「指示」.Butに変更され

if (btnChild.getText().toString().equals("Revert")) { 
     btnChild.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       btnChild.setText("Directions"); 
       checkbox.setChecked(false); 
       getItem(position).setCompleted(false); 
       if (0 <= list.get(position).getStatus() 
         && list.get(position).getStatus() < 5) { 
        text.setTextColor(Color.BLUE); 
       } else if (5 <= list.get(position).getStatus() 
         && list.get(position).getStatus() < 10) { 
        text.setTextColor(Color.parseColor("#DD7500")); 
       } else { 
        text.setTextColor(Color.RED); 
       } 
      } 
     }); 
    } 

インテントは呼び出されません。

答えて

2

はいわかりました。

答えは簡単です。ボタンのonClickListenerを完全に新しいListenerに変更しました。これは本当に、すべての:)

まず、あなたがラベルやアプリケーションを制御するために、他の視覚特性を利用していないが台無しにされ

if (btnChild.getText().toString().equals("Revert")) { 

      btnChild.setText("Directions"); 
      checkbox.setChecked(false); 
      getItem(position).setCompleted(false); 
      if (0 <= list.get(position).getStatus() 
        && list.get(position).getStatus() < 5) { 
       text.setTextColor(Color.BLUE); 
      } else if (5 <= list.get(position).getStatus() 
        && list.get(position).getStatus() < 10) { 
       text.setTextColor(Color.parseColor("#DD7500")); 
      } else { 
       text.setTextColor(Color.RED); 
      } 
     } 
    }); 
} 
1

: ソリューションは、このようなものです。デザインを変更したり、言語を変更したり、アプリケーションのロジックを書き直す必要がありません。

第2に、イベントが発生するたびに新しいイベントリスナーを作成しないでください。それは非常にリソースを消費します。あなたは何をすべき

、アイテムのためNEET少しクラスを作成することです:

private class MyListener implements OnClickListener { 
    boolean revert = true; 
    int id; 
    Button button; 

    private MyListener(int id) { 
     this.id = id; 
    } 

    public void OnClick(View v) { 
     // Do stuff that should be done 
     if (revert) { 
     // Calls the method for revert, you have the id of the selected item 
     } else { 
     // Calls the method for directions, you have the id of the selected item 
     } 
     // TODO Change label of the button 
     // TODO Change state of listener 
    } 
} 

は、これらのリスナーの配列を作成します。

MyListener[] listeners = new MyListener[numberOfItems]; 

そして、あなたはからアイテムを取得したいですアダプタ:

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (view == null) { 
     // TODO If View doesn't exist, create a new one 
    } 
    Button button = (Button)view.findViewById(R.id.theButtonId); 
    if (listeners[position] == null) { 
     listeners[position] = new MyListener(position); 
    } 
    button.setText(listeners[position].revert?"Revert":"Directions"); 
    button.setOnClickListener(listeners[position]); 
    listeners[position].button = button; 

}

関連する問題