一、Android ListView控制項的用法
ListView是Android開發中最常用的控制項之一,它能夠在屏幕上展示一列數據,非常適合用於列表或者網格等展示數據的場景。下面我們將從ListView的基本用法、自定義Adapter、點擊事件監聽器、長按事件監聽器等多個方面進行詳細闡述。
1. ListView的基本用法
ListView的基本使用非常簡單,只需兩步:
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
listView = findViewById(R.id.list_view);
listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, data));
第一步:在布局文件中定義ListView控制項
第二步:在代碼中為ListView設置Adapter
2. 自定義Adapter
雖然ArrayAdapter可以滿足ListView一般的需求,但在實際開發中,我們通常需要實現自己的Adapter來滿足更複雜的需求。
自定義Adapter需要繼承自BaseAdapter,實現四個方法:getCount、getItem、getItemId和getView。其中getView方法是最重要的,它決定了ListView中每一項的具體展示。
public class MyAdapter extends BaseAdapter {
private List mData;
private LayoutInflater mLayoutInflater;
public MyAdapter(Context context, List data) {
mData = data;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = mLayoutInflater.inflate(R.layout.item_layout, parent, false);
viewHolder = new ViewHolder();
viewHolder.textView = convertView.findViewById(R.id.text_view);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(mData.get(position));
return convertView;
}
static class ViewHolder {
TextView textView;
}
}
3. 點擊事件監聽器
為ListView的每一項設置點擊事件監聽器非常簡單。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "You clicked item " + position, Toast.LENGTH_SHORT).show();
}
});
4. 長按事件監聽器
為ListView的每一項設置長按事件監聽器同樣非常簡單。
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "You long clicked item " + position, Toast.LENGTH_SHORT).show();
return true;
}
});
二、Android ListView傳值
有時候需要在ListView中點擊某一項時傳遞一些參數到下一個Activity中,這時可以使用Bundle來傳遞數據。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
Bundle bundle = new Bundle();
bundle.putString("data", data.get(position));
intent.putExtras(bundle);
startActivity(intent);
}
});
三、Android ListView放大縮小
有時候需要讓用戶手動放大縮小ListView,下面給出兩種方法。
1. 設置列表項的高度
在ListView的Adapter中實現getItemViewType和getViewTypeCount方法,並在getView方法中根據需要改變列表項的高度即可。
@Override
public int getItemViewType(int position) {
if (position == 0) {
return TYPE_HEADER;
} else {
return TYPE_NORMAL;
}
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (getItemViewType(position) == TYPE_HEADER) {
// header item
...
} else {
// normal item
convertView.setLayoutParams(new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, mItemHeight));
...
}
}
2. 使用setScaleX和setScaleY方法縮放
在Activity的onCreate方法中設置ListView的transformPivotX和transformPivotY坐標,並通過點擊事件設置setScaleX和setScaleY來實現放大縮小。
listView = findViewById(R.id.list_view);
listView.setPivotX(0);
listView.setPivotY(0);
// 放大
listView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listView.animate().scaleX(2f).scaleY(2f).setDuration(500).start();
}
});
// 縮小
listView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
listView.animate().scaleX(1f).scaleY(1f).setDuration(500).start();
return true;
}
});
四、Android ListView分頁載入的原理
實現ListView的分頁載入通常需要配合後台服務來完成,下面介紹分頁載入的原理:
1. 後台服務根據請求參數和當前頁數,返回對應的數據。
2. 在前台Activity的ListView的Adapter中保存當前已經載入的數據,以及當前頁碼。
3. 當ListView滑動到底部時,向後台服務請求下一頁數據,並將新的數據添加到已有數據的末尾。
4. 為了防止連續請求重複數據,可以設置一個isLoading的標誌位,在載入完數據後將其設置為false。
五、ListView控制項和android ListView
ListView控制項是Android提供的一種展示數據的控制項,而android ListView是ListView控制項在Android平台下的具體實現。
如果你需要在Android應用中展示一列數據,ListView控制項是常用的選擇,而android ListView是ListView的具體應用,提供了非常豐富的功能和API供開發者使用。
六、安卓ListView控制項的用法
安卓ListView控制項的用法與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:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private ListView listView;
private List data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initListView();
}
private void initData() {
data = new ArrayList();
for (int i = 0; i < 100; i++) {
data.add("Item " + i);
}
}
private void initListView() {
listView = findViewById(R.id.list_view);
listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, data));
}
}
七、Android ListView控制項詳解完整代碼示例
public class MainActivity extends AppCompatActivity {
private ListView listView;
private List data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initListView();
// 點擊事件監聽器
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "You clicked item " + position, Toast.LENGTH_SHORT).show();
}
});
// 長按事件監聽器
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "You long clicked item " + position, Toast.LENGTH_SHORT).show();
return true;
}
});
// 放大
listView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listView.animate().scaleX(2f).scaleY(2f).setDuration(500).start();
}
});
// 縮小
listView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
listView.animate().scaleX(1f).scaleY(1f).setDuration(500).start();
return true;
}
});
}
private void initData() {
data = new ArrayList();
for (int i = 0; i < 100; i++) {
data.add("Item " + i);
}
}
private void initListView() {
listView = findViewById(R.id.list_view);
listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, data));
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/154813.html