How to Pass Position of RecyclerView to Activity?

左心房为你撑大大i 提交于 2019-12-07 09:46:22

问题


I am trying to pass position of recyclerview to another activity where I am calliing retrofit Interface. Can I pass position of Recyclerview item so I can load different post from api

 @Override
public void onBindViewHolder(TagAdapter.Tag_ViewHolder holder, final int position) {
    holder.tagName.setText(Tags.get(position));
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (position < 8){
                int  pos = (int) getItemId(position) + 1;
                Intent intent = new Intent (view.getContext(), Tag1Post.class);
                intent.putExtra("pos", pos);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);

            }
        }

My EndPoint is

@GET("/tag/{id}/")
Call<Tag> test(@Path("id") int id);

I want to replace id by RecyclerView position.


回答1:


You can create an interface then transfer the position from the adapter to the activity.

holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (position < 8){
                int  pos = (int) getItemId(position) + 1;
                Intent intent = new Intent (view.getContext(), Tag1Post.class);
                intent.putExtra("pos", pos);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
                //create your interface in Activity, then send it to adapter and call it here:
                yourListener.onTransferPosition(position);
            }
        }

On your activity that implements interface:

 public void onTransferPosition(int position) {
    this.position= position;
  }



回答2:


Instead of passing the position of Recycler View I pass the id of the particular post to navigate to comment on that post.

1. Provide Intent Extra with id of clicked post on Bindview holder of Adapter

public void onBindViewHolder(PostViewHolder holder, final int position) {
        holder.postTitle.setText(posts.get(position).getTitle());
        holder.postBody.setText(posts.get(position).getBody());
        setAnimation(holder.itemView);

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int id = posts.get(position).getId(); // get Id
                Intent intent = new Intent(context, CommentActivity.class);
                intent.putExtra("pos", id); // Pass Id
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });
    }

2. Retrieve passed intent data

int mPostId = getIntent().getIntExtra("pos", 0);

3. Pass retrieved data to the retrofit endpoints

Call<List<Comment>> call = apiService.getComments(mPostId);

Retrofit Endpoints

@GET("/posts/{id}/comments/")
    Call<List<Comment>> getComments(@Path("id") int id);

I hope this will help someone to encounter this type of problems.

Happy Coding :)




回答3:


Since you are passing the view position using Intent class you can simply get the position in your second activity as below

int position = getIntent().getExtras().getInt("pos");

Or you can pass value using a interface

  public interface OnRecyclerClickListener  {
    void makeRestCall(int position);
}

Instantiate the interface as follow

onRecyclerClickListener  = (OnRecyclerClick) this.mContext;

send the view position like below

 holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (position < 8){
            int  pos = (int) getItemId(position) + 1;
            startActivity(new Intent (view.getContext(), Tag1Post.class));
            onRecyclerClickListener.makeRestCall(pos);    
        }
    }

Finally, implement interface in your second activity

public class SecondActivity extends AppCompatActivity implements OnRecyclerClickListener{

@Override
public void makeRestCall(int pos) {
   // do your GET request
}



回答4:


private AdapterView.OnItemClickListener mOnClickListener;

Use this in your Adapter and ask this from your constructor.

Adapter(AdapterView.OnItemClickListener onClickListener){
this.mOnClickListener=onClickListener;
}

in your onclick method in holder class do like this:

 @Override
        public void onClick(View view) {

            mOnClickListener.onItemClick(null, view, getAdapterPosition(), view.getId());
        }

And implement AdapterView.OnItemClickListener in you activity

@Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                 // here you will get the postion of the clicked item
    }


来源:https://stackoverflow.com/questions/42688062/how-to-pass-position-of-recyclerview-to-activity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!