如何在RecyclerView中实现OnClickListener?

问题描述 投票:1回答:5

我想使用RecyclerView为配置文件制作选择菜单。我用RecyclerView创建了它。现在我在onItemClickListener中遇到问题。我想在项目选择上更改CardView和文本颜色的背景。一次只能选择一个项目。并在下一个按钮单击它应根据选择重定向到活动。

这是我的屏幕看起来像:

Screen

public class SelectProfile extends AppCompatActivity {

private String[] mTextData;
private int[] mImgData;
RecyclerView recyclerView;
private ProfileAdapter profileAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select_profile);

    recyclerView = findViewById(R.id.recycleProfile);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,2);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);

    profileAdapter = new ProfileAdapter();
    recyclerView.setAdapter(profileAdapter);

    int imgData[] = {R.drawable.ic_college_icon,R.drawable.ic_parent,R.drawable.ic_student,R.drawable.ic_teaching,
                    R.drawable.ic_non_teaching,R.drawable.ic_other};
    final String textData[] = {"School/College","Parent","Student","Teaching Staff","Non-Teaching Staff","Other"};

    profileAdapter.setData(imgData,textData);

}

private class ProfileAdapter extends RecyclerView.Adapter<ProfileAdapter.ProfileAdapterViewHolder>{

    int index = -1;

    @NonNull
    @Override
    public ProfileAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        int layoutIdForListItem = R.layout.profile_item;
        LayoutInflater layoutInflater = LayoutInflater.from(context);
        boolean shouldAttachToParent = false;

        View view = layoutInflater.inflate(layoutIdForListItem,parent,shouldAttachToParent);
        return new ProfileAdapterViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ProfileAdapterViewHolder holder,final int position) {
        int mImage = mImgData[position];
        String mText = mTextData[position];

        holder.img.setImageResource(mImage);
        holder.txt.setText(mText);

         holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                index = position;
                notifyDataSetChanged();
            }
        });

        if (index == position){
            holder.card.setBackground(getResources().getDrawable(R.drawable.bg_select_profile));
                holder.txt.setTextColor(getResources().getColor(R.color.colorPrimary));
        }else {
            holder.card.setCardBackgroundColor(getResources().getColor(android.R.color.white));
            holder.txt.setTextColor(getResources().getColor(R.color.gray));
        }
    }


    @Override
    public int getItemCount() {
        if (null == mImgData) return 0;
        return mImgData.length;
    }

    public class ProfileAdapterViewHolder extends RecyclerView.ViewHolder  {
        private final AppCompatImageView img;
        private final TextView txt;
        private final CardView card;
        private ProfileAdapterViewHolder(@NonNull View itemView) {
            super(itemView);
            img = itemView.findViewById(R.id.img);
            txt = itemView.findViewById(R.id.txt);
            card = itemView.findViewById(R.id.card);
        }



    }

    private void setData(int[] imgData,String[] txtData){
        mImgData = imgData;
        mTextData = txtData;
        notifyDataSetChanged();
    }

}
}
android android-recyclerview recycler-adapter
5个回答
1
投票

您使用Index变量的方法是正确的,为索引添加getter和setter方法。但是您无法在适配器上设置onClickListener。相反,在卡片视图上设置监听器,如下所示 - >

holder.card.setOnItemClickListener(new ClickListener() {
            @Override
            public void onItemClick(int position, View v) {
                index = position;
                notifyDataSetChanged();
            }
        });

在适配器类中添加此方法 - >

public int getSelectedIndex(){
    return this.index; }

之后,在你的Activity中,在你的NEXT按钮的onClickListener中做以下事情,

    btnNext.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(profileAdapter.getSelectedIndex() == 1)
//goto activity of your desire and so on
                    }
                });

0
投票

将卡片视图用作回收器视图项的父布局,并将click侦听器应用于回收器视图适配器中的该卡片视图。

holder.your_card_view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

    // get you recyclerview item position here
}

});


