在onClickListener上调用特定方法

时间:2016-12-30 19:15:53

标签: java android sqlite android-studio

我有一个java类,它将数据添加到我的sqlite db中,如下所示:

public class DataProvider {
    public static List<DataItem> dataItemList;
    public static Map<String, DataItem> dataItemMap;

    static {
        dataItemList = new ArrayList<>();
        dataItemMap = new HashMap<>();

        addItem(new DataItem(null, "Row 1", "Description 1", 3107));
        addItem(new DataItem(null, "Row 2", "Description 2", 2519));
    }

    public static void addItem(DataItem item) {
        dataItemList.add(item);
        dataItemMap.put(item.getAccountId(), item);
    }

}

其中DataItem是处理数据信息的模型类。

然后我创建了一个新活动,其中包含一个可以使用此类addItem的按钮:

    Button addButton = (Button) findViewById(R.id.button_add);
    addButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            addItem(new DataItem(null, "Row 3", "Description 3", 3307));
            finish();
        }
    });

尝试

  1. 我尝试从addItem静态导入DataProvider 上课,但没有用。
  2. 我在活动中创建了一个新方法,其中包含用于addItem的按钮,但仍然没有运气。

    private void addItem(DataItem item) {
        List<DataItem> dataItemList;
        Map<String, DataItem> dataItemMap;
        dataItemList = new ArrayList<>();
        dataItemMap = new HashMap<>();
        dataItemList.add(item);
        dataItemMap.put(item.getAccountId(), item);
    }
    
  3. 问题

    我还能如何导入addItem以便能够在我的第二项活动中使用onClick方法吗?

4 个答案:

答案 0 :(得分:2)

正如我所见,您的数据结构是静态的,因此可以在导入后随处使用。它不需要在控制器中创建任何方法,数据提供者可以直接在任何地方使用,因此也可以在监听器中使用:

DataProvider.addItem (/* new item */ )

答案 1 :(得分:1)

您应该尝试创建单独的方法并在OnClickListener中调用该方法

private void addItem(DataItem item) {
    DataProvider.addItem(item)
}

或者 直接从OnClickListener调用该方法,如

DataProvider.addItem(new DataItem(null, "Row 3", "Description 3", 3307));

并检查导入的addItem方法

答案 2 :(得分:1)

我不确定为什么你不能使用java类&#39;静态方法在不同的活动中。

我的建议 -

1)使Dataprovider类成为抽象,然后让第二个activity的主类扩展它。然后在第二个活动中覆盖那里的方法。

2)在第一个活动中创建Dataprovider类的实例,然后让Dataprovider类实现Serializable接口。然后你可以发送你的对象以及调用你的第二个活动的任何意图。试试这个 -

    // send where details is object
ClassName details = new ClassName();
Intent i = new Intent(context, EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);


//receive
ClassName model = (ClassName) getIntent().getSerializableExtra("Editing");

And 

Class ClassName implements Serializable {
} 

希望这会有所帮助!!

答案 3 :(得分:1)

刚刚调用dataprovider的静态方法,它的工作原理如下

/**
 * method which is called on click 
 * i has reference present in fragment XML
 * 
 *  android:onClick="myMethod"
 * 
 * @param v
 */
public void myMethod(View v) {
    DataItem item = new DataItem(String.valueOf(new Random().nextInt()), String.valueOf(new Random().nextInt()), String.valueOf(new Random().nextInt()), new Random().nextInt());
    DataProvider.addItem(item );
}

但是你的数据提供者将数据存储在内存中,而不是存储在数据库中,我想你把它作为例子:)

尝试示例项目,其简单而有效 https://drive.google.com/open?id=0B2_EaCvs94pPeENtRlM4UURZYTQ