Если у вас нет доступа к классам для изменения свойств или вы не хотите всегда использовать одно и то же свойство переименования, переименование также может быть выполнено путем создания настраиваемого распознавателя.
Например, если у вас есть класс с именем 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 "}
Подробнее о пользовательских резольверах здесь
При раздувании 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 );
Вы должны создать 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;
}