2013-11-21 44 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); 
相關問題