2016-05-18 70 views
1

我有以下Adapter一個ListView我可以在listView的接收元素中添加監聽器嗎?

public class gestionAdapter extends ArrayAdapter<Sav> { 

    public gestionAdapter(Context context, List<Sav> savs){ 
     super(context, 0, savs); 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null){ 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.adapter_gestion,parent, false); 
     } 
     Sav sav = getItem(position); 
     ViewHolderGestion viewHolder = (ViewHolderGestion) convertView.getTag(); 
     if(viewHolder == null){ 
      viewHolder = new ViewHolderGestion(); 
      viewHolder.titreSav = (TextView) convertView.findViewById(R.id.TitreSav); 
      viewHolder.intervenant = (TextView) convertView.findViewById(R.id.interv); 
      viewHolder.client = (TextView) convertView.findViewById(R.id.cli); 
      viewHolder.archive = (Button) convertView.findViewById(R.id.archive); 
      viewHolder.actif = (Button) convertView.findViewById(R.id.actif); 
      convertView.setTag(viewHolder); 
      viewHolder.archive.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(getContext(), "archive ", Toast.LENGTH_LONG).show(); 
       } 

      }); 
      viewHolder.actif.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(getContext(), "actif ", Toast.LENGTH_LONG).show(); 
       } 
      }); 
     } 
     viewHolder.titreSav.setText(sav.getTitre()); 
     viewHolder.intervenant.setText(sav.getIntervenant()); 
     viewHolder.client.setText(sav.getNomClient()); 
     return convertView; 
    } 
} 

你可能注意到了,有兩個buttons每一行。目前,我已將聽衆置於Adapter但是是否可以將這些聽衆置於接收視圖中,以便我可以使用這些按鈕來刷新我的視圖?

目前我已經試過使View公共的一些功能,但我並不滿意這個解決方案。

+0

我完全不理解你,但你也可以把你的根佈局的監聽器。您的適配器中的ViewHolder模式邏輯也不正確。 – Amir

+0

看來我無法訪問從顯示的ListView – RiddlerNewComer

+0

您可以把聽者根佈局的活動這些元素,把聽者的ListView控件 someListView.setOnItemClickListener(新OnItemClickListener(){ @覆蓋 公共無效onItemClick( AdapterView arg0,View arg1,int arg2, long arg3){TODO自動生成方法存根 Log.d(「############」,「Items」+ MoreItems [ arg2]); } }); – Rafal

回答

0

首先要提到你的viewHolder模式是不正確的,看看here

第二件事是,如果你想訪問你的rootLayout活動最簡單的方法是在你的適配器中定義Listener,然後通知你的活動。

例如定義按照你的適配器接口,並在適配器中創建實例:

rootView.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (onBackClickListener != null) { 
        onBackClickListener.onBackClick(); 
       } 
      } 
     }); 

在你的活動通過此:

private OnBackClickListener onBackClickListener; 

public interface OnBackClickListener { 
     void onBackClick(); 
    } 

那麼當你rootLayout在適配器中調用下面的方法點擊聽衆這樣的適配器:

MyAdapter adapter = new MyAdapter(context,new OnBackClickListener(){//rest of things}); 

現在在你的A當您的適配器的rootLayout單擊OnBackClickListener通知您時的活動。

RecyclerView的情況下,您可以找到完整的實現here

+1

非常感謝,我會嘗試這兩種方法,並看看最適合我的東西 – RiddlerNewComer

+0

兩種方法都是一樣的,祝你好運。 – Amir

0

您可以將偵聽器添加到您的活動,但您將無法指出其觀點一直clicked.Instead你可以做這樣的

public static class ViewHolderTwo extends RecyclerView.ViewHolder implements View.OnClickListener { 
    private TextView dictionaryWord; 
    private TextView dictionaryShortcut; 
    private CheckBox deleteWord; 
    public interface Listener 
    { public void viewOneclicked(); 
     public void viewTwoClicked(); 
    } 
    private Listener mListener; 


    public ViewHolderTwo(View v,Listener listener) { 
     super(v); 
     this.mListener = listener; 
     dictionaryWord = (TextView) v.findViewById(R.id.dictionaryWord); 
     dictionaryShortcut = (TextView) v.findViewById(R.id.dictionaryShortcut); 
     deleteWord = (CheckBox) v.findViewById(R.id.deleteWord); 
    } 

    @Override 
    public void onClick(View v) { 
     if(v == dictionaryWord) 
     { 
     mListener.viewOneClicked(); 
     return; 
     } 
} 

,讓您的活動實施監聽,並通過其引用在視圖的構造函數

+0

這樣我就可以在偵聽器中使用我的活動中的方法了? – RiddlerNewComer

+0

是的,您可以通過將其轉換爲活動並檢查空指針來使用活動方法。但是,如果活動不再存在於內存中,請確保您不會持有對偵聽器的任何引用 – user3300839

相關問題