получить родительский объект от нажатия кнопки - PullRequest
1 голос
/ 11 ноября 2011

Я получил пользовательский класс, который надувает свой макет из XML.в этом XML я получил кнопку.затем в своей деятельности я создаю экземпляр этого пользовательского класса и добавляю его в:

  1. линейный макет (представление пользовательского класса)
  2. типизированный массив (объект дырки)

Теперь я хочу, чтобы при нажатии кнопки объект удалялся как из типизированного массива, так и из макета.Теперь моя проблема в том, что сначала у меня есть два места, где мне нужно удалить объект, а во-вторых, я не могу найти способ «найти» объект в типизированном массиве.кнопка только возвращает свой вид.используя .parent.parent до тех пор, пока я не достигну представления пользовательского представления класса, я могу удалить его из макета, но, похоже, нет способа получить ссылку на сам объект из нажатия кнопки.

Может быть, концепция дыры, как я это делаю, не так, не знаю.надеюсь, что вы можете помочь.

РЕДАКТИРОВАТЬ: очистить abit

MActivity:

public class MActivity extends Activity{
private ArrayList<MCustomObject> objList = new ArrayList<MCustomObject>();
@Override
public void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_layout;

    MCustomObject obj1 = new CustomObject(this, "blabla1");
    objList.add(obj1);
    MCustomObject obj2 = new CustomObject(this, "blabla2");
    objList.add(obj2);
    MCustomObject obj3 = new CustomObject(this, "blabla3");
    objList.add(obj3);
    }
}

MCustomObject:

public class MCustomObject{

public MCustomObject(Context context, String xyz){
LayoutInflater layoutInflater = LayoutInflater.from(context);
view = layoutInflater.inflate(R.layout.m_custom_object_layout, null);

button = (Button) view.findViewById(R.id.mButton);

[...]

m_custom_object_layout:

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


        <Button
            android:id="@+id/mButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/delete" />
</LinearLayout>

теперь, когда я нажимаю mButton, я хочу, чтобы отверстие obj instanz, к которому принадлежит кнопка, было удалено из objList.

Ответы [ 4 ]

0 голосов
/ 11 ноября 2011

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

public class MCustomObject{
    private final String customId;

    public MCustomObject(final MActivity parent, final String customId, String xyz){ 
        this.customId = customId;
        LayoutInflater layoutInflater = LayoutInflater.from(parent);
        view = layoutInflater.inflate(R.layout.m_custom_object_layout, null);
        button = (Button) view.findViewById(R.id.mButton);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
               // do your other stuff
               parent.removeCustomObject(customId);
            }
        });
    }

    public String getId() {
        return customId;
    }

Я изменил тип параметра контекста на MActivity (и сделал его final, потому что он используется в анонимном классе). Если вам нужна возможность создать MCustomObject из нескольких действий (не только MActivity), тогда я предлагаю вам извлечь метод removeCustomObject в интерфейс, и вы заставите все действия реализовать его.

А в свой MActivity вы добавляете следующие методы:

public void removeCustomObject(String customId) {
    objList.remove(findCustomObjectWithId(id));
}

private MCustomObject findCustomObjectWithId(int id) {
    for(MCustomObject custom : objList) {
        if (custom.getId() == id) {
            return custom;
        }
    }
    return null;
}

(NB: замена списка objList на

Map<String, MCustomObject>

, в котором вы сопоставляете customIds с объектами, поиск будет легче читать)

0 голосов
/ 11 ноября 2011

Я согласен с пользователем LAS_VEGAS, когда вы создаете кнопки, вы должны установить идентификатор кнопки (button.id =), и вы можете указать их на

public void onClick(View v) 
{
    if(v.getId ==  )
    {
          //whatever you want
    }
    else
    {

    }
}
0 голосов
/ 11 ноября 2011

Вот как бы я это сделал.Я предлагаю использовать ArrayList вместо простого массива, так как он лучше поддерживает такие вещи, как удаление и т. Д. Некоторый контекст отсутствует, чтобы дать вам полное решение (как выбрать viewId, который вы хотите удалить?), Но этодолжен заставить вас идти.

private List<Custom> myListOfCustom = new ArrayList<Custom>();
// initialize myListOfCustom the way you want by using myListOfCustom.add(object)

// button clicked
public void buttonClicked(View v) {
    final int id = ...; // obtain id here
    myListOfCustom.remove(findCustomObjectWithId(id));
    // also remove the view from your layout
}

private Custom findCustomObjectWithId(int id) {
    for(Custom custom : myListOfCustomObjects) {
        if (custom.getId() == id) {
            return custom;
        }
    }
    return null; // custom object with givenm id was not in the list! alternatively, you can throw a RuntimeException here (something like an IllegalArgumentException) and catch it in the buttonClicked method
}
0 голосов
/ 11 ноября 2011

Вы можете использовать

View.getId()

, чтобы найти кнопку в вашем массиве.

for(int i =0; i < array.size(); i++) {
    if(button.getId() == array.get(i).getId())
    /* Found! */ 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...