Android 채 팅 창 구현

11258 단어 Android채 팅 창
본 논문 의 사례 는 안 드 로 이 드 가 채 팅 인터페이스 를 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 에 게 참고 하 실 수 있 습 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
파일 디 렉 터 리

app 의 build.gradle 에 의존 라 이브 러 리 추가(RecyclerView)

apply plugin: 'com.android.application'

android {
  compileSdkVersion 24
  buildToolsVersion "26.0.1"
  defaultConfig {
    applicationId "com.example.uibestpractice"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  }
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguarrules.pro'
    }
  }
}

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  })
  compile 'com.android.support:appcompat-v7:24.2.1'
  compile 'com.android.support.constraint:constraint-layout:1.0.2'
  compile 'com.android.support:recyclerview-v7:24.2.1'//  RecyclerView   
  testCompile 'junit:junit:4.12'
}
주 인터페이스 작성(activitymain.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#d8e0d8">

<android.support.v7.widget.RecyclerView
  android:id="@+id/msg_recycler_view"
  android:layout_width="match_parent"
  android:layout_height="0dp"
  android:layout_weight="1"/>

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

  <EditText
    android:id="@+id/input_text"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:hint="Type something here"
    android:maxLines="2"/>

  <Button
    android:id="@+id/send"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Send"/>

</LinearLayout>

</LinearLayout> 
메 인 화면 에 설 치 된 RecyclerView 는 메 시 지 를 표시 하 는 데 사 용 됩 니 다
  • EditText 는 메 시 지 를 편집 하 는 데 사 용 됩 니 다
  • 버튼 은 메 시 지 를 보 내 는 데 사 용 됩 니 다.
    정 의 된 메시지 의 실체 클래스 Msg
    
    package com.example.uibestpractice;
    
    public class Msg {
      public static final int TYPE_RECEIVED = 0;
      public static final int TYPE_SENT = 1;
      private String content;
      private int type;
    
      public Msg(String content,int type) {
        this.content = content;
        this.type = type;
      }
    
      public String getContent() {
        return content;
      }
      public int getType() {
        return type;
      }
    }
  • 두 상수 로 메시지 의 유형 을 표시 합 니 다(받 은 것 인지 보 낸 것 인지)
  • RecyclerView 의 하위 레이아웃 작성(msgitem.xml)
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:padding="10dp">
    
      <LinearLayout
        android:id="@+id/left_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:background="@drawable/message_left">
    
        <TextView
          android:id="@+id/left_msg"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:layout_margin="10dp"
          android:textColor="#fff"/>
      </LinearLayout>
    
      <LinearLayout
        android:id="@+id/right_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:background="@drawable/message_right">
    
        <TextView
          android:id="@+id/right_msg"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:layout_margin="10dp"/>
      </LinearLayout>
    
    </LinearLayout>
    받 은 메 시 지 를 왼쪽 으로 정렬 하고 보 낸 메 시 지 를 오른쪽 으로 정렬 합 니 다.
    RecyclerView 어댑터 클래스 만 들 기
    
    package com.example.uibestpractice;
    
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder>{
      private List<Msg> mMsgList;
    
      static class ViewHolder extends RecyclerView.ViewHolder {
        LinearLayout leftLayout;
        LinearLayout rightLayout;
        TextView leftMsg;
        TextView rihgtMsg;
    
        public ViewHolder(View view) {
          super(view);
          leftLayout = (LinearLayout) view.findViewById(R.id.left_layout);
          rightLayout = (LinearLayout) view.findViewById(R.id.right_layout);
          leftMsg = (TextView) view.findViewById(R.id.left_msg);
          rihgtMsg = (TextView) view.findViewById(R.id.right_msg);
        }
      }
    
      public MsgAdapter(List<Msg> msgList) {
        mMsgList = msgList;
      }
    
      @Override
      public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item,parent,false);
        return new ViewHolder(view);
      }
    
      @Override
      public void onBindViewHolder(ViewHolder holder, int position) {
        Msg msg = mMsgList.get(position);
        if (msg.getType() == Msg.TYPE_RECEIVED) {
          holder.leftLayout.setVisibility(View.VISIBLE);
          holder.rightLayout.setVisibility(View.GONE);
          holder.leftMsg.setText(msg.getContent());
        } else if (msg.getType() == Msg.TYPE_SENT) {
          holder.rightLayout.setVisibility(View.VISIBLE);
          holder.leftLayout.setVisibility(View.GONE);
          holder.rihgtMsg.setText(msg.getContent());
        }
      }
    
      @Override
      public int getItemCount() {
        return mMsgList.size();
      }
    }
    4.567917.내부 클래스 ViewHolder 를 정의 하고 RecyclerView.ViewHolder 를 계승 합 니 다.ViewHolder 의 구조 함수 에 View 매개 변 수 를 입력 합 니 다.이 매개 변 수 는 보통 RecyclerView 하위 항목 의 가장 바깥쪽 레이아웃 입 니 다.그러면 우 리 는 findViewById()방법 을 통 해 레이아웃 의 수신 과 메 시 지 를 보 내 는 인 스 턴 스 를 얻 을 수 있 습 니 다
  • MsgAdapter 에 도 구조 함수 가 있 습 니 다.보 여줄 데이터 원본 을 전송 하여 mMsgList 에 복사 합 니 다
  • MsgAdapter 는 RecyclerView.Adapter 에서 계승 합 니 다.onCreateViewHolder(),onBindViewHolder(),getItemCount()세 가지 방법 을 다시 써 야 합 니 다
  • onCreate ViewHolder()는 ViewHolder 인 스 턴 스 를 만 드 는 데 사 용 됩 니 다.이 방법 에서 msgitem 레이아웃 을 불 러 온 다음 ViewHolder 인 스 턴 스 를 만 들 고 불 러 온 레이아웃 을 구조 함수 에 전송 하여 인 스 턴 스 를 되 돌려 줍 니 다
  • onBindView Holder()는 RecyclerView 하위 항목 의 데 이 터 를 할당 하 는 데 사 용 됩 니 다
  • getItemCount()획득 RecyclerView 몇 개 키
  • RecyclerView 사용(MainActivity 수정)
    
    package com.example.uibestpractice;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
      private List<Msg> msgList = new ArrayList<>();
      private EditText inputText;
      private Button send;
      private RecyclerView msgRecyclerView;
      private MsgAdapter adapter;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initMsgs();
        inputText = (EditText) findViewById(R.id.input_text);
        send = (Button) findViewById(R.id.send);
        msgRecyclerView = (RecyclerView) findViewById(R.id.msg_recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        msgRecyclerView.setLayoutManager(layoutManager);
        adapter = new MsgAdapter(msgList);
        msgRecyclerView.setAdapter(adapter);
        send.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            String content = inputText.getText().toString();
            if (!"".equals(content)) {
              Msg msg = new Msg(content,Msg.TYPE_SENT);
              msgList.add(msg);
              adapter.notifyItemInserted(msgList.size()-1);
              msgRecyclerView.scrollToPosition(msgList.size()-1);
              inputText.setText("");
            }
          }
        });
      }
    
      private void initMsgs() {
        Msg msg1 = new Msg("Hello",Msg.TYPE_RECEIVED);
        msgList.add(msg1);
        Msg msg2 = new Msg("I'm John",Msg.TYPE_RECEIVED);
        msgList.add(msg2);
        Msg msg3 = new Msg("Hello",Msg.TYPE_SENT);
        msgList.add(msg3);
      }
    }
    onCreate()방법 에서 먼저 RecyclerView 의 인 스 턴 스 를 얻 은 다음 LinearLayoutManager 대상 을 만 들 고 RecyclerView 의 인 스 턴 스 에 설정 합 니 다.LayoutManager 는 RecyclerView 의 레이아웃 방식 을 지정 하 는 데 사 용 됩 니 다.여 기 는 선형 레이아웃 이라는 뜻 으로 ListView 와 같은 효 과 를 실현 할 수 있 습 니 다.
    send 단추 의 응답 이 벤트 를 설 정 했 습 니 다.내용 이 비어 있 지 않 으 면 새 Msg 대상 을 만 들 고 msgList 에 추가 한 다음 어댑터 의 방법 notify ItemInserted()를 호출 하여 목록 에 새 데이터 가 삽입 되 었 음 을 알 립 니 다.그래 야 새로 추 가 된 메 시 지 를 RecyclerView 에 표시 할 수 있 습 니 다.이 어 RecyclerView 의 scrollToPosition()방법 을 호출 하여 표 시 된 데 이 터 를 마지막 줄 로 정 하고 마지막 으로 입력 표시 줄 을 비 웁 니 다.
    효과 그림:

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기