简体   繁体   English

Android动作监听器调用另一个类中的方法

[英]Android action listener to call a method in another class

I have a listview with a button in each row.我有一个列表视图,每行都有一个按钮。 I have made a custom Adapter class and a ItemModel class to hold the data for each row.我制作了一个自定义 Adapter 类和一个 ItemModel 类来保存每一行的数据。 Inside the ItemModel class I have defined an ActionListener for the button.在 ItemModel 类中,我为按钮定义了一个 ActionListener。 How can I call a method in another class from inside my button's action listener?如何从按钮的动作侦听器内部调用另一个类中的方法?

Right now if i say Classname clsName = new Classname();现在,如果我说 Classname clsName = new Classname(); and inside the actionlistener do clsName.methodName(variableToPass);在 actionlistener 里面做 clsName.methodName(variableToPass); <--- this all compiles but crashes when I click the button..Anyone know how to get this to work? <--- 这一切都编译但当我点击按钮时崩溃了..有谁知道如何让它工作?

MyListModel Class MyListModel 类

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 - method for getView MyListAdapter 类 - 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;
}

My Shelf class has a method called downloadBook(String bookKey) <-- this is what I want to call with each button click and pass this method the appropriate book key.我的 Shelf 类有一个名为 downloadBook(String bookKey) <-- 这是我想在每次单击按钮时调用的方法,并将相应的书本密钥传递给该方法。 I also have 2 xml files (shelfrow.xml and shelflist.xml).我也有 2 个 xml 文件(shelfrow.xml 和shelflist.xml)。 One contains the textfields and button and the other contains the listview.一个包含文本字段和按钮,另一个包含列表视图。

Some of the code from Shelf.java class 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 from logcat来自 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

also this came up zygoteinit methodandargscaller.run这也出现了 zygoteinit methodandargscaller.run

I am going to go out on a limb here, but I think I know what the issue is.我要在这里冒险,但我想我知道问题是什么。

In the last snippet of code, you are not setting the key field on the MyListItemModel .在最后一段代码中,您没有在MyListItemModel上设置key字段。 You are instead setting some variable called 'bookKey' (I do not see where it is defined).您正在设置一些名为“bookKey”的变量(我没有看到它的定义位置)。

I bet if you change this line:我敢打赌,如果你改变这一行:

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

to be this:是这样的:

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

everything will work just fine for you.一切都会为你工作得很好。 If you pass in a null String to the String(String) constructor, you will get a NullPointerException, as that constructor expects a non-null String.如果将null字符串传递给 String(String) 构造函数,则会得到 NullPointerException,因为该构造函数需要非空字符串。

I will mention that it is not necessary for you use the String(String) constructor, you should be fine just doing this in the fist snippet:我会提到您没有必要使用 String(String) 构造函数,您只需在第一个片段中执行此操作即可:

shelf.downloadBook(key);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM