#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:
Ctrl
Shift
F
для поиска «Nessun oggetto trovato» и «label_object_empty», чтобы проверить, показывает ли другое представление сообщение или просто показываетtvEmpty
это.- Если вы гарантируете, что
tvEmpty
отображается только сообщение. НажмитеCtrl
Shift
R
и заменитеtvEmpty.setVisibility(VISIBLE)
наtvEmpty.setVisibility(GONE)
один за другим. Каждый раз, когда вы заменяете его, повторно запускайте свое приложение и проверяйте, виден ли текст или нет. Если при изменении текст исчезает, как вы ожидаете, внимательно просмотрите свой код, проверьте операторы условий, чтобы узнать, почему ваша программа запускается в этой строке кода.
В вашем случае, я думаю, вы где-то установили текст «Nessun oggetto trovato» для других представлений.
Комментарии:
1. Спасибо, я решил проблему. Это были два перекрывающихся фрагмента, а не два представления. Один и тот же фрагмент был добавлен дважды