2013-11-21 2 views
15

У меня есть список, содержащий список всех моих пользователей. Каждый элемент из списка - это макет с кнопкой, чтобы показать AlertDialog, чтобы изменить значение метки кнопки. Как я могу динамически добавлять событие с кликом к этой кнопке, которая генерируется адаптером listview?Как добавить onclicklistener к кнопке внутри адаптера listview?

Это мой адаптер:

public class PerfilAdapter extends BaseAdapter { 
Context mContext; 
LayoutInflater mLayoutInflater; 
List<PerfilBean> listaPerfiles = new ArrayList<PerfilBean>(); 
public Settings01 set=new Settings01(); 
public PerfilAdapter(Context context,List<PerfilBean> lista) { 
    mContext = context; 
    mLayoutInflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    listaPerfiles=lista; 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return listaPerfiles.size(); 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return listaPerfiles.get(position); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    RelativeLayout itemView; 

    if (convertView == null) { 
     itemView = (RelativeLayout) mLayoutInflater.inflate(
       R.layout.item_perfil, parent, false); 
    } else { 
     itemView = (RelativeLayout) convertView; 
    } 
    // obtengo los valores de la vista 
    Button moneda = (Button) itemView.findViewById(R.id.Moneda); 
    TextView titulo = (TextView) itemView.findViewById(R.id.Titulo); 
    TextView nombredesc = (TextView) itemView.findViewById(R.id.txtNombre); 
    TextView descripcion = (TextView) itemView.findViewById(R.id.txtDescripcion); 
    String nombreM = Metodos.monedas[listaPerfiles.get(position).getPerfil_tipoMoneda()]; 
    moneda.setText(nombreM); 
    titulo.setText(listaPerfiles.get(position).getPerfil_nombre()); 
    nombredesc.setText(listaPerfiles.get(position).getPerfil_nombreSec()); 
    descripcion.setText(listaPerfiles.get(position).getPerfil_texto()); 

    return itemView; 

} 
// metodo parahacer la vista de la celda 


    public void actualizaDatosLista(List<PerfilBean> listaPerfilesM) { 
     for(int i=0;i<listaPerfilesM.size();i++){ 
      Log.d("ITEM "+i,listaPerfilesM.get(i).getPerfil_nombreSec()); 
     } 
     listaPerfiles = listaPerfilesM; 
     notifyDataSetChanged(); 
    }} 

и это моя активность:

public class Settings01 extends Activity implements OnClickListener { 

private List<PerfilBean> lst; 
private PerfilDAO perfildao; 
private PerfilAdapter perfiladapter; 
private ListView lstPerfiles; 

public void changeMoneda(final int position) { 
    int x = 0; 

    AlertDialog.Builder builder = new AlertDialog.Builder(Settings01.this); 
    builder.setTitle("Seleccione Tipo de Distribuidor"); 
    builder.setItems(R.array.moneda, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int item) { 
      lst.get(position).setPerfil_tipoMoneda(item); 
      perfiladapter = new PerfilAdapter(getApplicationContext(), lst); 
      lstPerfiles.setAdapter(perfiladapter); 
      dialog.dismiss(); 
     } 

    }); 
    builder.create(); 
    builder.show(); 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.settings01); 
    lstPerfiles = (ListView) findViewById(R.id.lstSettings); 
    perfildao = new PerfilDAOImplDB(Settings01.this); 
    lst = new ArrayList<PerfilBean>(); 
    lst = perfildao.getAll(); 
    perfiladapter = new PerfilAdapter(getApplicationContext(), lst); 
    Log.d("Info", "En Settings"); 
    lstPerfiles.setAdapter(perfiladapter); 



} 

@Override 
public void onClick(View v) { 
    Log.d("Info", "derp" + v.getId()); 

}} 

Это расположение, что мой адаптер в настоящее время с помощью:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<TextView 
    android:id="@+id/Titulo" 
    android:layout_width="wrap_content" 
    android:layout_height="40dp" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="150dp" 
    android:gravity="left|center_vertical" 
    android:textColor="@color/Negro" 
    android:text="derp" /> 

