2016-12-30 8 views
1

У меня есть класс Java, который добавляет данные в моей БД SQLite следующим образом:Вызов конкретного метода onClickListener

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); 
    } 
    

Вопрос

Как еще я в состоянии импортировать addItem, чтобы иметь возможность использовать его в onClick методе внутри моей второй активности?

ответ

1

Вы должны попробовать, как создать отдельный метод и называя этот метод в OnClickListener

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

Или непосредственно вызвать этот метод из вашего OnClickListener вроде бы,

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

А также проверить импорт для AddItem метод

+0

Я пробовал оба из них и ни один из них не добавляет данные в базу данных. У меня есть как DataProvider, так и DataItem, импортированные в текущую активность. Ранее я также импортировал DataProvider.addItem, когда я сам вызывал 'addItem'. – Leb

2

Как я вижу, ваша структура данных статична, поэтому ее можно использовать везде после ее импорта. Это не нужно создавать какие-либо методы управления, поставщик данных может быть непосредственно использован везде, так и в слушателе:

DataProvider.addItem (/* new item */) 
+0

Странная вещь, однако, что 'DataProvider.addItem' не добавляет никаких данных в БД. – Leb

+0

Как я вижу, есть только добавление элемента в список и карту. Где db-код? –

+0

Это класс 'DataItem', который довольно длинный для добавления сюда. Как вы видите, вызов 'addItem' из класса' DataProvider' успешно добавил строки в db. – Leb

2

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

Моего Suggestions-

1) Сделать DataProvider класса абстрактным, а затем пусть главный класс второй деятельности продлить. Затем просто переопределите метод там во втором действии.

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 { 
} 

Надеюсь, что это поможет!

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); 
} 

однако ваш DataProvider хранит данные в памяти, а не в БД, я думаю, что вы положили его в качестве примера :)

попробуйте образец проекта, его простой и рабочий https://drive.google.com/open?id=0B2_EaCvs94pPeENtRlM4UURZYTQ

Смежные вопросы