自定义适配器不根据条件更改布局

时间:2018-02-22 13:53:09

标签: android android-layout listview android-adapter

我正在开发一个聊天应用程序,我对使用ListViews和ArrayAdapter以及自定义适配器非常陌生。我遇到的问题导致我的列表中的所有项目都是一个布局,即使它们应该根据布尔值进行更改(真正的是一个外向聊天泡泡,而false将是一个传入的聊天泡泡)。

这是我的聊天记录的代码(它不是整个文件,只是一个片段):

变量声明:

final ArrayList<chatBubble> objects = new ArrayList<>();
final CustomAdapter customAdapter = new CustomAdapter(this, objects);
listView.setAdapter(customAdapter);

获取邮件并添加到列表的代码:

 mDatabase.child("chat").child("publicDump").child("dumpedMessages").child("message" + i).addListenerForSingleValueEvent(new ValueEventListener() {

             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {

                 final String message = dataSnapshot.getValue(String.class);
                      if (message != null) {

                           final String extract = message.substring(message.lastIndexOf("<") + 1, message.indexOf(">"));
                                           mDatabase.child("users").child("c").child("emailToUsername").child(mAuth.getCurrentUser().getEmail().replace(".", ",")).child("username").addListenerForSingleValueEvent(new ValueEventListener() {
                                                        @Override
                                                        public void onDataChange(DataSnapshot dataSnapshot) {

                                                            String username = dataSnapshot.getValue(String.class);
                                                            if (username != null) {

                                                                if (username.equals(extract)) {

                                                                    Log.i("Extract", extract);

                                                                    int semicnt = 0;
                                                                    int num = 0;
                                                                    //Log.i("Loop", "Yes");

                                                                    for (int i = 0; i < message.length(); i++) {

                                                                        //Log.i("Loop", "y");

                                                                        if (String.valueOf(message.charAt(i)).equals(":")) {

                                                                            semicnt++;
                                                                            //Log.i("cnt", String.valueOf(semicnt));

                                                                            if (semicnt == 3) {

                                                                                num = i;
                                                                                i = message.length() - 1;
                                                                                String time = message.substring(0, (Math.min(message.length(), num)));
                                                                                String finalM = message.replace(time + ": ", "").replace("<" + extract + "> ", "");
                                                                                chatBubble chat = new chatBubble(finalM, "From: " + extract + " At: " + time, true);
                                                                                objects.add(chat);



                                                                            }

                                                                        }

                                                                    }

                                                                } else {



                                                                    int semicnt = 0;
                                                                    int num = 0;
                                                                   // Log.i("Loop", "Yes");

                                                                    for (int i = 0; i < message.length(); i++) {

                                                                        //Log.i("Loop", "y");

                                                                        if (String.valueOf(message.charAt(i)).equals(":")) {

                                                                            semicnt++;
                                                                            //Log.i("cnt", String.valueOf(semicnt));

                                                                            if (semicnt == 3) {

                                                                                num = i;
                                                                                i = message.length() - 1;
                                                                                String time = message.substring(0, (Math.min(message.length(), num)));
                                                                                String finalM = message.replace(time + ": ", "").replace("<" + extract + "> ", "");
                                                                                chatBubble chat = new chatBubble(finalM, "From: " + extract + " At: " + time, false);
                                                                                objects.add(chat);
                                                                            }

                                                                        }



                                                                    }

                                                                }

                                                                customAdapter.notifyDataSetChanged();

                                                            }

                                                        }

                                                        @Override
                                                        public void onCancelled(DatabaseError databaseError) {

                                                        }
                                                    });



                                                }

                                            }

                                            @Override
                                            public void onCancelled(DatabaseError databaseError) {

                                            }
                                        });

以下是我的chatBubble的代码:

package com.tejasmehta.codeychat;

public class chatBubble {


        private String msg;
        private String date;
        private boolean myMessage;

        public chatBubble(String msg, String date, boolean myMessage) {
            this.msg = msg;
            this.date = date;
            this.myMessage = myMessage;
        }

        public String Msg() {
            return msg;
        }

        public String Date() {
            return date;
        }

        public boolean myMessage() {
            return myMessage;
        }

}

这是我的customAdapter的代码(显示如果boolean,myMessage为true,它将加载不同的布局,而另一个布局为false):

public class CustomAdapter extends BaseAdapter {

    private LayoutInflater inflater;
    private ArrayList<chatBubble> objects;

    private class ViewHolder {
        TextView msg;
        TextView date;
    }

    public CustomAdapter(Context context, ArrayList<chatBubble> objects) {
        inflater = LayoutInflater.from(context);
        this.objects = objects;
    }

    public int getCount() {
        return objects.size();
    }

    public chatBubble getItem(int position) {
        return objects.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        int layoutResource; // determined by view type
        chatBubble ChatBubble = getItem(position);

        if (ChatBubble.myMessage()) {
            layoutResource = R.layout.right_bubble;
        } else {
            layoutResource = R.layout.left_bubble;
        }
        if(convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(layoutResource, null);
            holder.msg = convertView.findViewById(R.id.txt_msg);
            holder.date = convertView.findViewById(R.id.date);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.msg.setText(objects.get(position).Msg());
        holder.date.setText(objects.get(position).Date());
        return convertView;
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

问题是你的getview 该视图正在被回收,因此convertview已经有了一个布局。所以它没有被重新定义为正确的布局。

你需要使用getViewType()和getViewTypeCount()来告诉列表视图你想要使用不同的布局 http://android.amberfog.com/?p=296

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return getItem(position).myMessage()?0:1;
}



public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        int layoutResource; // determined by view type
        chatBubble ChatBubble = getItem(position);

        if (ChatBubble.myMessage()) {
            layoutResource = R.layout.right_bubble;
        } else {
            layoutResource = R.layout.left_bubble;
        }
        if(convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(layoutResource, null);
            holder.msg = convertView.findViewById(R.id.txt_msg);
            holder.date = convertView.findViewById(R.id.date);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.msg.setText(objects.get(position).Msg());
        holder.date.setText(objects.get(position).Date());
        return convertView;
    }