-1

我花了几个小时寻找解决方案,但是我尝试过的所有方法都不起作用,它只是产生与下面的代码相同的结果。在适配器中使用onClickListener的Android问题

我正在尝试让onClickListener更改TextView的可见性,但是此代码始终设置我单击的那个,然后再单击下一个。

class EventiAdapter extends ArrayAdapter<CustomEventi> { 

    List<CustomEventi> customEventi; 
    LayoutInflater inflater; 

    EventiAdapter(@NonNull Context context, @LayoutRes int resource, List<CustomEventi> objects) { 
     super(context, resource, objects); 

     customEventi = objects; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

     View view = convertView; 
     final EventiViewHolder eventiViewHolder; 

     if(view == null) { 

      eventiViewHolder = new EventiViewHolder(); 
      view = inflater.inflate(R.layout.eventi_list, parent, false); 

      eventiViewHolder.imageTV = (ImageView) view.findViewById(R.id.image); 
      eventiViewHolder.nameTV = (TextView) view.findViewById(R.id.name); 
      eventiViewHolder.categoryTV = (TextView) view.findViewById(R.id.category); 
      eventiViewHolder.latLngTV = (TextView) view.findViewById(R.id.latLng); 
      eventiViewHolder.placeTV = (TextView) view.findViewById(R.id.place); 
      eventiViewHolder.dateTV = (TextView) view.findViewById(R.id.date); 
      eventiViewHolder.timeTV = (TextView) view.findViewById(R.id.time);; 
      eventiViewHolder.viewInfo = (Button) view.findViewById(R.id.viewInfo); 
      eventiViewHolder.informationTV = (TextView) view.findViewById(R.id.information); 
      eventiViewHolder.mapImage = (ImageView) view.findViewById(R.id.mapImage); 

      view.setTag(eventiViewHolder); 
     } else { 

      eventiViewHolder = (EventiViewHolder) view.getTag(); 
     } 

     eventiViewHolder.viewInfo.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       if(eventiViewHolder.informationTV.getVisibility() == View.VISIBLE) { 

        eventiViewHolder.informationTV.setVisibility(View.GONE); 
        eventiViewHolder.mapImage.setVisibility(View.GONE); 
        eventiViewHolder.viewInfo.setText("VISUALIZZA INFORMAZIONI"); 
       } 
       else { 

        eventiViewHolder.informationTV.setVisibility(View.VISIBLE); 
        eventiViewHolder.mapImage.setVisibility(View.VISIBLE); 

        eventiViewHolder.viewInfo.setText("NASCONDI INFORMAZIONI"); 
       } 
      } 
     }); 

     System.out.println("POSITION: "+position); 
     CustomEventi cstEventi = customEventi.get(position); 
     eventiViewHolder.setDataIntoViewHolder(cstEventi); 

     return view; 
    } 
} 

谢谢你在前进的人谁会尽力帮助我。

+1

你的意思是你的改变只对少数物品有效,你想让它在所有物品上? – pouya

+0

我的意思是,当我点击20列表中的第一项时,第一项是做它必须做的事情,但变化发生在屏幕下方的视图(在我的例子中是第三个),然后是下面的其他人如果代码不仅仅作用于点击的项目 – DomeWTF

+0

你只需要重置你的适配器。没有其他方式 'recyclerView'只是绑定屏幕上的视图项目,其他项目根本不存在在那一刻 – pouya

回答

1

尝试

一个boolean场可见添加到CustomEventi

private boolean visible; 

public boolean isVisible { return visible; } 

public void setVisible(boolean visible) { this.visible = visible; } 

2.更换适配器代码与这一个:

class EventiAdapter extends ArrayAdapter<CustomEventi> { 

    List<CustomEventi> customEventi; 
    LayoutInflater inflater; 

