Вопрос

i have an android program that simulate chat. for it i use a list and items of list are in a XML file named activity_chat_conversation in this layout i have to linear layout that in each of them i have a EditText and an ImageView.

code:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/llmain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables" >

<LinearLayout
    android:id="@+id/llFrom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="7dp"
    android:visibility="gone" >

    <ImageView
        android:id="@+id/imgChatConversationFrom"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:background="@color/gray"
        android:contentDescription="@string/user_image"
        android:scaleType="fitCenter"
        android:src="@drawable/ic_user_image" />

    <TextView
        android:id="@+id/txtChatConversationFrom"
        android:layout_width="0dp"
        android:layout_height="45dp"
        android:layout_weight="1"
        android:background="@drawable/from"
        android:gravity="right|top"
        android:layoutDirection="rtl"
        android:paddingLeft="45dp"
        android:paddingRight="10dp"
        android:text="@string/user_name"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textDirection="rtl" />

</LinearLayout>

<LinearLayout
    android:id="@+id/llTo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="7dp"
    android:visibility="gone" >

    <TextView
        android:id="@+id/txtChatConversationTo"
        android:layout_width="0dp"
        android:layout_height="45dp"
        android:layout_weight="1"
        android:background="@drawable/to"
        android:gravity="right|top"
        android:layoutDirection="rtl"
        android:paddingRight="48dp"
        android:paddingTop="5dp"
        android:text="@string/user_name"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textDirection="rtl" />

    <ImageView
        android:id="@+id/imgChatConversationTo"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_gravity="bottom"
        android:background="@color/gray"
        android:contentDescription="@string/user_image"
        android:scaleType="fitCenter"
        android:src="@drawable/ic_user_image" />

</LinearLayout>

for filling list i create an adapter and in it i set what linear layout should be shown.

code:

globalVars.barConversation = new BaseAdapter() {
                            int searchUser = globalVars.findConversationByUsername(friendId);

                            @Override
                            public View getView(int position, View convertView, ViewGroup parent) {
                                View view = convertView;
                                if(convertView == null) {
                                    view = getLayoutInflater().inflate(R.layout.activity_chat_conversation, null);
                                }
                                LinearLayout llfrom = (LinearLayout)view.findViewById(R.id.llFrom);
                                LinearLayout llto = (LinearLayout)view.findViewById(R.id.llTo);
                                TextView textViewTo = (TextView)view.findViewById(R.id.txtChatConversationTo);
                                ImageView imageViewTo = (ImageView)view.findViewById(R.id.imgChatConversationTo);
                                TextView textViewFrom = (TextView)view.findViewById(R.id.txtChatConversationFrom);
                                ImageView imageViewFrom = (ImageView)view.findViewById(R.id.imgChatConversationFrom);

                                String pmUser = friendId;

                                if (searchUser > -1) {
                                    if (globalVars.conversations.get(searchUser).
                                            getConversation().get(position).getSender()) {
                                        pmUser = CurrentUser;
                                        if (globalVars.userImage != null) {
                                            imageViewTo.setImageBitmap(globalVars.userImage);
                                        }
                                    }else {
                                        try{
                                            if(globalVars.friends.get(friendInt).getImage() != null) {
                                                imageViewFrom.setImageBitmap(globalVars.friends.get(friendInt).getImage());
                                            }
                                        }
                                        catch(Exception ex)
                                        {
                                            Log.e("Chat get friend picture", ex.toString());
                                        }
                                    }
                                    if (!globalVars.conversations.get(searchUser).
                                            getConversation().get(position).getIsRead()) {
                                        globalVars.conversations.get(searchUser).
                                        getConversation().get(position).setIsRead(true);
                                        globalVars.newConversations--;
                                    }
                                    if(pmUser == CurrentUser)
                                    {
                                        llto.setVisibility(0);
                                        llfrom.setVisibility(8);
                                        textViewFrom.setVisibility(8);
                                        imageViewFrom.setVisibility(8);
                                        textViewTo.setText(globalVars.conversations.get(searchUser).
                                            getConversation().get(position).getText());
                                        textViewTo.setHeight(30);
                                    }
                                    else
                                    {
                                        llfrom.setVisibility(0);
                                        llto.setVisibility(8);
                                        textViewTo.setVisibility(8);
                                        imageViewTo.setVisibility(8);
                                        textViewFrom.setText(globalVars.conversations.get(searchUser).
                                                getConversation().get(position).getText());
                                    }
                                }
                                return view;
                            }

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

                            @Override
                            public Object getItem(int position) {
                                return position;
                            }

                            @Override
                            public int getCount() {
                                if (searchUser > -1) {
                                    return globalVars.conversations.get(searchUser).getConversation().size();
                                }
                                return 0;
                            }
                        };

when i add new item to list and set visibility for it previous items visibility will be changed.

how i can solve this problem ?

Это было полезно?

Решение

It happens because convertView == previously getView() method. You need to refresh parameters for Your new item. For example:

if(pmUser == CurrentUser)
{
    llto.setVisibility(0);
    textViewTo.setVisibility(0);
    imageViewTo.setVisibility(0); //this
    llfrom.setVisibility(8);
    textViewFrom.setVisibility(8);
    imageViewFrom.setVisibility(8);
    textViewTo.setText(globalVars.conversations.get(searchUser).
            getConversation().get(position).getText());
    textViewTo.setHeight(30);
}
else
{
    llfrom.setVisibility(0);
    textViewFrom.setVisibility(0);
    imageViewFrom.setVisibility(0); // this
    llto.setVisibility(8);
    textViewTo.setVisibility(8);
    imageViewTo.setVisibility(8);
    textViewFrom.setText(globalVars.conversations.get(searchUser).
            getConversation().get(position).getText());
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top