2016-01-29 3 views
1

Я пытаюсь изменить значения, отображаемые в виде списка, в зависимости от значения из поиска. В настоящее время listview заполняется курсором (значения whos я не думаю, что могу изменить один раз в списке). Я пытаюсь добавить курсор в ArrayList перед добавлением в список.Android ArrayList Обновление значений

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

Пример содержит элемент управления ListView 2 колонки (имя и значение), это то, что возвращается к курсору и добавлены в ArrayList. Когда указатель поиска находится на значении (например, 2), все значение в списке arrayList будет умножено на 2. Они должны обновляться только в списке, а не в базе данных.

Может кто-нибудь помочь столкнуть меня в правильном направлении, чтобы исправить мою ArrayList и применяя SeekBar изменения

Курсор и ArrayList

 final Cursor ings = adapter.getIngs(Code); 
    ingredients.moveToFirst(); 
    ArrayList<String> IngsList = new ArrayList<String>(); 
    while(!ings.isAfterLast()) 
    { 
     Ings.add(ings.getString(ings.getColumnIndex("name"))); 
     Ings.add(ings.getInt(ings.getColumnIndex("measurement"))); 
     Ings.add(ings.getString(ings.getColumnIndex("unit"))); 
    } 
    ings.close(); 


    String[] columns = new String[] {adapter.KEY_NAME, adapter.KEY_MEASUREMENT, adapter.KEY_UNIT}; 
    int[] to = new int[] {R.id.Name, R.id.Measurement, R.id.Unit}; 
    final SimpleCursorAdapter Adpater = new SimpleCursorAdapter(this,R.layout.row5, ingredients, ingredient_columns, to, 0); 
    ListView Required = (ListView) findViewById(R.id.Required); 
    Required.setAdapter(Adpater); 

SeekBar

 seekBar = (SeekBar) findViewById(R.id.servingSeek); 
    textView = (TextView) findViewById(R.id.actualServing); 
    // Initialize the textview with '0' 
    textView.setText("Serving Size:" + seekBar.getProgress()); 
    seekBar.setOnSeekBarChangeListener(
      new SeekBar.OnSeekBarChangeListener() { 
       int progress = 0; 

       @Override 
       public void onProgressChanged(SeekBar seekBar, 
               int progresValue, boolean fromUser) { 
        progress = progresValue; 
        textView.setText("Serving Size:" + progress); 
        //alter cursor values 

        //update cursor 

       } 
+0

Вы можете создать и использовать пользовательский адаптер вместо 'SimpleCursorAdapter'. – Titus

+0

Какая разница? – JJSmith

+0

Вы можете сделать адаптер, который работает с 'ArrayList' вместо' Cursor' таким образом, что вы сможете добавлять/удалять элементы из 'ListView'. – Titus

ответ

0

@JJSmith , если вы хотите носить вещи в ArrayList, было бы лучше, если вы сделать класс, который будет представлять собой строку в базе данных с переменной экземпляра вы хотите что-то вроде этого,

class Item{ 
    private String name; 
    private float measurment; 
    private float unit; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public float getMeasurment() { 
     return measurment; 
    } 

    public void setMeasurment(float measurment) { 
     this.measurment = measurment; 
    } 

    public float getUnit() { 
     return unit; 
    } 

    public void setUnit(float unit) { 
     this.unit = unit; 
    } 
} 

при чтении данных из курсора .. нужно реализовать вещи что-то вроде этого

ArrayList<Item> items = new ArrayList<>(); 
    Cursor cursor = //make a call to database 
    if (cursor.moveToFirst()) { 
     Item item; 
     for (int i = 0; i < cursor.getCount(); i++) { 
      item = new Item(); 
      item.setName("read data from cursor and add it here"); 
      item.setMeasurment("read data from cursor and add it here"); 
      item.setUnit("read data from cursor and add it here"); 
      myModels.add(item); 
      if (!cursor.moveToNext()) { 
       break; 
      } 
     } 
    } 

Update теперь, когда у вас есть ArrayList типа Item's вы можете обеспечить это в пользовательский адаптер вы сделали бы, вот пример того, как сделать это, вы можете посмотреть на код в Github

ListView listView = (ListView)findViewById(R.id."listview id from the layout"); 

сделать пользовательские Adapter и предоставить список для этого, и установите адаптер в listview

listView.setAdapter(adapter) 

теперь то, что вас интересует, когда вы меняете позицию SeekBar, вы можете получить предмет из ArrayList и изменить значение, которые вы хотите

после изменения данных в ArrayList, вызовите notifyDataSetChanged() на адаптере

adapter.notifyDataSetChanged(); 

и вы сделали

+0

интересно, так что, если бы я хотел изменить значение измерения, я бы просто сделал это в функции 'setMeasurement'? Также как бы передать все значения arrayList в новый класс? Извините за все вопросы, просто хочу убедиться, что я правильно понял – JJSmith

+0

@JJSmith, я обновил ответ, надеюсь, это поможет –

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