2013-09-12 5 views
0

У меня есть один пользовательский адаптер, который имеет один флажок и один текстовый файл. Я хочу, чтобы пользователь щелкнул по одной строке. Появится диалоговое окно с предупреждением. Пользователь вводит данные. Я использую следующий код в действии и отлично работал:Диалог в пользовательском адаптере в android

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View layout = inflater.inflate(R.layout.floordialog, 
      (ViewGroup) findViewById(R.id.floordialog)); 

    floornum = (EditText) layout.findViewById(R.id.floordialog_floornumber); 
    unitnum = (EditText) layout.findViewById(R.id.floordialog_unitnumber); 
    Button next = (Button) layout.findViewById(R.id.floordialog_next); 
    Button cancel = (Button) layout.findViewById(R.id.floordialog_cancel); 


    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("floors"); 
    builder.setView(layout); 
    builder.setCancelable(false); 
    builder.create(); 

    flooralert = builder.create(); 
    flooralert.show(); 

    next.setOnClickListener(this); 
    cancel.setOnClickListener(this); 

, но я не могу использовать в MyCustomAdapter, потому что я Dont расширить деятельность, как можно решить мою проблему? и это мой CustomAdapter

 public MyadapterForListFloor(Activity a, int textViewResourceId, 
     ArrayList<Integer> Floornum) { 
    super(); 
    unitdialog = new UnitDialog(); 
    this.entries = Floornum; 
    this.activity = a; 
} 

@Override 
public int getCount() { 

    return entries.size(); 
} 

@Override 
public Object getItem(int arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int arg0) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

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

    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.unitview, null); 
     holder = new ViewHolder(); 
     holder.text = (TextView) v.findViewById(R.id.UnitTextview); 
     holder.checked = (CheckBox) v.findViewById(R.id.unitCheckbox); 

     v.setTag(holder); 

     holder.checked.setTag(entries.get(position)); 
     holder.text.setTag(entries.get(position)); 

     holder.checked.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ViewHolder obj = new ViewHolder(); 
       obj.checked = (CheckBox) v.findViewById(R.id.unitCheckbox); 

       getid = (Integer) v.getTag(); 

       if (isChecked(getid)) 
       { 
        obj.checked.setChecked(true); 
        unitdialog.DialogForFloor(); 
        Urban.selectedRow.add(getid); 
       } 
       else 
        Log.d("in else onclick", "**"); 
      } 

      private boolean isChecked(int getid) { 

       for (int i = 0 ; i< Urban.selectedRow.size() ; i++) 
       { 
        if (Urban.selectedRow.get(i)== getid) 
         return false; 
       } 
       return true; 
      } 

     }); 
     holder.text.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       holder.checked.performClick(); 
      } 
     }); 
    } 
    else 
    { 
     ((ViewHolder) v.getTag()).checked.setTag(entries.get(position)); 
     holder = (ViewHolder) v.getTag(); 

     getid = (Integer) holder.checked.getTag(); 

     Log.d("geti is", String.valueOf(getid)); 

     if (checkBoxRefresh(getid)) 
      holder.checked.setChecked(true); 


     else 
      holder.checked.setChecked(false); 

    } 

    final String str = String.valueOf(entries.get(position)); 
    if (str != null) { 

     holder.text.setText(str); 

    } 

    return v; 
} 

private boolean checkBoxRefresh(int FloorNum) { 
    Log.d("urban.selectedrow.size is", String.valueOf(Urban.selectedRow.size())); 
    for (int i = 0 ; i < Urban.selectedRow.size() ; i++) 
    { 
     if (Urban.selectedRow.get(i) == FloorNum) 
      return true; 
    } 
    return false; 

} 

static class ViewHolder { 
    TextView text; 
    CheckBox checked; 

} 

}

+0

Пройди свой контекст MyCustomAdapter. Покажите свой код для MyCustomAdapter .. – nedaRM

+0

См. Раздел «Редактировать код» – mary

+0

Итак, в чем проблема? Что вы хотите сделать, чего не можете сделать? – nedaRM

ответ

0

Просто пройти необходимый Context к вашим adapter от деятельности и использовать этот контекст в вашем dailog.

Здесь @

AlertDialog.Builder builder = new AlertDialog.Builder(here will be your context which is from activity); 

Как вы упоминаете в своем комментарии, что вы должны диалоговыми, и вы должны сделать findviewById.

вы можете сделать, как этот @ (это просто пример)

Обновлено

AlertDialog.Builder builder = new AlertDialog.Builder(your_activity_context); 
View view = your_activity_context.getLayoutInflater().inflate(R.layout.dialog_layout, null); 
builder.setView(view); 

Button button = (Button) view.findViewById(R.id.dialog_ok); 
+0

Мне нужен LayoutInflater для ссылки на мой edittext в alertdialog, можете ли вы объяснить мне, как создать LayoutInflater и View, потому что findviewbyid не распознает. – mary

+0

проверить обновленный ответ ~ – RobinHood

+0

dont работал для меня. – mary

2

Попробуйте это:

LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

Вы уже умирала свой контекст для MyCustomAdapter.

+0

это сработало, но как определить свой вид? i use final View layout = inflater.inflate (R.layout.floordialog, \t \t \t \t (ViewGroup) findViewById (R.id.floordialog)); – mary

+0

То же самое. activity.findViewById. – nedaRM

+0

, но расположение действий и alertDialog макет отделен, я не думаю, что его работа !!! – mary

1

В классе CustomAdapter вам нужно объявить переменную уровня класса mContext

Context mContext; 

Создать конструктор:

public AdapterAudio(Context mContext) { 
    super(); 
    this.mContext = mContext; 
} 

При вызове CustomAdapter от деятельности, "Activity_Main.this" является Context вам нужно

CustomAdapter adapter = new CustomAdapter(Activity_Main.this); 

Не пропустите getApplicationContext(), нам необходимо передать MainActivity.this конструктору AlertDialog class необходимо, чтобы показать предупреждение.

Если вы передаете getApplicationContext() или getContext(), то вы получите следующее сообщение об ошибке:

W/System.err: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

Теперь пройти mContext, чтобы показать предупреждение:

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