androidlistview的用法 androidinflate详解

犹豫了几天,我觉得还是写这篇教程吧。虽然网上有很多书,但是这是我的学习过程,我觉得应该记录下来,这样可以吸取以前的教训。ListView在很多Android控件中扮演着重要的角色,也是面试官爱提问的控件之一,尤其是关于它的性能优化。我想把这个留到最后。先说ListView的简单...

犹豫了几天,我觉得还是写这篇教程吧。虽然网上有很多书,但是这是我的学习过程,我觉得应该记录下来,这样可以吸取以前的教训。

ListView在很多Android控件中扮演着重要的角色,也是面试官爱提问的控件之一,尤其是关于它的性能优化。我想把这个留到最后。先说ListView的简单应用。毕竟一切都很好理解。

首先,我们需要创建一个项目,打开Android studio,点击文件-新建-新建项目,创建一个名为ListViewTest的项目。然后在RES-layout文件夹下找到activity_***in.xml,打开它并在其中添加ListView控件,如下所示:

<ListView android:id="@+id/listview" android:layout_width="***tch_parent" android:layout_height="***tch_parent"> </ListView>

这时候如果你运行项目,你会发现里面什么都没有,和你刚创建这个项目的时候没有太大区别,因为我们还没有给它添加数据,也没有在View中实现。所以让我们回到MainActivity类,通过findViewById()方法找到这个控件并实现它。首先,我们定义一个名为data的一维字符串数组来存储我们的假数据。然后创建一个新的ArrayAdapter并根据需求进行配置,然后通过setAdapter适配到ListView。代码如下:

private String data[] = {"aa","bb","cc","dd","aa","bb","cc","dd","aa","bb","cc","dd","aa","bb","cc","dd"};//假数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_***in); ListView listView = (ListView) findViewById(R.id.listview);//在视图中找到ListView ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.***_list_item_1,data);//新建并配置ArrayAapeter listView.setAdapter(adapter); }

单击run项目,您将看到一个简单的ListView:

现在已经看到界面了,离我们的预期还是有点远。我们希望除了观看它之外,我们还可以点击和响应某些事件,所以我们添加了一个方法来监视它的点击。代码如下:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { switch (i){ case 0: Toast.***keText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show(); break;//当我们点击某一项就能吐司我们点了哪一项 case 1: Toast.***keText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show(); break; case 2: Toast.***keText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show(); break; case 3: Toast.***keText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show(); break; case 4: Toast.***keText(MainActivity.this,"你点击了"+i+"按钮",Toast.LENGTH_SHORT).show(); break; } } });

在这里,我回应了五项,当然,我也可以让每一项都有回应。有兴趣的话可以自己试试。这样一个非常简单的ListView就完成了。接下来,我们再深入一点。

现在我们想定制一个带有图片、文字和选择框的ListView。我们怎么做呢?第一,我们肯定要改变数据,但是我们肯定不能说把数组数据改成二维数据就可以了,因为图片不是字符串的形式。既包含字符串又包含图片的数据格式是什么?这时,Bean类出现了。我们可以将这些数据封装到一个Bean类中,并在需要时取出。这样做,然后我们用下面的代码定义一个myBean类:

public class myBean { private String text;//用来放文字的 private int I***geID;//用来放图片的 public myBean(String text,int i***geID){ this.I***geID = i***geID; this.text = text; } public String getText() { return text; } public void setText(String text) { this.text = text; } public int getI***geID() { return I***geID; } public void setI***geID(int i***geID) { I***geID = i***geID; } }

然后我们可以一个一个的初始化新的数据,但是怎么把它放到ListView里面呢?因为我们只是用了系统的ArrayAdapter来适配ListView,连XML的接口都没有适配。我们先做一个我们想适应的界面,所以:

<LinearLayout xmlns:android="http://sche***s.android.com/apk/res/android" android:orientation="vertical"android:layout_width="***tch_parent" android:layout_height="***tch_parent"> <LinearLayout android:id="@+id/ll_view" android:gravity="center" android:layout_***rgin="10dp" android:orientation="horizontal" android:layout_width="***tch_parent" android:layout_height="wrap_content"> <I***geView android:background="@mip***p/ic_launcher" android:id="@+id/headi***ge" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_***rginLeft="20dp"android:layout_weight="1" android:text="你是SB" android:id="@+id/headtext" android:layout_width="0dp" android:layout_height="wrap_content" /> <RadioGroup android:id="@+id/radioBtn" android:orientation="horizontal"android:layout_width="wrap_content" android:layout_height="wrap_content"> <RadioButton android:text="打他" android:id="@+id/radio2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <RadioButton android:text="不打" android:id="@+id/radio1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RadioGroup> </LinearLayout></LinearLayout>

于是我们把之前的R.layout.***_list_item_1的XML改成了我们直接做的东西,当你运行程序的时候会发现程序崩溃了。哈哈,没关系。这很正常,因为我们传入的所有数据都没有用,放不进我们的接口。所以只能自己写一个适配器来适配自己的数据。

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.***_list_item_1,data);

适配器代码如下:

public class myAdapter extends ArrayAdapter { private final int I***geId; private String radiotext; public myAdapter(Context context, int headI***ge, List<myBean> obj){ super(context,headI***ge,obj); I***geId = headI***ge;//这个是传入我们自己定义的界面 } @NonNull @Override public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { myBean myBean = (myBean) getItem(position); View view = LayoutInflater.from(getContext()).inflate(I***geId,parent,null);//这个是实例化一个我们自己写的界面Item LinearLayout linearLayout = view.findViewById(R.id.ll_view); I***geView headI***ge = view.findViewById(R.id.headi***ge); TextView headText = view.findViewById(R.id.headtext); RadioGroup radio = view.findViewById(R.id.radioBtn); headI***ge.setI***geResource(myBean.getI***geID()); headText.setText(myBean.getText()); radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {//检查Radio Button那个被点击了 @Override public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) { switch (i){ case R.id.radio1: radiotext = "不打"; break; case R.id.radio2: radiotext = "打他"; break; } } }); linearLayout.setOnClickListener(new View.OnClickListener() {//检查哪一项被点击了 @Override public void onClick(View view) { Toast.***keText(getContext(),"你点击了第"+position+"项"+"你选择"+radiotext,Toast.LENGTH_SHORT).show(); } }); return view; }}

现在适配器已经写好了,你觉得定制ListView的两步是不是被我们解决了,然后就差适配了?接下来,让我们进行改编:

public class MainActivity extends AppCompatActivity { private List<myBean> myBeanList = new ArrayList<>();//用来存放数据的数组 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_***in); ListView listView = (ListView) findViewById(R.id.listview); init(); myAdapter adapter = new myAdapter(MainActivity.this,R.layout.myitem,myBeanList); listView.setAdapter(adapter); } private void init(){//初始化数据 myBean bean1 = new myBean("aa",R.mip***p.ic_launcher); myBeanList.add(bean1); myBean bean2 = new myBean("ss",R.mip***p.ic_launcher); myBeanList.add(bean2); myBean bean3 = new myBean("jj",R.mip***p.ic_launcher); myBeanList.add(bean3); myBean bean4 = new myBean("hh",R.mip***p.ic_launcher); myBeanList.add(bean4); myBean bean5 = new myBean("dd",R.mip***p.ic_launcher); myBeanList.add(bean5); myBean bean6 = new myBean("cc",R.mip***p.ic_launcher); myBeanList.add(bean6); myBean bean7 = new myBean("bb",R.mip***p.ic_launcher); myBeanList.add(bean7); myBean bean8 = new myBean("jj",R.mip***p.ic_launcher); myBeanList.add(bean8); myBean bean9 = new myBean("kk",R.mip***p.ic_launcher); myBeanList.add(bean9); }

在这里,我想大家已经差不多掌握了如何定制ListView了。哦,太好了!当我编写适配器时,我包含了监视事件。当然,在主类中写也是可以的,但不推荐。至于为什么?你自己试试就知道了,因为很容易上纸面。

最后的效果图:

发现了很多bug!但这没什么。毕竟没有一个APP是没有BUG的,对吧?

本文来自莫失莫忘投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/529796.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 05-02
下一篇 05-02

相关推荐

  • androidlistview的用法 androidinflate详解

    犹豫了几天,我觉得还是写这篇教程吧。虽然网上有很多书,但是这是我的学习过程,我觉得应该记录下来,这样可以吸取以前的教训。ListView在很多Android控件中扮演着重要的角色,也是面试官爱提问的控件之一,尤其是关于它的性能优化。我想把这个留到最后。先说ListView的简单

    2023-05-02 14:56:01
    688 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信