OnClickListener RecyclerView按钮列表

时间:2017-04-30 06:59:07

标签: android android-recyclerview onclicklistener buttonclick

我有一个RecyclerView,每个项目都是一个按钮。每个按钮都会通过将不同的参数传递给此活动来调用相同的活动。

我在网上尝试了很多解决方案,但没有一个能为我工作。

这是我的适配器:

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.List;

public class FormAdapter extends RecyclerView.Adapter<FormAdapter.FormViewHolder> {

    private List<Form> forms;
    private int rowLayout;
    private Context context;


    public class FormViewHolder extends RecyclerView.ViewHolder {

        LinearLayout formsLayout;
        Button form;

        public FormViewHolder(View v) {
            super(v);

            formsLayout = (LinearLayout) v.findViewById(R.id.forms_layout);
            form = (Button) v.findViewById(R.id.formButton);

        }

    }

    public FormAdapter(List<Form> forms, int rowLayout, Context context) {
        this.forms = forms;
        this.rowLayout = rowLayout;
        this.context = context;
    }



    @Override
    public FormAdapter.FormViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false);
        return new FormViewHolder(view);
    }


    @Override
    public void onBindViewHolder(FormViewHolder holder, final int position) {
        holder.form.setText(forms.get(position).getSubject());
    }

    @Override
    public int getItemCount() {
        return forms.size();
    }

}

表单由以下类表示:

public class Form {

    private final String subject;
    private final int idForm;

    public Form(String subject,int idForm)
    {
        this.idForm=idForm;
        this.subject=subject;
    }

    public String getSubject()
    {
        return subject;
    }

    public int getIdForm()
    {
        return idForm;
    }

}

这是我的MainActivity:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

    private final static int idCreator = 1;
    private FormAdapter formAdapter;
    private List<Form> forms;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("Main activity");

        final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerViewForm);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        Formable formService =
                ApiClient.getClient().create(Formable.class);

        Call<List<Form>> call = formService.getForms(idCreator);
        call.enqueue(new Callback<List<Form>>() {
            @Override
            public void onResponse(Call<List<Form>> call, Response<List<Form>> response) {
                forms = response.body();
                formAdapter=new FormAdapter(forms, R.layout.one_form, getApplicationContext());
                recyclerView.setAdapter(formAdapter);
            }

            @Override
            public void onFailure(Call<List<Form>> call, Throwable t) {
                // Log error here since request failed
                Log.e(TAG, t.toString());
            }
        });

    }
}

我的屏幕上有我的按钮,但我不明白如何让他们称之为活动&#34; QuestionsActivity&#34;使用参数&#34; idForm&#34;我知道。

这是我运行应用程序时的MainActivity

enter image description here

提前感谢您的帮助

3 个答案:

答案 0 :(得分:1)

当您点击recyclerview项目时,您可以通过以下方式获取项目数据:

在适配器中创建接口并在您的活动中使用它:

private OnItemClickListener mListener;
public interface OnItemClickListener {
    public void onItemClick(View view, int position);
}

现在您的代码如下所示:

<强> FormAdapter.java

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.List;

    public class FormAdapter extends RecyclerView.Adapter<FormAdapter.FormViewHolder> {

        private List<Form> forms;
        private int rowLayout;
        private Context context;

        private OnItemClickListener mListener;
        public interface OnItemClickListener {
            public void onItemClick(View view, int position);
        }

        public class FormViewHolder extends RecyclerView.ViewHolder {

            LinearLayout formsLayout;
            Button form;

            public FormViewHolder(View v) {
                super(v);

                formsLayout = (LinearLayout) v.findViewById(R.id.forms_layout);
                form = (Button) v.findViewById(R.id.formButton);

            }

        }

        public FormAdapter(List<Form> forms, int rowLayout, Context context) {
            this.forms = forms;
            this.rowLayout = rowLayout;
            this.context = context;
        }



        @Override
        public FormAdapter.FormViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false);
            return new FormViewHolder(view);
        }


        @Override
        public void onBindViewHolder(FormViewHolder holder, final int position) {
            holder.form.setText(forms.get(position).getSubject());
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(mListener!=null)
                    {
                        mListener.onItemClick(view,position);
                    }
                }
            });
        }

        @Override
        public int getItemCount() {
            return forms.size();
        }


        public void setOnItemClick(OnItemClickListener listener)
        {
            this.mListener=listener;
        }

    }

<强> MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

import com.newstory.android.R;
import com.newstory.android.activity.FormAdapter;

import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

    private final static int idCreator = 1;
    private FormAdapter formAdapter;
    private List<Form> forms;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("Main activity");

        final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerViewForm);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        Formable formService =
                ApiClient.getClient().create(Formable.class);

        Call<List<Form>> call = formService.getForms(idCreator);
        call.enqueue(new Callback<List<Form>>() {
            @Override
            public void onResponse(Call<List<Form>> call, Response<List<Form>> response) {
                forms = response.body();
                formAdapter=new FormAdapter(forms, R.layout.one_form, getApplicationContext());
                recyclerView.setAdapter(formAdapter);
                setOnItemListener();
            }

            @Override
            public void onFailure(Call<List<Form>> call, Throwable t) {
                // Log error here since request failed
                Log.e(TAG, t.toString());
            }
        });

    }

    public void setOnItemListener(){
        if(formAdapter!=null)
        {
            formAdapter.setOnItemClick(new FormAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    Form clickedForm=forms.get(position);
                    // You can call QuestionsActivity here 
                    //Now you can access [Form] data
                    Log.d("getIdForm->",String.valueOf(clickedForm.getIdForm()))
                }
            });
        }
    }
}

我希望它对你有帮助。

答案 1 :(得分:0)

这样做:

 form.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the form is clicked
                 context.startActivity(new Intent(context, YourActivity.class)
                                      .putExtra("idForm", someValue));
            }
        });

答案 2 :(得分:0)

在适配器的onBindViewHolder方法中,为按钮视图元素指定一个单击侦听器,因此它看起来像这样:

 @Override
public void onBindViewHolder(FormViewHolder holder, final int position {
    holder.form.setText(forms.get(position).getSubject());
    holder.form.setOnClickListener(v -> {
        startQuestionsWithId(forms.get(position).getIdForm);
    });
}

然后,您的startQuestionsWithId方法通常就像:

private void startQuestionsWithId(int idForm) {
 Intent intent = new Intent(context, QuestionsActivity.class);
 intent.putExtra("id_form", idForm);
 context.startActivity(intent); 
}