扣丁学堂——ListView随堂代码分享ListView源码下载(如链接消失请直接给我留言)
选择扣丁学堂学习的原因在于他是最新的视频教程也是唯一难得的一Android Studio为开发工具的视频教程,然而我目前实习的公司也是用的Android Studio,所以这个教程对于目前实习Android是很好的学习资料。
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。下面是一些随堂笔记的运行截图。
1.默认ListView 2.点击换色 3.单选
4.多选 5.图文 6.分页刷新自动生成
布局原因,这里只先列举了教程内容的运行截图,当然后面会加入boss布置的任务关于ListView的其他功能。
列表的显示需要三个元素:
1.ListVeiw 用来展示列表的View。
2.适配器 用来把数据映射到ListView上的中介。
3.数据 具体的将被映射的字符串,图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。这里就不赘述,详情查看我转载的文章《android ListView详解》
就里就详细讲一下ListView单复选以及分页刷新,其他自己看代码应该就能理解。
单复选这个很简单基本就是照葫芦画瓢,这是ListView自身带的功能。
从简单地开始,定义一个xml,只需要拖入一个ListView,代码自动生成
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.jin.administrator.myapplication07.MainActivity3"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listView2" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>这里采用简单地ArrayAdapter添加数据,当需要添加多行数据时,可以自己添加array.xml,在layout/values目录下,后期也可以通过数据库添加,但目前还没学到哪里,学到后再重行写入该方法。
在array.xml添加一些数据
<?xml version="1.0" encoding="utf-8"?> <resources> <array name="name"> <item>金金</item> <item>津津</item> <item>晶晶</item> <item>静静</item> <item>金金</item> <item>津津</item> <item>晶晶</item> <item>静静</item> <item>金金</item> <item>津津</item> <item>晶晶</item> <item>静静</item> </array> </resources>
这样有了数据,ListView,就剩添加适配器了,简单地适配器也都是照葫芦画瓢。
package com.jin.administrator.myapplication07; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; public class MainActivity3 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { ListView listView; super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); listView=(ListView)findViewById(R.id.listView2); String[] arr=getResources().getStringArray(R.array.name); // ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice,arr); // listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,arr); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setAdapter(aa); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main_activity3, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
这里实现的是多选,单选效果被注释掉了,其实就是照葫芦画瓢,类别不同而已,然而但单选与复选没对应使用时会出现不一样效果,这里你也可以试试。
其实单选复选没什么好说的也只是基本功能而已,下面我们可以看一看分页刷新了。
这里实现的效果:向下拖动自动生成数据,有加载进度条,优化。知识点用到了进程,线程之间的通讯机制Handler,容器添加数据,滚动监听等。
这里数据的添加相对而言复杂一些,毕竟是自动生成就必须用到了循环,下拉刷新就要控制刷新进度条显示的时间就要使用进程和滚动监听,基本的功能也就这多,然后我发现铺上代码后在分条讲解会有点困难,所以,决定多添加注释,文章里就不再解释代码了。
首先同样要有填充数据的xml,这里命名为list_item_6.xml只添加两个TextView。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" android:padding="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="title" android:layout_marginLeft="10dp" android:id="@+id/textView_title" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="content" android:id="@+id/textView_content" /> </LinearLayout>主代码:
package com.jin.administrator.myapplication07; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import java.util.Vector; import java.util.logging.LogRecord; /* ListView的分页实现监听滚动的方法 */ public class MainActivity6 extends AppCompatActivity implements AbsListView.OnScrollListener{ private ListView listView; //设置一个容器 方便数据后期自动生成 private Vector<News> news=new Vector<>(); private MyAdapter myAdapter; private static final int DATA_UPDATE=0x1;//数据更新完成后的标记 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main6); listView= (ListView) findViewById(R.id.listView5); listView.setOnScrollListener(this); View footerView=getLayoutInflater().inflate(R.layout.loading,null);//将滚动加载条放在视图最下面 listView.addFooterView(footerView); initData(); myAdapter=new MyAdapter(); listView.setAdapter(myAdapter); } private int index=1; /* 初始化数据,这里每次自动生成10条数据,因为屏幕刚好能显示10条所以定义的10 */ private void initData(){ for (int i=0;i<10;i++){ News n=new News(); n.title="title--"+index; n.content="content--"+index; index++; news.add(n); } } private int visibleLastIndex;//用来显示最后一条数据的索引 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (myAdapter.getCount()==visibleLastIndex&&scrollState==AbsListView.OnScrollListener.SCROLL_STATE_IDLE){ new LoadDataThread().start(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { visibleLastIndex=firstVisibleItem+visibleItemCount-1; } //线程之间通讯的机制 private Handler handler=new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what){ case DATA_UPDATE: myAdapter.notifyDataSetChanged(); break; } } }; //添加进程控制刷新条显示 class LoadDataThread extends Thread{ @Override public void run() { initData(); try { Thread.sleep(2000); }catch (InterruptedException e){ e.printStackTrace(); } //通过handle给主线程发送一个标记 handler.sendEmptyMessage(DATA_UPDATE); } } //自定义适配器 class MyAdapter extends BaseAdapter{ @Override public int getCount() { return news.size(); } @Override public Object getItem(int position) { return news.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh; if(convertView==null){ convertView=getLayoutInflater().inflate(R.layout.list_item_6,null); vh=new ViewHolder(); vh.tv_title=(TextView) convertView.findViewById(R.id.textView_title); vh.tv_content=(TextView)convertView.findViewById(R.id.textView_content); convertView.setTag(vh); }else{ vh=(ViewHolder) convertView.getTag(); } News n= news.get(position); vh.tv_title.setText(n.title); vh.tv_content.setText(n.content); return convertView; } //使用ViewHolder优化 class ViewHolder{ TextView tv_title; TextView tv_content; } } }load.xml一样只添加了一个ProgressBar和TextView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ProgressBar style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="正在玩命加载数据中" android:id="@+id/textView" /> </LinearLayout>然后还有一个外部类News
package com.jin.administrator.myapplication07; /** * Created by Administrator on 2015/11/13. */ public class News { String title; String content; }关于ViewHolder的优化,主要是起到保存组件,避免重复查找。
还有一个问题为什么有的代码会是这样子?我觉得吧,这跟学英语是一样,没那么多为什么,就是见多了就好了。
关于ListView这里就说这么多。知识是需要积累的,希望我的博客能给你带来帮助