2016-05-18 4 views
1

listViewの受信要素にリスナーを追加できますか?私は、次の<code>Adapter</code>と<code>ListView</code>を持って

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; 
    } 
} 

あなたが気づくように、各列には2つのbuttonsがあります。現時点では、私はリスナーを入れましたAdapterしかし、これらのリスナーを受信ビューに入れることは可能ですか?これらのボタンを使用してViewをリフレッシュすることはできますか?

現時点では、私のビューの一部の機能を公開しようとしましたが、私はその解決策に全く満足していません。

+0

私はあなたを完全に理解していませんが、あなたのルートレイアウトにもリスナーを置くことができます。また、アダプタのViewHolderパターンロジックが正しくありません。 – Amir

+0

私がListViewコントロール someListView.setOnItemClickListener(新OnItemClickListener(){ @Override ます。public void onItemClick(上のリスナーを入れて、あなたがルートレイアウト上のリスナーを置くことができるいずれかのListView – RiddlerNewComer

+0

を表示するActivityから、これらの要素にアクセスすることはできませんようですアダプタビュー arg0、ビューarg1、int arg2、 長いarg3){ // TODO自動生成メソッドスタブ Log.d( "##########"、 "Items" + MoreItems [ arg2]); } }); – Rafal

答えて

0

最初にあなたのviewHolderパターンが正しくないと言えば、hereを見てください。

2番目のことは、最も簡単な方法であなたのrootLayoutにアクセスしたいのであれば、あなたのアダプターにListenerを定義し、それをあなたのアクティビティーに通知することです。例えば

あなたのアダプタで、次のインターフェイスを定義し、あなたのアダプタでインスタンスを作成します。

private OnBackClickListener onBackClickListener; 

public interface OnBackClickListener { 
     void onBackClick(); 
    } 

次に、あなたのrootLayoutは方法以下のアダプタの呼び出しでクリックしたとき:あなたの活動で

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

はこれを渡しますリスナーを次のように入力してください:

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

あなたのアダプタのOnBackClickListenerをrootLayoutがクリックしたときに通知されます。

RecyclerViewの場合、完全な実装hereが見つかります。

+1

多くのおかげで、私は両方の方法を試してみようと私に最も適合するかを参照してください – RiddlerNewComer

+0

両方のメソッドは、同じ幸運です。 – Amir

0

あなたの活動にリスナーを追加することができますが、あなたがこの

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; 
     } 
} 

のようにそれを行うと、あなたの活動がリスナーを実装し、その参照を渡すことができますclicked.Insteadとなっていたビューを指摘することができる文句を言いませんビューアのコンストラクタで

+0

これで、リスナーで自分のアクティビティにメソッドを使用できるようになりますか? – RiddlerNewComer

+0

はい、アクティビティをビューイングホルダーでアクティビティーにキャストし、ヌルポインターをチェックすることで、アクティビティー・メソッドを使用できます。しかし、アクティビティーがメモリー内に存在しない場合は、リスナーに対する参照を保持しないようにしてください – user3300839

関連する問題