1.聊天界面
在app/build.gradle中添加依賴庫(kù)
?implementation'com.android.support:recyclerview-v7:28.0.0'
修改activity_mian_xml代碼
1.android.support.v7.widget.RecyclerView 的完整包路徑。
定義實(shí)體類Msg? ? ? ? ? ? ? ? ?content表示內(nèi)容 ,type表示類型:發(fā)送,接收。
public class Msg {
public static final int TYPE_RECEIVED=0;
public static final int TYPE_SENT=0;
private Stringcontent;
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;
}
}
新建一個(gè)item.xml 為RecyclerVIew的子項(xiàng)
包含兩個(gè)對(duì)話圖片用兩個(gè)(Linearlayout)
創(chuàng)建RecyclerVIew的適配器MsgAdapter
public class MsgAdapterextends RecyclerView.Adapter {
private List<Msg>??mMsglist;
static class ViewHolderextends RecyclerView.ViewHolder{//避免findviewbyid重復(fù)注冊(cè)
LinearLayoutleftLayout;//成員變量
LinearLayoutrightLayout;
TextViewleftmsg;
TextViewrightmsg;
public ViewHolder(View view){//封裝到Viewholder里面
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);
rightmsg=(TextView)view.findViewById(R.id.right_msg);
}
}
public MsgAdapter(List<Msg>?msgList){//
mMsglist=msgList;//把要展示的數(shù)據(jù)賦值給全局變量
}
@NonNull
@Override
? ? public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {//oncreate創(chuàng)建Viewholder的實(shí)例
View view=LayoutInflater.from(prent.getContext()).inflate(R.layout.msg_item,parent,false);
return new ViewHolder(view);
}
@Override
? ? public void onBindViewHolder(@NonNull ViewHolder holder,int position) {bin方法是對(duì)子項(xiàng)數(shù)據(jù)賦值
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.leftLayout.setVisibility(View.GONE);
holder.rightLayout.setVisibility(View.VISIBLE);
holder.rightmsg.setText(msg.getContent());
}
}
@Override
? ? public int getItemCount() {//告訴我們一共有多少子項(xiàng)
return mMsglist.size();
}
}
最后是MainActivity中的代碼
public class MainActivityextends 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);
inirMsgs();//初始化數(shù)據(jù)
inputText=(EditText)findViewById(R.id.input_text);
send=(Button)findViewById(R.id.send);
msgRecyclerView=(RecyclerView)findViewById(R.id.msg_parent);
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
msgRecyclerView.setAdapter(adapter);//綁定適配器
Log.d("MainActivity" ,"adpter");
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);//新數(shù)據(jù)插入
msgRecyclerView.scrollToPosition(msgList.size()-1);//定位到最后一行
inputText.setText("");//清空數(shù)據(jù)
}
Toast.makeText(MainActivity.this,"true",Toast.LENGTH_SHORT).show();
}
});
}
private void inirMsgs(){
Msg msg1=new Msg("1",Msg.TYPE_RECEIVED);
msgList.add(msg1);
Msg msg2=new Msg("2",Msg.TYPE_SENT);
msgList.add(msg2);
Msg msg3=new Msg("3",Msg.TYPE_RECEIVED);
msgList.add(msg3);
}
}
logcat日志顯示錯(cuò)誤:No adapter attached; skipping layout
1.沒(méi)有綁定適配器 setAdpter()已綁定
2.布局設(shè)置成RelativeLayout? ? 沒(méi)有用
3.使用 msgRecyclerView.setLayoutManager(layoutManager);無(wú)用
解決??private MsgAdapter? ?adapter;定義全局變量
MsgAdapter adapter=new MsgAdapter(msgList);//創(chuàng)建adpter的實(shí)例