導(dǎo)言:
很多人都喜歡使用安卓的listview進(jìn)行列表式的展示贮配,然而列表項(xiàng)的內(nèi)容往往不是一個(gè)單一的textview,可能是很多復(fù)雜的組件組合塞赂,該篇旨在幫助大家了解泪勒,如何制作自定義的listview item 并且實(shí)現(xiàn)item中組件的監(jiān)聽(tīng)和值傳遞。
樣例:
我們這次主要實(shí)現(xiàn)了一個(gè)類(lèi)似于酒店預(yù)訂展示的界面宴猾,采用listview布局酣藻,每個(gè)item由圖片、按鈕鳍置、各條文字組成
首先我們需要兩個(gè)layout
1.activity_order_results.xml 存放列表展示的底板
2.activity_order_results_item.xml 定義列表項(xiàng)組件的底板
接著我們需要編寫(xiě)一個(gè)OrderResultsActivity.java 的activity來(lái)控制第一個(gè)layout文件
最后需要編寫(xiě)一個(gè)OrderResultsAdapter.java 來(lái)定義每個(gè)列表項(xiàng)組件的adapter
代碼:
1.activity_room_results.xml ?放置了一個(gè)ListView組件
<?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">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
2.activity_order_results_item.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="wrap_content"
android:paddingBottom="10dp">
<ImageView
android:layout_width="135dp"
android:layout_height="115dp"
android:id="@+id/hotelPicture"
android:background="@mipmap/room_example"
android:layout_marginTop="8dp"
android:layout_marginLeft="8dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hotel Name"
android:textSize="17sp"
android:textStyle="bold"
android:textColor="@color/abc_input_method_navigation_guard"
android:layout_marginLeft="5dp"
android:id="@+id/hotelNameText"/>
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
style="?android:attr/ratingBarStyleSmall"
android:layout_marginLeft="10dp"
android:layout_gravity="center"
android:id="@+id/ratingBar"
android:stepSize="0.1"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hotel Location la la la"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:id="@+id/hotelLocationText"
android:textSize="14sp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="512$"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:textSize="14sp"
android:editable="false"
android:textColor="@color/bright_foreground_disabled_material_light"
android:id="@+id/originPrice"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="487$"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:textSize="18sp"
android:editable="false"
android:textColor="@color/material_deep_teal_500"
android:textStyle="bold"
android:id="@+id/currentPrice"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="35dp"
android:text="Order Now"
android:textSize="10sp"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:background="@drawable/round_button_orange"
android:textColor="@color/abc_primary_text_disable_only_material_dark"
android:id="@+id/orderNowButton"/>
<Button
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginLeft="10dp"
android:text="More Details"
android:textSize="10sp"
android:layout_marginTop="5dp"
android:background="@drawable/round_button_green"
android:textColor="@color/abc_primary_text_disable_only_material_dark"
android:id="@+id/decideButton"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
3. OrderResultsAdapter.java 自定義控制item組件的adapter
public classOrderResultsAdapterextendsBaseAdapter {
privateArrayListmData;
privateContextmContext;
publicOrderResultsAdapter(ArrayList mData,Context mContext){
this.mData=mData;
this.mContext=mContext;
}
@Override
public intgetCount() {
returnmData.size();
}
@Override
publicObject getItem(intposition) {
return null;
}
@Override
public longgetItemId(intposition) {
returnposition;
}
@Override
publicView getView(final intposition, View convertView, ViewGroup parent) {
if(convertView ==null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.activity_order_results_item,parent,false);
}
//初始化item的各個(gè)組件
finalImageView imageView1=(ImageView)convertView.findViewById(R.id.hotelPicture);
finalTextView originPrice=(TextView)convertView.findViewById(R.id.originPrice);
originPrice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
originPrice.setText(mData.get(position).getOriginPrice()+"");
finalTextView currentPrice=(TextView)convertView.findViewById(R.id.currentPrice);
currentPrice.setText(mData.get(position).getCurrentPrice()+"");
finalTextView hotelName=(TextView) convertView.findViewById(R.id.hotelNameText);
hotelName.setText(mData.get(position).getName());
finalTextView hotelLocation=(TextView) convertView.findViewById(R.id.hotelLocationText);
hotelLocation.setText(mData.get(position).getLocation());
Button orderNowButton=(Button)convertView.findViewById(R.id.orderNowButton);
Button decideButton=(Button)convertView.findViewById(R.id.decideButton);
imageView1.setBackgroundResource(R.mipmap.timg1);
RatingBar ratingBar=(RatingBar)convertView.findViewById(R.id.ratingBar);
ratingBar.setRating((float)mData.get(position).getPoints());
//設(shè)置按鈕的監(jiān)聽(tīng)辽剧,實(shí)現(xiàn)點(diǎn)擊后跳轉(zhuǎn)到酒店詳細(xì)內(nèi)容的界面,并且傳遞數(shù)據(jù)
decideButton.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View v) {
//使用bundle和intent實(shí)現(xiàn)界面間數(shù)據(jù)傳遞
if(true){
Intent intent=newIntent(mContext,RoomResultsDetailActivity.class);
Bundle b =newBundle();
b.putString("hotelName",hotelName.getText().toString());
b.putString("originPrice",originPrice.getText().toString());
b.putString("currentPrice",currentPrice.getText().toString());
b.putString("hotelLocation",hotelLocation.getText().toString());
b.putString("nego",negoString);
intent.putExtras(b);
mContext.startActivity(intent);
}
}
});
returnconvertView;
}
}
4. OrderResultsActivity
public classOrderResultsActivity extends AppCompatActivityimplementsAdapterView.OnItemClickListener{
privateListViewmListView;
privateArrayListmList;
privateMediaPlayermp;
@Override
public voidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setToolBarTitle("Order Results");
mp=MediaPlayer.create(OrderResultsActivity.this,R.raw.hotel_reserve_result);
getSubTitle().setText("Tips");
getSubTitle().setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View v) {
mp.start();
}
});
mListView=(ListView)findViewById(R.id.listView);
Resources res=this.getResources();
mList=newArrayList();
//初始化data
ArrayList tags=newArrayList<>();
OrderResultsEntity orderResultsEntity1=newOrderResultsEntity(255,230,"0.19km away from the destination","Lingnanjiayuan Chain Hotel",3.42,tags);
OrderResultsEntity orderResultsEntity2=newOrderResultsEntity(250,235,"0.31km away from the destination","Jiaxin Hotel",3.76,tags);
OrderResultsEntity orderResultsEntity3=newOrderResultsEntity(180,160,"0.22km away from the destination","Jiayu Hotel",4.11,tags);
OrderResultsEntity orderResultsEntity4=newOrderResultsEntity(198,162,"0.28km away from the destination","Inn De Hotel",4.74,tags);
OrderResultsEntity orderResultsEntity5=newOrderResultsEntity(260,240,"0.38km away from the destination","Wong Kim Dinh Hotel",3.21,tags);
mList.add(orderResultsEntity4);
mList.add(orderResultsEntity3);
mList.add(orderResultsEntity2);
mList.add(orderResultsEntity1);
mList.add(orderResultsEntity5);
OrderResultsAdapter orderResultsAdapter=newOrderResultsAdapter(mList,OrderResultsActivity.this);
mListView.setAdapter(orderResultsAdapter);
}
@Override
protected intgetLayoutId() {
returnR.layout.activity_order_results;
}
@Override
public voidonItemClick(AdapterView parent, View view,intposition,longid){
Toast.makeText(OrderResultsActivity.this,"你點(diǎn)擊了第"+ position +"項(xiàng)",Toast.LENGTH_SHORT).show();
Intent intent=newIntent();
intent.setClass(OrderResultsActivity.this,RoomResultsDetailActivity.class);
startActivity(intent);
}
}
5.最后可以自己寫(xiě)一下訂單的實(shí)體税产,定義你所需要的實(shí)體屬性