Android textview setVisibilty не работает

#android #textview

#Android #textview

Вопрос:

У меня проблема с textview в макете recyclerview. Если я вызываю метод setVisibility GONE, это не имеет никакого эффекта, textview продолжает оставаться видимым, наложенным на recyclerview, хотя определенный макет этого не позволяет:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<androidx.recyclerview.widget.RecyclerView
    android:id="@ id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="#DDDDDD"
    android:dividerHeight="1px"
    android:focusableInTouchMode="true" />

<TextView
    android:id="@ id/tv_empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:textSize="20sp"
    android:textColor="#999999"
    android:text="@string/label_object_empty" /></LinearLayout>
  

Код, в котором я выполняю операцию, является:

     recyclerView = getView().findViewById(R.id.list);
    RecyclerView.LayoutManager manager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(manager);

    OggettoAdapter adapter = new OggettoAdapter(getContext(), oggetti, mapQuartieri, mapDomini,     getOnActionActivity());
    recyclerView.setAdapter(adapter);

    if (adapter.getItemCount() > 0) {
        recyclerView.setVisibility(View.VISIBLE);
        tvEmpty.setVisibility(View.GONE);
    } else {
        recyclerView.setVisibility(View.GONE);
        tvEmpty.setVisibility(View.VISIBLE);

    }
  

введите описание изображения здесь

Если это полезно, код выполняется в onPostExecute и находится в основном фрагменте

Я пробовал всевозможные способы, включая textview в макете, но нет, ничего не дало никакого эффекта. Я не знаю, как это сделать. Спасибо

onCreateView:

  public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {

    View root = inflater.inflate(R.layout.fragment_oggetti, container, false);

    //ltContainer = root.findViewById(R.id.lt_container);

    tvEmpty = root.findViewById(R.id.tv_empty);
    tvEmpty.setVisibility(View.GONE);

    recyclerView = root.findViewById(R.id.list);
    RecyclerView.LayoutManager manager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(manager);


    getOnActionActivity().setOnClickListenerMap(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (oggetti != null amp;amp; !oggetti.isEmpty()) {
                getOnActionActivity().openMap(oggetti, filter.getRaggio(), "POINT (40.83035550115621 14.244734405325753)");
            }
        }
    });

    getOnActionActivity().setOnClickListenerFilter(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getOnActionActivity().openFilter();
        }
    });

    getOnActionActivity().viewIconFilter(true);
    getOnActionActivity().viewIconMap(true);

    return root;
}
  

Адаптер обновления:

 adapter = new OggettoAdapter(getContext(), oggetti, mapQuartieri, mapDomini, 
  

getOnActionActivity());
RecyclerView.setAdapter(адаптер);

общедоступный класс OggettoAdapter расширяет RecyclerView.АдаптерViewHolderObjects> {

 private Context context;
private List<Gs001Oggetto> objects;
private Map<Integer, String> quartieri;
private Map<Integer, String> domini;
private String apiKey;
private OnActionActivity onActionActivity;

public OggettoAdapter(Context context, List<Gs001Oggetto> objects, Map<Integer, String> quartieri, Map<Integer, String> domini, OnActionActivity onActionActivity) {
    this.context = context;
    this.objects = objects;
    this.quartieri = quartieri;
    this.domini = domini;
    this.apiKey = context.getString(R.string.map_api_key);
    this.onActionActivity = onActionActivity;
}

@NonNull
@Override
public ViewHolderObjects onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_object, parent, false);
    return new ViewHolderObjects(itemView, onActionActivity);
}

@Override
public void onBindViewHolder(@NonNull ViewHolderObjects holder, int position) {
    Gs001Oggetto object = objects.get(position);
    holder.oggetto = object;
    String quartiere = quartieri.get(new Integer((int) object.getQuartiere()));
    if (quartiere != null) {
        holder.tvQurtiere.setVisibility(View.VISIBLE);
        holder.tvQurtiere.setText(quartiere);
    } else {
        holder.tvQurtiere.setVisibility(View.GONE);
    }

    String descrizioneDom = domini.get(new Integer(object.getDominio()));

    if (descrizioneDom != null) {
        holder.tvDominio.setText(descrizioneDom);
    }

    final String[] coordinate = GeoUtil.convertWktToArray(object.getGeometriaWKT());
    if (coordinate != null amp;amp; coordinate.length == 2) {
        String sw_url = GeoUtil.createUrlStreeView(coordinate[0]   ","   coordinate[1], 600, 600, apiKey);
        Glide.with(context).load(sw_url).placeholder(R.drawable.thumbnail).into(holder.ivPhoto);
    }

    holder.tvId.setText(""   object.getId());

    String address = object.getToponimo() != null ? object.getToponimo()   " "   object.getStrada() : object.getStrada();
    holder.tvAddress.setText(address);
    holder.layout.setOnClickListener(holder);

}

@Override
public int getItemCount() {
    return objects.size();
}
  

….

Комментарии:

1. Чего здесь не хватает, так это когда и где вы устанавливаете элементы адаптера. Если вы никогда не устанавливали их, adapter.getItemCount() всегда будет 0. Несколько вещей: вам нужно только один раз создать create LayoutManager и адаптер, лучше всего сделать это для onViewCreated() вашего фрагмента. Сделайте адаптер глобальным для вашего фрагмента, задайте результат в onPostExecute для адаптера. Также не забудьте позвонить adapter.notifyDatasetChanged()

2. Спасибо за ответ. Я пытался сделать так, как вы сказали, но это все равно не работает. Как вы можете видеть из изображения, getItemCount не равен нулю. Но в любом случае из определения макета recyclerview и textview не могут перекрываться. Это не relativelayout

3. Не могли бы вы показать использование кода, в котором вы устанавливаете элементы в адаптере и где вы вызываете tvEmpty = findViewById() ?

Ответ №1:

  1. Ctrl Shift F для поиска «Nessun oggetto trovato» и «label_object_empty», чтобы проверить, показывает ли другое представление сообщение или просто показывает tvEmpty это.
  2. Если вы гарантируете, что tvEmpty отображается только сообщение. Нажмите Ctrl Shift R и замените tvEmpty.setVisibility(VISIBLE) на tvEmpty.setVisibility(GONE) один за другим. Каждый раз, когда вы заменяете его, повторно запускайте свое приложение и проверяйте, виден ли текст или нет. Если при изменении текст исчезает, как вы ожидаете, внимательно просмотрите свой код, проверьте операторы условий, чтобы узнать, почему ваша программа запускается в этой строке кода.

В вашем случае, я думаю, вы где-то установили текст «Nessun oggetto trovato» для других представлений.

Комментарии:

1. Спасибо, я решил проблему. Это были два перекрывающихся фрагмента, а не два представления. Один и тот же фрагмент был добавлен дважды