2016-08-06 7 views
2

Итак, я работаю над Android-приложением и пытаюсь добавить кнопки, которые будут программно активироваться с помощью нажатия кнопки Dialog.Настройка Текст кнопки программно автоматически будет обновляться Индекс

Когда я добавляю OnClickListener на эти кнопки, я либо получаю текст из последнего Button добавил, ошибка утверждая, что есть IOOBException при вызове tv1.setText (...) - неверный индекс 7, размер 7, или просто ничего не прошло. Кто-нибудь знает, как я могу установить каждый Button, чтобы создать новый Dialog с уникальной информацией для каждой кнопки?

Отрывок кода, который ставит задачу:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_all_streaks); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    prefs = getSharedPreferences("carter.streakly", Context.MODE_PRIVATE); 
    editor = prefs.edit(); 

    db = new DatabaseHelper(this); 
    mTableLayout = (TableLayout) findViewById(R.id.all_streak_table); 
    res = db.getAllData(); 
    if(res.getCount() ==0) { 
     //show message 
     showMessage("Error", "Nothing found"); 
     return; 
    } 

    streakArrayList = new ArrayList<>(); 

    int counter = 0; 
    while (res.moveToNext()){ 
     streakArrayList.add(new Streak(Integer.parseInt(res.getString(0)), res.getString(1), res.getString(2), res.getString(3), Integer.parseInt(res.getString(4)))); 
     counter++; 
    } 

    LinearLayout.LayoutParams btnParams = new LinearLayout.LayoutParams(200, 200); 
    btnParams.setMargins(200, 30, 80, 30); 

    LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ActionBar.LayoutParams.WRAP_CONTENT); 
    tvParams.setMargins(100, 0, 0, 0); 

    i = 0; 
    while (i < counter){ 
     if(i%2==0){ 
      mTableRow = new TableRow(this); 
      mTableLayout.addView(mTableRow); 
     } 

     ll = new LinearLayout(this); 
     ll.setOrientation(LinearLayout.VERTICAL); 
     mTableRow.addView(ll); 

     Button btn = new Button(this); 
     btn.setText(""+streakArrayList.get(i).getDaysKept()); 
     btn.setId(i); 
     btn.setBackground(getResources().getDrawable(R.drawable.round_button)); 
     btn.setLayoutParams(btnParams); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Dialog dialog = new Dialog(AllStreaks.this); 
       dialog.setContentView(R.layout.activity_enlarged); 

       tv1 = (TextView) dialog.findViewById(R.id.activity_enlarge_icon); 
       tv1.setText(streakArrayList.get(i-1).getActivityName()); 
       dialog.show(); 
       /* 
       Intent intent = new Intent(AllStreaks.this, EnlargedActivity.class); 
       intent.putExtra("passName", streakArrayList.get(view.getId()).getActivityName()); 
       startActivity(intent);*/ 
      } 
     }); 

     ll.addView(btn); 

     TextView tv = new TextView(this); 
     tv.setText(streakArrayList.get(i).getActivityName()); 
     tv.setId(i); 
     tv.setGravity(Gravity.CENTER | Gravity.BOTTOM); 
     tv.setTextSize(20); 
     tv.setLayoutParams(tvParams); 
     ll.addView(tv); 

     i++; 
    } 
} 

public void showMessage(String title, String message){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setCancelable(true); 
    builder.setTitle(title); 
    builder.setMessage(message); 
    builder.show(); 
} 
+0

Можете ли вы назвать 'res.moveToFirst()' перед вычислением ваш счетчик? – Shaishav

+0

Не могли бы вы вообще разобраться? Где я должен называть res.moveToFirst() и почему? Спасибо!! –

+0

Добавьте moveToFirst сразу после того, как у вас есть счетчик = 0 перед циклом while. – Shaishav

ответ

0

Есть много проблем с вашим кодом.

Прежде всего, вы используете глобальный экземпляр как ваших TableRow, так и LinearLayout. Это означает, что вы перезаписываете их на каждой итерации своего цикла, поэтому в конце будут видны только значения из последней итерации.

Вы указываете одинаковые идентификаторы как для вашего Button, так и для вашего TextView, они должны быть уникальными.

Использование переменной counter совершенно не нужно, вы можете просто использовать цикл for для прохождения через streakArrayList.

Что-то вроде этого:

for (Streak streak : streakArrayList) { 
    TableRow mTableRow = new TableRow(this); 
    LinearLayout ll = new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 

    final String activityName = streak.getActivityName(); 

    Button btn = new Button(this); 
    btn.setText("" + streak.getDaysKept()); 
    btn.setId(aUniqueId); 
    btn.setBackground(getResources().getDrawable(R.drawable.round_button)); 
    btn.setLayoutParams(btnParams); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Dialog dialog = new Dialog(AllStreaks.this); 
      dialog.setContentView(R.layout.activity_enlarged); 

      tv1 = (TextView) dialog.findViewById(R.id.activity_enlarge_icon); 
      tv1.setText(activityName); 
      dialog.show(); 
     } 
    }); 

    TextView tv = new TextView(this); 
    tv.setText(activityName); 
    tv.setId(anotherUniqueId); 
    tv.setGravity(Gravity.CENTER | Gravity.BOTTOM); 
    tv.setTextSize(20); 
    tv.setLayoutParams(tvParams); 

    ll.addView(btn); 
    ll.addView(tv); 

    mTableRow.addView(ll); 
    mTableLayout.addView(mTableRow); 
} 
Смежные вопросы