-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; 
}