Нажмите кнопку распространения моего адаптера массива в моей деятельности. - PullRequest
1 голос
/ 07 июля 2011

У моей активности есть ListView, у которого есть собственный ArrayAdapter. В моем ArrayAdapter у меня есть изображение, несколько текстовых полей и кнопка.

В getView адаптера я получаю кнопку и устанавливаю setOnClickListener. Из прослушивателя щелчков я могу получить индекс предмета, по которому щелкнули.

Теперь моя проблема в том, что я хочу распространить эту информацию в моей основной деятельности, где я хочу обрабатывать нажатия моей кнопки. Я могу сохранить информацию индекса в статической переменной, но я все еще не знаю, как вызвать событие в моей деятельности.

Как мне это сделать?

Я нахожусь в Android 6 дней, так что, спасибо Игги

Код:

Моя активность:

public class MyClass extends Activity{
...
    public void onCreate(Bundle savedInstanceState) {
    ...
    myListView = (ListView)findViewById(R.id.lvxml);
    myList = new MyCustomArrayAdapter(this, myAnotherClassObject);
    myListView .setAdapter(myList);
    ...
    }
}

Теперь в моем адаптере

public class MyCustomArrayAdapter extends ArrayAdapter<myAnotherClass> {
...
....
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

         Button b = (Button)convertView.findViewById(R.id.myButtonInListView);
         b.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 doStuff;
             }
     });
    }
}

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

Ответы [ 4 ]

1 голос
/ 14 сентября 2015

Вот альтернативное и, как мне кажется, более элегантное решение.

Во-первых, в вашем классе MyCustomArrayAdapter определите интерфейс:

public interface MyCustomRowButtonListener{
  void onCustomRowButtonClick(MyAnotherClass selectedItem, int position, View view);
}

Создайте переменную-членMyCustomRowButtonListener в вашем ArrayAdapter

public class MyCustomArrayAdapter{

  private MyCustomRowButtonListener mRowButtonListener;
  //....
}

и добавьте параметр для слушателя в конструкторе

public MyCustomArrayAdapter(Context context, MyCustomRowButtonListener listener){

  mContext = context;
  mRowButtonListener = listener;

}

в методе getView:

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

     Button b = (Button)convertView.findViewById(R.id.myButtonInListView);
     b.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
             mRowButtonListener.onCustomRowButtonClick(getItem(position),position,b);
         }
 });
}

и в вашей деятельности:

myList = new MyCustomArrayAdapter(this, myAnotherClassObject,this);

Теперь позвольте вашей деятельности реализовать MyCustomRowButtonListener

public class MyClass extends Activity implements MyCustomRowButtonListener{
...
    public void onCreate(Bundle savedInstanceState) {
    ...
    myListView = (ListView)findViewById(R.id.lvxml);
    myList = new MyCustomArrayAdapter(this, myAnotherClassObject,this);
    myListView .setAdapter(myList);
    ...
    }
}

public void onCustomRowButtonClick(MyAnotherClass selectedItem, int position, View view){
    Toast.makeText(this,"You have selected "+selectedItem,Toast.LENGTH_SHORT).show();
}
0 голосов
/ 08 июля 2011

Так что я решил это как-то. Это, вероятно, не способ сделать это, но это работает.

Я сохраняю свою активность в статической переменной.

Button b = (Button)convertView.findViewById(R.id.myButtonInListView);
b.setTag(position);
b.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
             int i = (Integer) v.getTag();
             myStaticVarRep.myActivity.myMethod(i);
         }
 });
0 голосов
/ 21 февраля 2013

Индекс - это переменная position.Ist должен быть окончательным, чтобы использовать его здесь

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

Вы можете сообщить Activity с помощьюслушатель-интерфейс.

0 голосов
/ 07 июля 2011

Я предполагаю, что ваш код выглядит примерно так.

public class <Your Class> ... implements OnClickListener{

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        .
        .
        .
        button.setOnClickListener(this);
    }
}

Чтобы обрабатывать события нажатия кнопки, вам нужен метод onClick, который выглядит следующим образом.

public void onClick(View v){
    <Handle your button click in here>
}

Когда вы нажимаете кнопку, вызывается метод onClick. Именно здесь вы можете манипулировать своим статическим var, запускать другие методы и т. Д. Надеюсь, это поможет.

...