2017-05-20 12 views
0

チャットアプリケーションをモックアップして、画面の両側に送信者と受信者のメッセージを印刷しようとしています。 私はCustomAdapterを使用し、サーバー応答とユーザー送信メッセージに対して2つの異なるレイアウトを設定しました。 ユーザがsendMessage()関数を使って送信するすべてのメッセージを模擬した場合、サーバレスポンスにはsendMessage()関数内で呼び出される 'testRecievServerMessage()'があります。画面の両側に印刷するチャットメッセージ

これを実行すると、UIは常にサーバーの応答として設定されます。ユーザーが送信したメッセージとサーバーが送信したメッセージに異なるレイアウトを使用するようにこれを修正するにはどうすればよいですか。

私が間違っている場所を教えてください。

ご協力いただきありがとうございます。 userSentメッセージUI

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_marginBottom="5dp" 
android:weightSum="10"> 
    <LinearLayout 
     android:id="@+id/llFrontSpacing" 
     android:orientation="horizontal" 
     android:visibility="gone" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="3"></LinearLayout> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:id="@+id/tvUserMessage" 
     android:background="@color/colorAccent" 
     android:textColor="@color/colorWhite" 
     android:textSize="18dp" 
     android:padding="2dp" 
     android:layout_weight="7"/> 
    </LinearLayout> 

list_item_server_response.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_marginBottom="5dp" 
android:weightSum="10"> 
<TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/tvServerMessage" 
    android:background="@color/colorPrimaryDark" 
    android:textColor="@color/colorWhite" 
    android:textSize="18dp" 
    android:padding="2dp" 
    android:layout_weight="7"/> 
<LinearLayout 
    android:id="@+id/llEndSpacing" 
    android:orientation="horizontal" 
    android:visibility="invisible" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="3"></LinearLayout> 

</LinearLayout> 

データを送信ボタン

<android.support.design.widget.FloatingActionButton 
     android:id="@+id/btnSendMessage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:src="@drawable/ic_send" 
     android:tint="@android:color/white" 
     android:onClick="sendMessage" 
     /> 

OnCreate関数 - ここ

は私のコード

list_item.xmlです

ListView lvMessages = (ListView) findViewById(R.id.lvMessages); 
    customAdapter = new CustomAdapter(); 
    lvMessages.setAdapter(customAdapter); 

のSendMessageとレシーブメッセージやカスタムアダプタ

public void sendMessage(View v){ 

    String message = etMessage.getText().toString().trim(); 
    messages.add(message); 
    serverResponse = false; 
    customAdapter.notifyDataSetChanged(); 
    etMessage.setText(""); 
    testRecievServerMessage(); 
} 

public void testRecievServerMessage(){ 
    String testServerMessage = "Test"; 
    messages.add(testServerMessage); 
    serverResponse = true; 
    customAdapter.notifyDataSetChanged(); 
} 


class CustomAdapter extends BaseAdapter{ 

    @Override 
    public int getCount() { 
     int size = messages.size(); 
     return size; 
    } 

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(serverResponse == true){ 
      convertView = getLayoutInflater().inflate(R.layout.list_item_server_response, null); 
      TextView tvSingleMessage = (TextView) convertView.findViewById(R.id.tvServerMessage); 
      String message = messages.get(position); 
      tvSingleMessage.setText(message); 
     }else{ 
      convertView = getLayoutInflater().inflate(R.layout.list_item, null); 
      TextView tvSingleMessage = (TextView) 
      convertView.findViewById(R.id.tvUserMessage); 
      String message = messages.get(position); 
      tvSingleMessage.setText(message); 
     } 

     return convertView; 
    } 
} 

答えて

0

は、それはリスト全体が再投入されたとして私の悪い.. ブール値「serverResponse」の値を保持していませんでしたしています。

ArrayListを使用する代わりに、私はHashMapとArrayListを組み合わせて使用​​しました。これは、各メッセージがユーザーベースのメッセージかサーバーベースのメッセージかの情報を持っています。

ここには参照用のコードコードがすべて記載されています。

import android.support.design.widget.FloatingActionButton; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutCompat; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
    import android.widget.TextView; 
import android.widget.Toast; 
import org.w3c.dom.Text; 
import java.util.ArrayList; 
import java.util.HashMap; 

public class ChatWindow extends AppCompatActivity { 

ArrayList<HashMap<String, String>> allMessages = new 
ArrayList<HashMap<String,String>>(); 
HashMap<String, String> hmMessage; 
CustomAdapter customAdapter; 
EditText etMessage; 
FloatingActionButton btnSendMessage; 
Boolean serverResponse; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    serverResponse = false; 
    setContentView(R.layout.activity_chat_window); 
    etMessage = (EditText) findViewById(R.id.etMessage); 
    btnSendMessage = (FloatingActionButton) 
    findViewById(R.id.btnSendMessage); 

    hmMessage = new HashMap<String, String>(); 
    hmMessage.put("Key_source", "User"); 
    hmMessage.put("key_message", "Hi"); 
    allMessages.add(hmMessage); 
    hmMessage = new HashMap<String, String>(); 
    hmMessage.put("Key_source", "Server"); 
    hmMessage.put("key_message", "Connection established!.. How can I 
    help"); 
    allMessages.add(hmMessage); 
    ListView lvMessages = (ListView) findViewById(R.id.lvMessages); 
    customAdapter = new CustomAdapter(); 
    lvMessages.setAdapter(customAdapter); 


    etMessage.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
    int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int 
    count) { 
      if(s.length() > 0){ 
       btnSendMessage.setEnabled(true); 
      }else{ 
       btnSendMessage.setEnabled(false); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 
    } 

    public void sendMessage(View v){ 

    String message = etMessage.getText().toString().trim(); 
    hmMessage = new HashMap<String, String>(); 
    hmMessage.put("Key_source", "User"); 
    hmMessage.put("key_message", message); 
    allMessages.add(hmMessage); 
    customAdapter.notifyDataSetChanged(); 
    etMessage.setText(""); 
    testRecievServerMessage(); 
    } 

    public void testRecievServerMessage(){ 
    String testServerMessage = "Test"; 
    hmMessage = new HashMap<String, String>(); 
    hmMessage.put("Key_source", "Server"); 
    hmMessage.put("key_message", testServerMessage); 
    allMessages.add(hmMessage); 
    customAdapter.notifyDataSetChanged(); 
    } 


    class CustomAdapter extends BaseAdapter{ 

    @Override 
    public int getCount() { 
     int size = allMessages.size(); 
     return size; 
    } 

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     String source = allMessages.get(position).get("Key_source"); 
     String message = allMessages.get(position).get("key_message"); 
     if(source == "Server"){ 
      convertView = 
    getLayoutInflater().inflate(R.layout.list_item_server_response, null); 
      TextView tvSingleMessage = (TextView) 
    convertView.findViewById(R.id.tvServerMessage); 
      tvSingleMessage.setText(message); 
     }else{ 
      convertView = getLayoutInflater().inflate(R.layout.list_item, 
    null); 
      TextView tvSingleMessage = (TextView) 
    convertView.findViewById(R.id.tvUserMessage); 
      tvSingleMessage.setText(message); 
     } 

     return convertView; 
    } 
     } 


    } 
関連する問題