Intereting Posts

Как вызвать функцию основного действия из пользовательского 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 () в адаптере? Вот XML для строки

 <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" /> 

Вот 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; } 

В этот момент я полностью потерян, поэтому любая помощь будет оценена по достоинству. Благодаря!

Solutions Collecting From Web of "Как вызвать функцию основного действия из пользовательского ArrayAdapter?"

Я бы рекомендовал вернуть 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); } } 

Ваш EditPlayerAdapter получает переданный Context . Activity расширяет Context

Если Context прошел, это ваши EditPlayers и вы сохраняете ссылку на этот класс в своем адаптере в классе, вы можете:

 ((EditPlayers) yourContextVar).function(); 

Еще лучше, сделайте какой-то интерфейс. Это поможет прояснить и организовать ваш код, и он применяет тот же принцип.