    EventiAdapter(@NonNull Context context, @LayoutRes int resource, List<CustomEventi> objects) { 
     super(context, resource, objects); 

     customEventi = objects; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

     View view = convertView; 
     final EventiViewHolder eventiViewHolder; 

     System.out.println("POSITION: "+position); 
     CustomEventi cstEventi = customEventi.get(position); 

     if(view == null) { 

      eventiViewHolder = new EventiViewHolder(); 
      view = inflater.inflate(R.layout.eventi_list, parent, false); 

      eventiViewHolder.imageTV = (ImageView) view.findViewById(R.id.image); 
      eventiViewHolder.nameTV = (TextView) view.findViewById(R.id.name); 
      eventiViewHolder.categoryTV = (TextView) view.findViewById(R.id.category); 
      eventiViewHolder.latLngTV = (TextView) view.findViewById(R.id.latLng); 
      eventiViewHolder.placeTV = (TextView) view.findViewById(R.id.place); 
      eventiViewHolder.dateTV = (TextView) view.findViewById(R.id.date); 
      eventiViewHolder.timeTV = (TextView) view.findViewById(R.id.time);; 
      eventiViewHolder.viewInfo = (Button) view.findViewById(R.id.viewInfo); 
      eventiViewHolder.informationTV = (TextView) view.findViewById(R.id.information); 
      eventiViewHolder.mapImage = (ImageView) view.findViewById(R.id.mapImage); 

      view.setTag(eventiViewHolder); 
     } else { 

      eventiViewHolder = (EventiViewHolder) view.getTag(); 
     } 


     eventiViewHolder.informationTV.setVisibility(cstEventi.isVisible() ? View.VISIBLE : GONE); 
     eventiViewHolder.mapImage.setVisibility(cstEventi.isVisible() ? View.VISIBLE : View.GONE); 
     eventiViewHolder.viewInfo.setText(cstEventi.isVisible() ? "NASCONDI INFORMAZIONI": "VISUALIZZA INFORMAZIONI"); 

     eventiViewHolder.viewInfo.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       boolean isVisible = customEventi.isVisible(); 
       customEventi.setVisible(!isVisible); 
       notifyDataSetChanged(); 
      } 
     }); 

     eventiViewHolder.setDataIntoViewHolder(cstEventi); 

     return view; 
    } 
} 
+0

尝试阅读https://dzone.com/articles/android-listview-optimizations – Pehlaj

+0

谢谢,这很好。这真的是在这种列表视图中获得正确行的唯一方法吗?这看起来更像是一个黑客。 – DomeWTF

+0

是的,始终使用数据/实体,以便每当数据更改时,UI也应该更新。 – Pehlaj

-2

试试这个....

public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

    View view = convertView; 


    if(view == null) { 


     view = inflater.inflate(R.layout.eventi_list, parent,false); 

     imageTV = (ImageView) view.findViewById(R.id.image); 
     nameTV = (TextView) view.findViewById(R.id.name); 
     categoryTV = (TextView) view.findViewById(R.id.category); 
     latLngTV = (TextView) view.findViewById(R.id.latLng); 
     placeTV = (TextView) view.findViewById(R.id.place); 
     dateTV = (TextView) view.findViewById(R.id.date); 
     timeTV = (TextView) view.findViewById(R.id.time);; 
     viewInfo = (Button) view.findViewById(R.id.viewInfo); 
     informationTV = (TextView) view.findViewById(R.id.information); 
     mapImage = (ImageView) view.findViewById(R.id.mapImage); 



    viewInfo.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      if(informationTV.getVisibility() == View.VISIBLE) { 

       informationTV.setVisibility(View.GONE); 
       mapImage.setVisibility(View.GONE); 
       viewInfo.setText("VISUALIZZA INFORMAZIONI"); 
      } 
      else { 

       informationTV.setVisibility(View.VISIBLE); 
       mapImage.setVisibility(View.VISIBLE); 

       viewInfo.setText("NASCONDI INFORMAZIONI"); 
      } 
     } 
    }); 

    System.out.println("POSITION: "+position); 
    CustomEventi cstEventi = customEventi.get(position); 
    setDataIntoViewHolder(cstEventi); 

    return view; 
}