一、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));
}
}