<TextView 
    android:id="@+id/lblTipoMoneda" 
    android:layout_width="120dp" 
    android:layout_height="40dp" 
    android:layout_toLeftOf="@+id/Moneda" 
    android:gravity="left|center_vertical" 
    android:text="Tipo de moneda: " /> 

<Button 
    android:id="@+id/Moneda" 
    android:layout_width="160dp" 
    android:layout_height="40dp" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="150dp" 
    android:gravity="left|center_vertical" 
    android:background="@color/Blanco" 
    android:textColor="@color/Negro" 
    android:text="Peso argentino" /> 

<ImageView 
    android:id="@+id/Separador" 
    android:layout_width="match_parent" 
    android:layout_height="2.5dp" 
    android:layout_below="@+id/Moneda" 
    android:layout_marginLeft="150dp" 
    android:layout_marginRight="150dp" 
    android:background="@color/Negro" /> 

<TextView 
    android:id="@+id/Nombre" 
    android:layout_width="wrap_content" 
    android:layout_height="40dp" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/Separador" 
    android:layout_marginLeft="150dp" 
    android:layout_marginTop="10dp" 
    android:clickable="true" 
    android:gravity="left|center_vertical" 
    android:onClick="changeMoneda" 
    android:text="Nombre :" /> 

<EditText 
    android:id="@+id/txtNombre" 
    android:layout_width="200dp" 
    android:layout_height="40dp" 
    android:layout_below="@+id/Separador" 
    android:layout_marginTop="10dp" 
    android:layout_toRightOf="@+id/Nombre" 
    android:background="@drawable/fondotxt" 
    android:textColor="@color/Negro" 
    android:inputType="text" /> 

<TextView 
    android:id="@+id/lblTitulo" 
    android:layout_width="360dp" 
    android:layout_height="24dp" 
    android:layout_below="@+id/txtNombre" 
    android:layout_marginTop="10dp" /> 

<EditText 
    android:id="@+id/txtDescripcion" 
    android:layout_width="match_parent" 
    android:layout_height="200dp" 
    android:layout_below="@+id/lblTitulo" 
    android:layout_marginLeft="150dp" 
    android:layout_marginRight="150dp" 
    android:textColor="@color/Negro" 
    android:gravity="left|center_vertical" /> 

<ImageView 
    android:id="@+id/imgPicturefantes" 
    android:layout_width="100dp" 
    android:layout_height="150dp" 
    android:layout_below="@+id/txtDescripcion" 
    android:layout_toLeftOf="@+id/lblFotoAntes" 
    android:src="@drawable/what" /> 

<ImageView 
    android:id="@+id/imgPicturefdespues" 
    android:layout_width="100dp" 
    android:layout_height="150dp" 
    android:layout_below="@+id/txtDescripcion" 
    android:layout_marginLeft="50dp" 
    android:layout_toRightOf="@+id/centerPoint" 
    android:src="@drawable/what" /> 

<TextView 
    android:id="@+id/lblFotoDespues" 
    android:layout_width="120dp" 
    android:layout_height="50dp" 
    android:layout_below="@+id/txtDescripcion" 
    android:layout_marginTop="50dp" 
    android:layout_toRightOf="@+id/imgPicturefdespues" 
    android:gravity="center" 
    android:text="Foto despues: " 
    android:textSize="18sp" /> 

<ImageButton 
    android:id="@+id/btnDespuesF" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@+id/btnAntesF" 
    android:layout_toRightOf="@+id/imgPicturefdespues" 
    android:background="@drawable/btnupload" /> 

<TextView 
    android:id="@+id/centerPoint" 
    android:layout_width="2dp" 
    android:layout_height="2dp" 
    android:layout_below="@+id/txtDescripcion" 
    android:layout_centerHorizontal="true" /> 

<TextView 
    android:id="@+id/lblFotoAntes" 
    android:layout_width="100dp" 
    android:layout_height="50dp" 
    android:layout_below="@+id/txtDescripcion" 
    android:layout_marginRight="50dp" 
    android:layout_marginTop="50dp" 
    android:layout_toLeftOf="@+id/centerPoint" 
    android:gravity="center" 
    android:text="Foto antes: " 
    android:textSize="18sp" /> 

