首先昨天的博客先看了再看這裏的內容,你要知道在listView中顯示的是一個信息,可是其實它是由兩條信息組成的,也就是在之後設計ItemLayout必定要機靈,說說我犯的錯誤吧,java
主函數中,個人adpater變量在方法內聲明,致使若是須要在外部方法調用,就要聲明稱final屬性的,。。。因此變量在聲明的時候必定要想好,你須要的是局部變量仍是全局變量。android
在MsgAdpater類寫的過程當中,須要注意的事項,view變量的存在,不須要再一開始聲明的時候就初始化,緣由是假如convertView不爲空,咱們每次都白白初始化,,,,ide
當convertView不爲空時候,要麼你直接在判斷語句中爲其賦值(可得出convertView其實只有佈局沒有值存在,因此返回空的誰不行的),而後返回,要不就等着到最後統一return。。。這就要在return前寫清楚賦值狀況了。函數
convertView爲空的狀況有幾回呢,,,,除了屏幕顯示的數量+一、就對了。由於convertView是在最頂端的item佈局所有出去的時候纔會被賦值給convertView。因此爲空的狀況就只有(屏幕顯示的數量+1)次。佈局
最後if判斷誰顯示誰不顯示,誰的值賦給那個控件,這些賦值操做最好在Viewhoder佈局都確立了再寫。性能
細節需注意的。。。convertView不爲空,可是吧Viewhloder = convertView.getTag();這句寫上。這樣保證一個convertView和一個ViewHloder綁定。之因此說他倆提升性能就是由於這倆哥們一個負責自動找到在哪一個VIEW,一個自動找到在哪一個控件,不用重複找了,你能懂我啥意思麼,不懂就問吧。。。ui
convertView爲空的時候,view被inflate出來之後,使用viewHloder去findViewById找到各個控件,而後必定要view,setTag()= viewHolder;這和上面目的同樣,成對出現纔對。this
個人對話框間距好大啊,通過研究,原來是View.GONE和View.INVISBLE形成的spa
代碼貼出設計
itemView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/left_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="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="#ff0000"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/right_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="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>
mainView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d8e0e8"
android:orientation="vertical" >
<ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/listview"
android:divider="#0000"
></ListView>
<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 somthing here"
android:maxLines="2" />
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send" />
</LinearLayout>
MSg類
package com.example.uitest;
public class Msg {
public final static int MSG_RECEIVED = 0;
public final static int MSG_SEND = 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;
}
}
adapater類
package com.example.uitest;
import java.util.List;
import android.content.Context;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MsgAdapter extends ArrayAdapter<Msg> {
private int resourceId;
public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Msg msg = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
ViewHolder viewHolder = new ViewHolder();
if(convertView != null){view = convertView;viewHolder = (ViewHolder) view.getTag();}
else {
viewHolder.leftLayout = (LinearLayout) view.findViewById(R.id.left_layout);
viewHolder.rightLayout = (LinearLayout) view.findViewById(R.id.right_layout);
viewHolder.leftMsg = (TextView) view.findViewById(R.id.left_msg);
viewHolder.rightMsg = (TextView) view.findViewById(R.id.right_msg);
view.setTag(viewHolder);
}
if(msg.getType() == Msg.MSG_RECEIVED){
viewHolder.rightLayout.setVisibility(View.INVISIBLE);
viewHolder.leftLayout.setVisibility(View.VISIBLE);
viewHolder.leftMsg.setText(msg.getContent());
}else{
viewHolder.leftLayout.setVisibility(View.INVISIBLE);
viewHolder.rightLayout.setVisibility(View.VISIBLE);
viewHolder.rightMsg.setText(msg.getContent());
}
return view;
}
public class ViewHolder{
LinearLayout leftLayout;
LinearLayout rightLayout;
TextView leftMsg;
TextView rightMsg;
}
}
MAinACTIVITY
public class MainActivity extends Activity implements OnClickListener {
ListView listView;
Button btn_send;
TextView textView;
List<Msg> msgList = new ArrayList<Msg>();
MsgAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
btn_send = (Button) findViewById(R.id.send);
textView = (TextView) findViewById(R.id.input_text);
Msg msg1 = new Msg("hello",0);
Msg msg2 = new Msg("who is that", 1);
Msg msg3 = new Msg("!!!", 0);
msgList.add(msg1);msgList.add(msg2);msgList.add(msg3);
adapter = new MsgAdapter(MainActivity.this, R.layout.activity_itemview, msgList);
listView.setAdapter(adapter);
btn_send.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (textView.getText().equals("")){Toast.makeText(MainActivity.this, "請輸入一些東西吧", Toast.LENGTH_SHORT).show();}
else{
Msg msgsend = new Msg(textView.getText().toString(), 1);Msg msgres = new Msg("!!!!!!!!!!!!!!!!!!!!!!!", 0);
msgList.add(msgsend);
msgList.add(msgres);
adapter.notifyDataSetChanged();
listView.setSelection(msgList.size());
textView.setText("");
}
}
}
頁面