2013-11-21 41 views
15

我有一个列表视图,其中包含我所有用户的列表。列表中的每个项目都是一个布局,其中有一个按钮用于显示AlertDialog以更改按钮标签的值。我怎样才能动态地添加一个单击事件到由listview适配器生成的按钮?如何将onclicklistener添加到列表视图适配器中的按钮?

这是我的适配器:

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()方法中这样做。为此,您将需要使用自定义适配器(如果您尚未这样做)。如果你能显示你的代码的相关部分会更好。

编辑: 该对话框将显示在您的活动。所以你可以创建一个接口来监听这个按钮的点击事件。

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()dialogonClick

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); 
相关问题