我可以在listView的接收元素中添加侦听器吗?

时间:2016-05-18 07:46:51

标签: android listener

我有ListView以下Adapter

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的一些功能公之于众,但我对此解决方案一点也不满意。

2 个答案:

答案 0 :(得分:0)

首先要提一下你的viewHolder模式是不正确的,请看here

第二件事是,如果你想访问你的rootLayout内部活动最简单的方法是在你的适配器中定义Listener,然后在你的Activity中通知它。

例如,在适配器中定义以下接口并在适配器中创建实例:

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

现在,在您的活动中,当rootLayout点击适配器的OnBackClickListener通知您时。

如果是RecyclerView,您可以找到完整的实施here

答案 1 :(得分: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;
       }
}

并使您的活动实现侦听器并在视图构造函数

中传递其引用