recyclerview не отображается должным образом [дублировать]

Если у вас нет доступа к классам для изменения свойств или вы не хотите всегда использовать одно и то же свойство переименования, переименование также может быть выполнено путем создания настраиваемого распознавателя.

Например, если у вас есть класс с именем MyCustomObject, который имеет свойство, называемое LongPropertyName, вы можете использовать настраиваемый резольвер, как это ...

public class CustomDataContractResolver : DefaultContractResolver
{
  public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    if (property.DeclaringType == typeof(MyCustomObject))
    {
      if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
      {
        property.PropertyName = "Short";
      }
    }
    return property;
  }
}

Затем вызовите сериализацию и поставьте резольвер

 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });

. Результат будет сокращен до {«Short»: «prop value»} вместо {«LongPropertyName ":" prop value "}

Подробнее о пользовательских резольверах здесь

6
задан thien.vpt 19 November 2015 в 05:34
поделиться

2 ответа

При раздувании View с LayoutInflater вам необходимо передать родительский параметр, чтобы использовать атрибуты layout_*. Это потому, что эти атрибуты должны создать правильный класс LayoutParams. Это означает, что вы не можете использовать inflate(R.layout.*, null), но вместо этого должны передать ViewGroup для второго параметра. В большинстве случаев вы также хотите использовать трехпараметрическую версию метода и передать false в качестве третьего параметра. Если это опущено или true, то View сразу же добавляется к родительскому элементу, что вызывает проблемы в таких местах, как onCreateViewHolder(), потому что инфраструктура предназначена для выполнения этой операции позже. Для получения дополнительной информации см. этот ответ .

В вашем случае у вас есть строка

 View _v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_location,null );

Вы должны изменить ее на

 View _v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_location, viewGroup, false );
25
ответ дан Community 22 August 2018 в 23:49
поделиться
  • 1
    Спасибо за вашу помощь и объяснение. Это работает. Кажется, мне так много нужно учиться – thien.vpt 19 November 2015 в 06:03
  • 2
    Человек, вы спасатель жизни! Я пробовал эту небольшую ошибку примерно через неделю. – Ishaan 21 September 2016 в 11:37
  • 3
    идеальное решение и объяснение, спас мне кучу времени ... спасибо чувак! – Simon Ninon 1 June 2017 в 22:51
  • 4
    спасибо за описание. сделал мой макет работы :) – zreptil 30 August 2017 в 05:36
  • 5
    Благодарю. это решение работало для меня. – Douglas Mesquita 3 December 2017 в 13:49

Вы должны создать View, как это

@Override
public CardViewDataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {  
// create a new view
   View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.card_view, viewGroup, false);
// create ViewHolder
   ViewHolder viewHolder = new ViewHolder(itemLayoutView);
   return viewHolder;
 }
2
ответ дан Ashish Agrawal 22 August 2018 в 23:49
поделиться
  • 1
    Я просто создаю пользовательский адаптер для RecyclerView, а не для CardView. Я просто редактирую свой пост – thien.vpt 19 November 2015 в 05:29
Другие вопросы по тегам:

Похожие вопросы: