网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
R.id.cheese_name,
cheeses
);
### 4. 创建列表
要显示可垂直滚动的项目列表,可以使用微件。要将小部件添加到活动中,可以将其拖放到活动的布局 XML 文件中,也可以使用 Java 代码中的构造函数创建小组件。
ListView cheeseList = new ListView(this);
setContentView(cheeseList);
若要将其绑定到我们在上一步中创建的适配器,请调用如下所示的方法。
cheeseList.setAdapter(cheeseAdapter);
如果现在运行应用,则应该能够以列表的形式查看数组的内容。
### 5. 创建网格
要显示可垂直滚动的项目二维网格,可以使用微件。两者都是抽象类的子类,它们有许多相似之处。因此,如果您知道如何使用其中一个,那么您也知道如何使用另一个。
使用类的构造函数创建一个新实例,并将其传递给活动的方法。
GridView cheeseGrid = new GridView(this);
setContentView(cheeseGrid);
若要设置网格中的列数,请调用其方法。我将把它做成一个两列的网格。
cheeseGrid.setNumColumns(2);
通常,您希望使用 、 和 方法来调整列的宽度和之间的间距。请注意,这些方法使用像素作为其单位。setColumnWidth()setVerticalSpacing()setHorizontalSpacing()
cheeseGrid.setColumnWidth(60);
cheeseGrid.setVerticalSpacing(20);
cheeseGrid.setHorizontalSpacing(20);
现在,您可以使用该方法将 绑定到我们之前创建的适配器。
cheeseGrid.setAdapter(cheeseAdapter);`
再次运行应用以查看外观。
### 6. 添加事件侦听器
可以侦听适配器视图中项目的单击和长单击事件。例如,让我们将单击事件侦听器添加到 GridView
创建实现接口的匿名类的新实例,并将其传递给对象的方法。安卓工作室会为接口的方法自动生成一个存根。您会注意到,该方法的参数包含一个整数,用于指定列表项的位置。您可以使用此整数来找出用户单击的数据集中的哪个项目。`AdapterView.OnItemClickListenersetOnItemClickListener()GridViewonItemClick()`
下面的代码演示如何在每次单击 中的项时将简单消息显示为小吃栏。
cheeseGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView,
View view, int position, long rowId) {
// Generate a message based on the position
String message = "You clicked on " + cheeses[position];
// Use the message to create a Snackbar
Snackbar.make(adapterView, message, Snackbar.LENGTH_LONG)
.show(); // Show the Snackbar
}
});
如果运行应用并单击网格中的任意项目,屏幕底部将显示一条消息。请注意,您可以使用相同的代码来侦听。
### 7. 扩展ArrayAdapter
在它生成的对象的布局中只能处理一个小部件。要拓宽它的功能,你必须扩展它。但是,在我们这样做之前,让我们创建一个稍微复杂的数据集。
假设我们的数据集包含以下类的对象,而不是字符串:
static class Cheese {
String name;
String description;
public Cheese(String name, String description) {
this.name = name;
this.description = description;
}
}
这是我们将使用的数据集:
Cheese[] cheeses = {
new Cheese(“Parmesan”, “Hard, granular cheese”),
new Cheese(“Ricotta”, “Italian whey cheese”),
new Cheese(“Fontina”, “Italian cow’s milk cheese”),
new Cheese(“Mozzarella”, “Southern Italian buffalo milk cheese”),
new Cheese(“Cheddar”, “Firm, cow’s milk cheese”),
};
如您所见,该类包含两个字段和 。要在列表或网格中显示这两个字段,项目的布局必须包含两个微件。
创建一个新的布局 XML 文件并将其命名为custom\_item.xml。向其添加“大文本”和“小文本”构件。将第一个小部件的属性设置为cheese\_name将第二个小部件的属性设置为cheese\_description。布局 XML 文件的内容现在应如下所示:
<?xml version="1.0" encoding="utf-8"?>
还必须能够处理两个小部件。重新访问您的活动,创建一个扩展该类的新匿名类,并重写其方法。确保将数组作为参数传递给其构造函数。
ArrayAdapter cheeseAdapter =
new ArrayAdapter(this, 0, cheeses) {
@Override
public View getView(int position,
View convertView,
ViewGroup parent) {
}
};
在方法内部,必须将参数用作数组的索引,并在该索引处获取项。getView()position
Cheese currentCheese = cheeses[position];
该方法的第二个参数使我们能够重用对象。如果忽略它,适配器视图的性能将很差。首次调用该方法时, 是 。必须通过扩充指定列表项布局的资源文件来初始化它。为此,请使用该方法获取对 的引用并调用其方法。
// Inflate only once
if(convertView == null) {
convertView = getLayoutInflater()
.inflate(R.layout.custom_item, null, false);
}
此时,您可以使用 来获取对布局内小部件的引用,并调用它们的方法以使用数组中的数据对其进行初始化。
TextView cheeseName =
(TextView)convertView.findViewById(R.id.cheese_name);
TextView cheeseDescription =
(TextView)convertView.findViewById(R.id.cheese_description);
cheeseName.setText(currentCheese.name);
cheeseDescription.setText(currentCheese.description);
最后,返回,以便它可用于填充与适配器关联的任何适配器视图。
![img](https://img-blog.csdnimg.cn/img_convert/5326a90843669bb8b4407c699d96f5ce.png)
![img](https://img-blog.csdnimg.cn/img_convert/725357f8a25564266a0464333924d4a7.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
bfLB-1715611893825)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**