<ImageButton 
    android:id="@+id/btnAntesF" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/lblFotoAntes" 
    android:layout_marginRight="75dp" 
    android:layout_toLeftOf="@+id/centerPoint" 
    android:background="@drawable/btnupload" /> 

+0

Посмотрите здесь http: // stackoverflow.com/a/10357063/1868912 – Dima

ответ

29

Вы можете сделайте это в методе getView() вашего адаптера. Для этого вам нужно будет использовать пользовательский адаптер (если вы этого уже не делаете). Будет лучше, если вы сможете показать соответствующие части вашего кода.

EDIT: Диалог будет отображаться вашей деятельностью. Таким образом, вы можете создать интерфейс для прослушивания этого события нажатия кнопки.

public interface BtnClickListener { 
    public abstract void onBtnClick(int position); 
} 

Позвольте вашему пользовательскому адаптеру получить его как вход.

private BtnClickListener mClickListener = null; 
public PerfilAdapter(Context context, List<PerfilBean> lista, BtnClickListener listener) { 
    mContext = context; 
    mLayoutInflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    listaPerfiles=lista; 
    mClickListener = listener; 
} 

Теперь вы можете просто установить в getView() нормальный onClickListener ниже

Button moneda = (Button) itemView.findViewById(R.id.Moneda); 
moneda.setTag(position); //For passing the list item index 
moneda.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if(mClickListener != null) 
      mClickListener.onBtnClick((Integer) v.getTag());     
    } 
}); 

Пусть ваша деятельность проходит необходимую BtnClickListener как часть создания адаптера.

perfiladapter = new PerfilAdapter(getApplicationContext(), lst, new BtnClickListener() { 

    @Override 
    public void onBtnClick(int position) { 
     // TODO Auto-generated method stub 
     // Call your function which creates and shows the dialog here 
     changeMoneda(position); 
    } 

}); 

Предполагая, что lst.get(position).setPerfil_tipoMoneda(item); изменяет текст, который будет использоваться в качестве текста кнопки правильно, вы должны просто позвонить perfiladapter.notifyDataSetChanged() в onClick вашего dialog (В настоящее время вы создаете адаптер снова, не требуется).

public void onClick(DialogInterface dialog, int item) { 
    lst.get(position).setPerfil_tipoMoneda(item); 
    perfiladapter.notifyDataSetChanged(); 
    dialog.dismiss(); 
} 

Надеюсь, он будет работать так, как вы ожидаете.

+0

У меня есть пользовательский адаптер, но мне нужен адаптер, чтобы кнопка Moneda должна отображаться как опция alerdialog, чтобы показать параметр после того, как пользователь выберет метку кнопки, чтобы изменить, что зависит от выбора. – user2981113

+1

Спасибо много человек ... Вы объяснили это очень хорошо. Я тоже застрял в подобной проблеме, но вы спасли меня .. –

+0

Его не работает для меня почему-то .. – God

0

В моем случае я должен был добавить этот атрибут в ListView:

<ListView 
... 
android:clickable="true" 
... 
</ListView> 

И в адаптере просто добавить на клик слушателя в окне кнопки.

wrapper.getButtonHi().setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      DebugUtils.logDebug("Clickeado :: "+ mContact.getUserId()); 
     } 
}); 

Ее важно установить окончательный переменные:

public View getRowView(final int position, View convertView, ViewGroup parent) { 
    final BrowseContactItemWrapper wrapper; 
    final UserModel mContact = lstContact.get(position); 
    ..... 
} 
0

Просто небольшая подстройка, чтобы обновить визуализатор снаружи.

final FinalMenuListAdapter adapter = this; 

viewHolder.deleteItem.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if(mClickListener != null) 
     mClickListener.onBtnClick((MenuItemObject)v.getTag(),adapter); 
    } 
}); 
final MenuItemObject menuItemObject = getItem(position); 

viewHolder.deleteItem.setTag(menuItemObject); 
Смежные вопросы