2013-02-11 15 views
10

私は多くの同様の質問を見てきましたが、何もできないようです。このような関数を持つメインクラスがあります。このような編集ではダイアログボックスが表示され、ボタンが押されたときにListが編集されます。カスタムArrayAdapterからメインアクティビティの関数を呼び出す方法は?

public class EditPlayers extends SherlockFragmentActivity { 

    listPlayerNames.setAdapter(new EditPlayerAdapter(ctx, 
       R.layout.score_row_edit_player, listScoreEdit)); 

public void deletePlayer(final int position) { 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(
      EditPlayers.this); 

    // Setting Dialog Title 
    alertDialog.setTitle("Delete Player"); 

    // Setting Dialog Message 
    alertDialog.setMessage("Are you sure?"); 

    // Setting Delete Button 
    alertDialog.setPositiveButton("Delete", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        listScoreEdit.remove(position); 
        updateListView(); 
       } 
      }); 

    // Setting Cancel Button 
    alertDialog.setNeutralButton("Cancel", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

    // Showing Alert Message 
    alertDialog.show(); 
} 

} 

アダプタのgetView()からその関数にアクセスするにはどうすればよいですか?ここではここで私は完全ので、任意の助けをいただければ幸いです。この時点で迷ってしまいましたgetViewメソッド()

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    convertView = (LinearLayout) inflater.inflate(resource, null);  
    Score score = getItem(position); 
    TextView txtName = (TextView) convertView.findViewById(R.id.nameEdit); 
    txtName.setText(score.getName()); 
    Button b = (Button)convertView.findViewById(R.id.deletePlayer); 
    b.setTag(position); 
    b.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //call function here 
      } 
    }); 
    return convertView; 
} 

だ行

<TextView 
    android:id="@+id/nameEdit" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:paddingBottom="10dp" 
    android:paddingTop="10dp" 
    android:paddingLeft="10dp" 
    android:layout_weight="70" 
    android:text="Name" 
    android:textColor="#666666" 
    android:textSize="22sp" 
    android:textStyle="bold" > 
    </TextView> 

<Button 
    android:id="@+id/deletePlayer" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="30" 
    android:text="Delete" 
    android:focusable="false" /> 

ためのXMLです。ありがとう!

答えて

31

interfaceをアクティビティに戻して、そのボタンが押されたことを知らせることをおすすめします。 ArrayAdapterからアクティビティのメソッドを呼び出すことはお勧めしません。あまりにも強く結合している。

このような何か試してみてください:

あなたActivity

public class EditPlayers extends SherlockFragmentActivity implements EditPlayerAdapterCallback { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     EditPlayerAdapter adapter = new EditPlayerAdapter(this, 
       R.layout.score_row_edit_player, listScoreEdit); 
     adapter.setCallback(this); 
     listPlayerNames.setAdapter(adapter); 

    } 

    private void deletePlayer(final int position) { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(
       EditPlayers.this); 

     // Setting Dialog Title 
     alertDialog.setTitle("Delete Player"); 

     // Setting Dialog Message 
     alertDialog.setMessage("Are you sure?"); 

     // Setting Delete Button 
     alertDialog.setPositiveButton("Delete", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         listScoreEdit.remove(position); 
         updateListView(); 
        } 
       }); 

     // Setting Cancel Button 
     alertDialog.setNeutralButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 

    @Override 
    public void deletePressed(int position) { 

     deletePlayer(position); 
    } 

} 

アダプタ:

public class EditPlayerAdapter extends ArrayAdapter { 

    private EditPlayerAdapterCallback callback; 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     convertView = (LinearLayout) inflater.inflate(resource, null);  
     Score score = getItem(position); 
     TextView txtName = (TextView) convertView.findViewById(R.id.nameEdit); 
     txtName.setText(score.getName()); 
     Button b = (Button)convertView.findViewById(R.id.deletePlayer); 
     b.setTag(position); 
     b.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 

        if(callback != null) { 

         callback.deletePressed(position); 
        } 
       } 
     }); 
     return convertView; 
    } 

    public void setCallback(EditPlayerAdapterCallback callback){ 

     this.callback = callback; 
    } 


    public interface EditPlayerAdapterCallback { 

     public void deletePressed(int position); 
    } 
} 
+0

が、これは完全に働いた、ありがとうございます! – GrilledCheese

+0

うわー、これは魔法でした。ありがとう、 –

+0

私にとって最高の解決策: – SAndroidD

12

EditPlayerAdapterにはContextが渡されます。渡されたContextがあなたのEditPlayersであり、あなたがあなたのアダプタでそのContextに、クラススコープの参照を保存する場合ActivityContext

を拡張し、あなたがして行うことができます。

((EditPlayers) yourContextVar).function(); 

いっそのこと、のインターフェースを作りますある種の。コードを明確化し整理するのに役立ち、同じ原則が適用されます。