Слушатель действий Android для вызова метода в другом классе - PullRequest
0 голосов
/ 23 мая 2011

У меня есть список с кнопкой в ​​каждой строке. Я создал собственный класс Adapter и класс ItemModel для хранения данных для каждой строки. Внутри класса ItemModel я определил ActionListener для кнопки. Как я могу вызвать метод в другом классе из слушателя действия моей кнопки?

Прямо сейчас, если я скажу Classname clsName = new Classname (); и внутри actionlistener сделать clsName.methodName (variableToPass); <--- это все компилируется, но вылетает, когда я нажимаю кнопку .. Никто не знает, как заставить это работать? </p>

MyListModel Class

public class MyListItemModel{ //that's our book
private String title; // the book's title
private String description; //the book's description
int id; //book owner id
String key; //book key
private Context context;
Shelf shelf = new Shelf();  //shelf class


public MyListItemModel(Context c){
    this.context=c;

 }


public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getDescription() {
    return description;
}
public void setDescription(String description) {
    this.description = description;
}

public String getKey() {
    return key;
}

public void setKey(String key){
    this.key = key;
}


OnClickListener listener = new OnClickListener(){ // the book's action
    @Override
    public void onClick(View v) {
        //code for the button action
        //THIS DOESN'T WORK PROPERLY AND CRASHES ON CLICK. However if i use a Toast to print the key on each click - it will print the right key to screen.

        shelf.downloadBook(new String(key));

    }
};
int getBookId(){

    return title.hashCode();
}
}

MyListAdapter class - метод для getView

public class MyListAdapter extends BaseAdapter {

View renderer;
List<MyListItemModel> items;
ArrayList<HashMap<String, String>> mylist;
private LayoutInflater mInflater;
private Context context;


public MyListAdapter(Context c){
    this.context=c;
    mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

....

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

    if(convertView==null){
        //convertView = renderer;
        convertView = mInflater.inflate(R.layout.shelfrow, null);

    }
    MyListItemModel item = items.get(position);
    TextView label = (TextView)convertView.findViewById(R.id.item_title);
    label.setText(item.getTitle());
    TextView label2 = (TextView)convertView.findViewById(R.id.item_subtitle);
    label2.setText(item.getDescription());
    Button button = (Button)convertView.findViewById(R.id.btn_download);
    button.setOnClickListener(item.listener);


    return convertView;
}

В моем классе Shelf есть метод downloadBook (String bookKey) <- это то, что я хочу вызывать при каждом нажатии кнопки и передавать этому методу соответствующий ключ книги. У меня также есть 2 XML-файла (shelfrow.xml и shelflist.xml). Один содержит текстовые поля и кнопку, а другой - список. </p>

Часть кода из класса Shelf.java

List<MyListItemModel> myListModel = new ArrayList<MyListItemModel>();

            try{

                JSONArray entries = json.getJSONArray("entries");

                for(int i=0;i<entries.length();i++){                        

                    MyListItemModel item = new MyListItemModel(this);
                    JSONObject e = entries.getJSONObject(i);
                    item.id = i;        //user ID
                    bookKey = (e.getString("key"));
                    item.setTitle(e.getString("title"));
                    item.setDescription(e.getString("description"));

                                    myListModel.add(item);  
                        }

                    }catch(JSONException e) {
                        Log.e("log_tag", "Error parsing data "+e.toString());
                    }


                    MyListAdapter adapter = new MyListAdapter(this);
                    adapter.setModel(myListModel);
                    setListAdapter(adapter);
                    lv = getListView();
                    lv.setTextFilterEnabled(true); 

….

 public void downloadBook(String theKey) {
      //take theKey and append it to a url address to d/l
  }

Stacktrace от logcat

05-23 02:34:59.439: INFO/wpa_supplicant(14819): Reset vh_switch_counter due to receive LINKSPEED cmd 05-23 02:34:59.439: DEBUG/ConnectivityService(1346): getMobileDataEnabled returning true 05-23 02:36:39.269: DEBUG/StatusBarPolicy(6068): onSignalStrengthsChange

также появился метод zygoteinitandargscaller.run

1 Ответ

0 голосов
/ 23 мая 2011

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

В последнем фрагменте кода вы не устанавливаете поле key на MyListItemModel. Вместо этого вы устанавливаете некоторую переменную с именем 'bookKey' (я не вижу, где она определена).

Бьюсь об заклад, если вы измените эту строку:

bookKey = (e.getString("key"));

быть таким:

item.setKey(e.getString("key"));
//or item.key = e.getString("key"));

у вас все будет хорошо. Если вы передадите null String конструктору String (String), вы получите исключение NullPointerException, так как этот конструктор ожидает ненулевую строку.

Я упомяну, что вам не нужно использовать конструктор String (String), вам будет достаточно просто сделать это в первом фрагменте кода:

shelf.downloadBook(key);
...