Android studio,尝试使用基本 xml 和 ArrayAdapter

问题描述

我正在尝试用一个 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;
    }
} 

现在,这只会复制“messageother”的相同 xml 文件,直到完成。 相反,id喜欢在ListView中一一进行,检查Msg.getmine() = true; 如果是这样,id 喜欢用 xml "messageme" 来膨胀那个:

View rowView = inflater.inflate(R.layout.messageme,false);

这样的事情我怎么办?

解决方法

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,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()”......

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...