#java #android #xml #layout-inflater
#java #Android #xml #макет-раздуватель
Вопрос:
Я пытаюсь заполнить xml (из журнала чата) XML-файлом о том, как он выглядит, и классом, из которого я могу получить текст сообщения.
Я использую ArrayAdapter и инфляцию. У меня есть 2 XML-файла, один из них — «messageother», который предназначен для чужого сообщения, и «messageme» для сообщений, которые написал сам пользователь.
public class MsgAdapter extends ArrayAdapter<Msg> {
private final Context context;
private final ArrayList<Msg> msgList;
private TextView tvText;
public MsgAdapter(Context context, ArrayList<Msg> messages) {
super(context, R.layout.activ, messages);
this.context=context;
this.msgList=messages;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.messageother, parent, false);
return rowView;
}
}
Теперь это просто дублировало бы тот же XML-файл «messageother», пока он не будет выполнен.
Вместо этого я хотел бы перейти один за другим в ListView и проверить, соответствует ли Msg.getMine() = true;
Если это так, я хотел бы раздуть его с помощью xml «messageme» следующим образом:
View rowView = inflater.inflate(R.layout.messageme, parent, false);
Как я могу это сделать?
Ответ №1:
public static class MsgAdapter extends ArrayAdapter<Msg> {
private static final class ViewHolders {
View mMessageOthersView;
View mMessageMeView;
private ViewHolders(@NonNull final LayoutInflater layoutInflater, @NonNull View parent) {
this.mMessageOthersView = layoutInflater.inflate(R.layout.messageother, parent, false);
this.mMessageMeView = layoutInflater.inflate(R.layout.messageme, parent, false);
}
}
private final ArrayList<Msg> msgList;
private final LayoutInflater mLayoutInflater;
public MsgAdapter(Context context, ArrayList<Msg> messages) {
super(context, R.layout.activ, messages);
this.msgList = messages;
this.mLayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final ViewHolders cViewHolders;
if (convertView == null) {
cViewHolders = new ViewHolders(this.mLayoutInflater, parent);
convertView.setTag(cViewHolders);
} else {
cViewHolders = (ViewHolders)convertView.getTag();
}
final View finalView;
final Msg cMsg = this.getItem(position);
if (cMsg.getMine()) finalView = cViewHolders.mMessageMeView;
else finalView = cViewHolders.mMessageOthersView;
//"finalView" is the final inflated Layout
finalView.findViewById(....)
return finalView;
}
}
Дальнейшим шагом может быть кэширование всего необходимого представления для каждого из макетов, избегая выполнения полного «findById ()» для каждого элемента……