Android studio, пытается раздуть XML-файл с помощью базового xml и ArrayAdapter

#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 ()» для каждого элемента……