1

チャット画面で作成しましたが、左側に送信メッセージ、右側に受信メッセージを表示したいのですが。
これを行うために、右用と左用の2つのxmlを作成し、この2つのxmlをアダプターにバインドしました。
問題は、テキストを送信すると左側に配置され、テキストを受信すると送信されたテキストも右側に配置され、再度送信するとテキスト全体(チャット)が左側に配置されることです。

これが私のArrayAdapterです:

private void setListAdapterL() {
    ArrayAdapter<String> adapterL = new ArrayAdapter<String>(this,
            R.layout.row_left, messages);
    mList.setAdapter(adapterL);
}

private void setListAdapterR() {
    // TODO Auto-generated method stub
    ArrayAdapter<String> adapterR = new ArrayAdapter<String>(this,
            R.layout.row_right, messages);
    mList.setAdapter(adapterR);
}

row_right.xmlのxmlファイル。他のrow_left.xmlでは、重力だけが変更されています。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="right"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:paddingLeft="5dip" />

任意のアイデアや提案をいただければ幸いです。
ありがとう

4

3 に答える 3

2

これを行うには、左側のアイテム(つまり、送信済みアイテム)と右側のアイテム(つまり、受信済みアイテム)用に2つの別個のアダプターを作成する代わりに、リストビュー用のカスタムアダプターを作成する必要があります。

これは、1つのカスタムアダプタで送受信されたメッセージを管理していることを意味します。

例えば

// Sample messages inside MessageActivity
void initMessages() {
  HashMap<String, String> messageSent = new HashMap<String, String>();
  messageSent.put("message", "Hi");
  messageSent.put("type", "sent");
  messageSent.put("date", "");

  HashMap<String, String> messageReceived = new HashMap<String, String>();
  messageSent.put("message", "Hello");
  messageSent.put("type", "received");
  messageSent.put("date", "");

  ArrayList<HashMap<String, String>> messages = new ArrayList<HashMap<String, String>>();
  messages.add(messageSent);
  messages.add(messageReceived);

  MessageAdapter adapter = new MessageAdapter(mContext, messages);
  setListAdapter(apater);
}

// adapter class
class MessageAdapter extends ArrayAdapter<HashMap<String, String>> {

    LayoutInflater inflater;

    public MessageAdapter(Context context, ArrayList<HashMap<String, String>> data) {
        super(context, R.layout.raw_message, data);
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

        if(convertView == null) {
            convertView = inflater.inflate(R.layout.raw_message, null);
            holder = new ViewHolder();
            holder.txtSent = convertView.findViewByTag("sent");
            holder.txtReceived = convertView.findViewByTag("received");
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        HashMap<String,String> message = getItem(position);
        boolean sent = message.get("type").equals("sent");

        if(sent) {
            holder.txtSent.setVisibility(View.VISIBLE);
            holder.txtSent.setText(message.get("message"));
            holder.txtReceived.setVisibility(View.GONE);
        } else {
            holder.txtSent.setVisibility(View.GONE);
            holder.txtReceived.setText(message.get("message"));
            holder.txtReceived.setVisibility(View.VISIBLE);     
        }
    }

    class ViewHolder {
        TextView txtSent;
        TextView txtReceived;
    }
}

// raw_message.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"    
    android:padding="5dp">

    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:tag="sent"/>

    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:tag="received"/>

</RelativeLayout>
于 2012-05-22T07:19:43.793 に答える
1

問題は、テキストを送信すると左側に配置され、テキストを受信すると送信されたテキストも右側に配置され、再度送信するとテキスト全体(チャット)が左側に配置されることです。

これはおそらく、新しいメッセージを受け取るたびにListView、新しい重力(左または右)での新しいアダプターを設定するために発生しています。新しいアダプタはチャット内のすべてのメッセージを保持するため、すべてのメッセージが左または右に配置されます。

私のアドバイスは、実際のメッセージとそのステータス(受信または送信されたメッセージ)を保持するデータオブジェクトクラスを使用することです。

class Message {
    String actualMessage;
    int status = 0; //(for example 0 for sent messages and 1 for received messages)

    public String toString() {
       return actualMessage;
    }
}

次に、独自のアダプタを実装し、getViewメソッドでどのタイプのメッセージがあるかを確認し、その特定の行の方向を左または右に設定します。ArrayAdapterこれにより、新しいオブジェクトを毎回作成する代わりに、メッセージのリストを更新することもできます。アダプターの例:

public class CustomAdapter extends ArrayAdapter<Message> {

     public CustomAdapter(Context context, int resId, List<message> data) {
          super(context, resId, data);
     }

     public View getView(int position, View convertView, ViewGroup parent) {
         TextView tv = (TextView) super.getView(position, convertView, parent);
         Message msg = getItem(position);
         if (msg.status == 0) {
               tv.setGravity(Gravity.LEFT);
         } else {
               tv.setGravity(Gravity.RIGHT);
         } 
     }

}
于 2012-05-22T07:15:49.483 に答える
0

すべてのアイテムが常に新しいレイアウトに変更されるという問題に直面しています。したがって、左側のレイアウトを設定するたびに、すべてが左側に移動します。その逆も同様です。

必要なのは、 2つのテキストビューを作成できるカスタムアダプタです。1つは右側用、もう1つは左側用です。

于 2012-05-22T07:13:57.117 に答える