2015-07-23 5 views
0

У меня есть переменная currentDB в моем MainActivity.java. Я начинаю эту переменную с разных значений в зависимости от того, какой пользователь выбирает разные вкладки. Соответствующий код:Переменная Передача в Android?

@override 
public void tab_selector(View v) { 
    switch (v.getId()) { 
     case R.id.veg_tab: 
      setContentView(R.layout.vegetable); 
      currentListView = (ListView) findViewById(R.id.veg_list); 
      currentDB = "veg"; 
      break; 
     case R.id.meat_tab : 
      setContentView(R.layout.meat_drawer); 
      currentListView = (ListView) findViewById(R.id.meat_list); 
      currentDB = "meat"; 
      break; 
     default: 
      break; 
    } 

    currentList = mydb.getAllItems(currentDB); // Definition below, works perfect 
    itemAdder2.updateData(currentList); 
    currentListView.setAdapter(itemAdder2); 
} 

У меня есть метод в DBHelper.java который в идеале принимает имя таблицы и идентификатор элемента в качестве входных данных и удаляет соответствующую строку из указанной таблицы.

public Integer deleteItem (String dbName, int id) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete(dbName, 
      "id = ? ", 
      new String[] { Integer.toString(id) }); 
} 

Это еще одна функция для получения всех данных из таблицы, и она отлично работает.

public ArrayList<String> getAllItems(String dbName) 
{ 
    ArrayList<String> array_list = new ArrayList<String>(); 

    //hp = new HashMap(); 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select * from " + dbName, null); 
    res.moveToFirst(); 

    while(res.isAfterLast() == false){ 
     array_list.add(res.getString(res.getColumnIndex(COLUMN_NAME))); 
     res.moveToNext(); 
    } 
    return array_list; 
} 

Я создал настроенный ListViewAdapter для того, чтобы отобразить данные, хранящиеся в базах данных. Я предоставил соответствующие кнопки для редактирования и удаления с помощью функции onClick(). Теперь моя проблема заключается в том, чтобы определить, какая база данных должна указывать внутри этого ListViewAdapter. Я не могу передать currentDB информацию от MainActivity.java до ListViewAdapter.java. Пожалуйста помоги. Заранее спасибо. Фрагмент кода для ListViewAdapter.java следующим образом:

public class ListViewAdapter extends BaseAdapter { 

Context mContext; 
LayoutInflater mInflater; 
ArrayList mArray; 
DBHelper mydb; 
String dbName; 

public ListViewAdapter(Context context, LayoutInflater inflater) { 
    mContext = context; 
    mInflater = inflater; 
    mArray = new ArrayList(); 
    mydb = new DBHelper(mContext); 
    dbName = "veg"; // Didn't know what to do, tried to initialize manually, din't work :(
} 

@Override 
public int getCount() { 
    return mArray.size(); 
} 

@Override 
public Object getItem(int position) { 
    return mArray.get(position); 
} 

@Override 
public long getItemId(int position) { 
    // your particular data set uses String IDs 
    // but you have to put something in this method 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    ViewHolder holder; 

    // check if the view already exists 
    // if so, no need to inflate and findViewById again! 
    if (convertView == null) { 

     // Inflate the custom row layout from your XML. 
     convertView = mInflater.inflate(R.layout.list_item, null); 

     // create a new "Holder" with subviews 
     holder = new ViewHolder(); 
     holder.itemNameView = (TextView) convertView.findViewById(R.id.item_name); 
     holder.itemExpiryView = (TextView) convertView.findViewById(R.id.item_expiry); 

     // Taking care of the buttons 
     holder.editButton = (Button) convertView.findViewById(R.id.button_edit); 
     holder.deleteButton = (Button) convertView.findViewById(R.id.button_delete); 

     // hang onto this holder for future recycling 
     convertView.setTag(holder); 
    } else { 

     // skip all the expensive inflation/findViewById 
     // and just get the holder you already made 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    // Set listener on the buttons 
    holder.editButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(mContext, "Edit Button CLicked", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    holder.deleteButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      deleteItem(position);   // Potential problem here?? 
      Toast.makeText(mContext, "Item deleted", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    // More code after this 

    // Grab the title and author from the JSON 
    String name = ""; 
    String expiry = "7 days"; 

    // Write appropriate codes to obtain values for the string variables above 
    name = (String) getItem(position); 

    // Send these Strings to the TextViews for display 
    holder.itemNameView.setText(name); 
    holder.itemExpiryView.setText(expiry); 

    return convertView; 
} 

// this is used so you only ever have to do 
// inflation and finding by ID once ever per View 
private static class ViewHolder { 
    public TextView itemNameView; 
    public TextView itemExpiryView; 
    public Button editButton; 
    public Button deleteButton; 
} 

public void updateData(ArrayList arrayPassed) { 
    // update the adapter's data set 
    mArray = arrayPassed; 
    notifyDataSetChanged(); 
} 

public void deleteItem(int pos){ 
    mArray.remove(pos);   // Ideally, shouldn't be there 
    mydb.deleteItem(dbName, pos); // Here I need to pass the appropriate dbName 
    // mArray = mydb.getAllItems(); // Ideally should be there 
    notifyDataSetChanged(); 
} 

} 

Пожалуйста, дайте мне знать, если вам нужно что-нибудь лишнего. Любые перефразировки или темы, изменения тегов приветствуются. Быть нобом, не способным, как точно передать. Ценю вашу помощь. :)

ответ

1

Создать публичный метод в адаптере, чтобы установить имя Db, Например: в классе ListViewAdapter,

public void setDbName(String dbName){ 
this.dbName = dbName; 
} 

А на tab_selector (View v) метод установить дб Имя к адаптеру

Например:

@override 
public void tab_selector(View v) { 
    switch (v.getId()) { 
     case R.id.veg_tab: 
      setContentView(R.layout.vegetable); 
      currentListView = (ListView) findViewById(R.id.veg_list); 
      currentDB = "veg"; 
      break; 
     case R.id.meat_tab : 
      setContentView(R.layout.meat_drawer); 
      currentListView = (ListView) findViewById(R.id.meat_list); 
      currentDB = "meat"; 
      break; 
     default: 
      break; 
    } 

    currentList = mydb.getAllItems(currentDB); 
    itemAdder2.updateData(currentList); 
    currentListView.setAdapter(itemAdder2); 
    itemAdder2.setDbName(currentDB); 
} 
+0

Спасибо большое. Просто, легко и прекрасно работает. :) – Reutzesen

+0

Добро пожаловать, друг, рад услышать это :) –

0

Это может быть плохая практика, но как насчет того, чтобы переменная currentDB была общедоступной и статической, поэтому вы можете получить к ней доступ из другого класса!

0

Я думаю, что вы можете использовать SharedPreferences здесь

0

Для меня это выглядит как ваши просто пытаюсь отправить переменную String, от одного вида деятельности к другому классу. Кроме того, отправляемая строка не является конфиденциальной информацией. Теперь это очень просто и может быть сделано с помощью LocalBroadCastManager. Использование было хорошо обсуждается here .

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

  • Нет связанных вопросов^_^