0
投票

在持有者根视图上添加OnClickListner,写入侦听器的最佳位置在onCreateViewHolder中,因此请使用以下内容替换onCreateViewHolder

public ProfileAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            Context context = parent.getContext();
            int layoutIdForListItem = R.layout.profile_item;
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            boolean shouldAttachToParent = false;

            View view = layoutInflater.inflate(layoutIdForListItem,parent,shouldAttachToParent);
     ViewHolder viewHolder = new ViewHolder(view);
 view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                postion=viewHolder.getAdapterPosition();
                notifyDataSetChanged();
            }
        });

            return viewHolder ;
        }

0
投票

更改和调整您的适配器,如下所示:

private class ProfileAdapter extends RecyclerView.Adapter<ProfileAdapter.ProfileAdapterViewHolder>{

int index = -1;

@NonNull
@Override
public ProfileAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    int layoutIdForListItem = R.layout.profile_item;
    LayoutInflater layoutInflater = LayoutInflater.from(context);
    boolean shouldAttachToParent = false;

    View view = layoutInflater.inflate(layoutIdForListItem,parent,shouldAttachToParent);
    return new ProfileAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ProfileAdapterViewHolder holder, int position) {
    int mImage = mImgData[position];
    String mText = mTextData[position];

    holder.img.setImageResource(mImage);
    holder.txt.setText(mText);

    if (index == position){
        holder.card.setCardBackgroundColor(getResources().getColor(R.color.colorPrimary));
        holder.txt.setTextColor(getResources().getColor(R.color.colorPrimary));
    }else {
        holder.card.setCardBackgroundColor(getResources().getColor(android.R.color.white));
        holder.txt.setTextColor(getResources().getColor(R.color.gray));
    }
}


@Override
public int getItemCount() {
    if (null == mImgData) return 0;
    return mImgData.length;
}

public class ProfileAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private final AppCompatImageView img;
    private final TextView txt;
    private final CardView card;
    private ProfileAdapterViewHolder(@NonNull View itemView) {
        super(itemView);
        img = itemView.findViewById(R.id.img);
        txt = itemView.findViewById(R.id.txt);
        card = itemView.findViewById(R.id.card);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        setIndex(getAdapterPosition());

       notifyDataSetChanged();
    }
}

private void setData(int[] imgData,String[] txtData){
    mImgData = imgData;
    mTextData = txtData;
    notifyDataSetChanged();
}

public void setOnItemClickListener(ClickListener clickListener){
    mClickListener = clickListener;
}


private void setIndex(int index){
  this.index=index;
}

}

您可能不需要ClickListener。


0
投票

您可以在构造函数中传递侦听器对象,该构造函数通过片段OR活动实现

/**
 * item click interface of adapter
 */
public interface ProfileAdapterListener {
    void onItemClick(int position, ProfileAdapterViewHolder holder)
} 

此接口由Fragment OR Activity实现

/**
 * On item clicked Implement Method from adapter listener.
 *
 * @param position
 */
@Override
public void onItemClick(int position, ProfileAdapterViewHolder holder) {
    // Here you can call that method 
}

然后在适配器的构造函数中传递此侦听器。

private void buildRecyclerView() {
  profileAdapter = new ProfileAdapter(this);
  recyclerView.setAdapter(profileAdapter);
}

在构造函数中,您可以像这样分配

private ProfileAdapterListener mProfileAdapterListener;
 public OfferAdapter(ProfileAdapterListener mProfileAdapterListener) {
        this.mProfileAdapterListener = mProfileAdapterListener
        }
    }

现在,您可以通过在任何Viwe上设置click侦听器来使用此侦听器

holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mProfileAdapterListener.onItemClick(position, holder);
            }
        });

它返回调用实现此方法的onItemClick方法。这是一种安全可靠的方法,可以单击项目中的每个项目或任何视图。

© www.soinside.com 2019 - 2024. All rights reserved.