Java 在RecyclerView中搜索项目时图像视图的位置发生更改
我有一个Java 在RecyclerView中搜索项目时图像视图的位置发生更改,java,android,android-recyclerview,android-adapter,Java,Android,Android Recyclerview,Android Adapter,我有一个RecyclerView,其中每个项目都有一个ImageView,以sendmail图标的形式显示。最初,ImageView是可见的,但一旦我单击它,我就使用setVisibility(View.go)将其隐藏,并更新适配器 现在,当我单击sendmail图标时,我立即使用reportitems.get(position).setStatus(“emailsent”)将图标隐藏在该位置。现在,如果在search操作之前,第二个项目的ImageView可见,而第一个项目不可见,那么在搜索之
RecyclerView
,其中每个项目都有一个ImageView
,以sendmail
图标的形式显示。最初,ImageView
是可见的,但一旦我单击它,我就使用setVisibility(View.go)
将其隐藏,并更新适配器
现在,当我单击sendmail
图标时,我立即使用reportitems.get(position).setStatus(“emailsent”)将图标隐藏在该位置代码>。现在,如果在search
操作之前,第二个项目的ImageView
可见,而第一个项目不可见,那么在搜索之后,如果第二个项目是唯一相关的项目,那么ImageView
不会显示在第一个位置。我使用的是动态搜索,输入字符后,适配器立即刷新并显示更新的RecyclerView。如何解决此问题
搜索后,即使SQ 322应该有sendmail
图标,它也不会显示出来
活动代码
mAdapter.setOnItemClickListener(new ReportAdapter.OnItemClickListener() {
public void onSendEmailClick(int position){
flightNumber=reportitems.get(position).getFlightNumber();
departureDate=reportitems.get(position).getDepartureDate();
FlightClosureStatus flightClosureStatus=new FlightClosureStatus(flightNumber,departureDate,"emailsent");
flightViewModel.updateFlightClosureStatus(flightClosureStatus);
reportitems.get(position).setStatus("emailsent");
mAdapter.notifyDataSetChanged();
}
}
public class ReportAdapter extends RecyclerView.Adapter<ReportAdapter.ReportViewHolder> {
private ArrayList<ReportItem> reportlist;
private OnItemClickListener mListener;
private Context mContext;
public ReportAdapter(ArrayList<ReportItem> reportlist, Context context) {
this.reportlist = reportlist;
this.mContext = context;
}
public interface OnItemClickListener {
void onSendEmailClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
public static class ReportViewHolder extends RecyclerView.ViewHolder {
public TextView departureDate;
public TextView flightNumber;
public ImageView emailView;
public ReportViewHolder(@NonNull View itemView, OnItemClickListener listener, Context context) {
super(itemView);
departureDate = itemView.findViewById(R.id.departureDaterecyclerview);
flightNumber = itemView.findViewById(R.id.flightnumberrecyclerview);
emailView = itemView.findViewById(R.id.sendemailIcon);
emailView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener != null) {
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION) {
listener.onSendEmailClick(position);
}
}
}
});
}
}
@NonNull
@Override
public ReportViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.report_listing_item, parent, false);
ReportViewHolder rvh= new ReportViewHolder(v,mListener,mContext);
return rvh;
}
@SuppressLint("ResourceAsColor")
@Override
public void onBindViewHolder(@NonNull ReportViewHolder holder, int position) {
ReportItem currentItem = reportlist.get(position);
//here i am setting the visibility of the imageview to gone
if(currentItem.getStatus().contentEquals("emailsent")){
holder.emailView.setVisibility(View.GONE);
}
holder.flightNumber.setText(currentItem.getFlightNumber());
holder.departureDate.setText((currentItem.getDepartureDate()));
}
public List<ReportItem> getList() {
return reportlist;
}
}
适配器代码
mAdapter.setOnItemClickListener(new ReportAdapter.OnItemClickListener() {
public void onSendEmailClick(int position){
flightNumber=reportitems.get(position).getFlightNumber();
departureDate=reportitems.get(position).getDepartureDate();
FlightClosureStatus flightClosureStatus=new FlightClosureStatus(flightNumber,departureDate,"emailsent");
flightViewModel.updateFlightClosureStatus(flightClosureStatus);
reportitems.get(position).setStatus("emailsent");
mAdapter.notifyDataSetChanged();
}
}
public class ReportAdapter extends RecyclerView.Adapter<ReportAdapter.ReportViewHolder> {
private ArrayList<ReportItem> reportlist;
private OnItemClickListener mListener;
private Context mContext;
public ReportAdapter(ArrayList<ReportItem> reportlist, Context context) {
this.reportlist = reportlist;
this.mContext = context;
}
public interface OnItemClickListener {
void onSendEmailClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
public static class ReportViewHolder extends RecyclerView.ViewHolder {
public TextView departureDate;
public TextView flightNumber;
public ImageView emailView;
public ReportViewHolder(@NonNull View itemView, OnItemClickListener listener, Context context) {
super(itemView);
departureDate = itemView.findViewById(R.id.departureDaterecyclerview);
flightNumber = itemView.findViewById(R.id.flightnumberrecyclerview);
emailView = itemView.findViewById(R.id.sendemailIcon);
emailView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener != null) {
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION) {
listener.onSendEmailClick(position);
}
}
}
});
}
}
@NonNull
@Override
public ReportViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.report_listing_item, parent, false);
ReportViewHolder rvh= new ReportViewHolder(v,mListener,mContext);
return rvh;
}
@SuppressLint("ResourceAsColor")
@Override
public void onBindViewHolder(@NonNull ReportViewHolder holder, int position) {
ReportItem currentItem = reportlist.get(position);
//here i am setting the visibility of the imageview to gone
if(currentItem.getStatus().contentEquals("emailsent")){
holder.emailView.setVisibility(View.GONE);
}
holder.flightNumber.setText(currentItem.getFlightNumber());
holder.departureDate.setText((currentItem.getDepartureDate()));
}
public List<ReportItem> getList() {
return reportlist;
}
}
公共类ReportAdapter扩展了RecyclerView.Adapter{
私有ArrayList报告列表;
私人监听者;
私有上下文;
公共报告适配器(ArrayList报告列表,上下文){
this.reportlist=reportlist;
this.mContext=上下文;
}
公共接口侦听器{
在SendeMailClick上无效(内部位置);
}
公共void setOnItemClickListener(OnItemClickListener侦听器){
mListener=监听器;
}
公共静态类ReportViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图发布日期;
公共文本视图航班号;
公共图像视图emailView;
public ReportViewHolder(@NonNull View itemView,OnItemClickListener侦听器,上下文){
超级(项目视图);
departureDate=itemView.findViewById(R.id.departureDaterecyclerview);
flightNumber=itemView.findViewById(R.id.flightNumber-RecyclerView);
emailView=itemView.findViewById(R.id.sendemailIcon);
emailView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(侦听器!=null){
int position=getAdapterPosition();
如果(位置!=RecyclerView.无位置){
listener.onSendEmailClick(位置);
}
}
}
});
}
}
@非空
@凌驾
public ReportViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.report\u listing\u item,parent,false);
ReportViewHolder rvh=新的ReportViewHolder(v、mListener、mContext);
返回rvh;
}
@SuppressLint(“资源色”)
@凌驾
公共无效onBindViewHolder(@NonNull ReportViewHolder holder,int位置){
ReportItem currentItem=reportlist.get(位置);
//在这里,我将imageview的可见性设置为gone
if(currentItem.getStatus().contentEquals(“emailsent”)){
holder.emailView.setVisibility(View.GONE);
}
holder.flightNumber.setText(currentItem.getFlightNumber());
holder.departureDate.setText((currentItem.getDepartureDate());
}
公共列表getList(){
返回报告列表;
}
}
将您的onBindViewHolder
替换为以下内容,基本上回收商会在可用时使用池中的项目,并且一旦项目可见性消失
,并且除非您这样做,否则不会再次将其设置为可见
@SuppressLint("ResourceAsColor")
@Override
public void onBindViewHolder(@NonNull ReportViewHolder holder, int position) {
ReportItem currentItem = reportlist.get(position);
//here i am setting the visibility of the imageview to gone
if(currentItem.getStatus().contentEquals("emailsent")){
holder.emailView.setVisibility(View.GONE);
}else{
holder.emailView.setVisibility(View.VISIBLE);
}
holder.flightNumber.setText(currentItem.getFlightNumber());
holder.departureDate.setText((currentItem.getDepartureDate()));
}
当我在RecyclerView中搜索一个项目时,ImageView的位置会随着搜索而改变,这在搜索中是永远不会发生的。仅当您更改适配器中的项目时。请重新格式化。@blackapps Reformed
当我在RecyclerView中搜索一个项目时,我观察到各个项目的ImageView被重新排列
这是不可能的。我以前说过。搜索不会改变任何东西。仅当您在适配器中筛选数据列表时。请重新格式化。如果你旋转你的设备,那么同一个图标是否不可见?@blackapps我重新格式化了。我正在emulator上进行测试,而且我没有旋转设备太多,这很有效!:)