一、ListView簡介
在開發移動應用程序時,經常需要展示一組數據。這時,ListView就會派上大用場。ListView是Android中最基本的控件之一,可以快速、高效地展示一組數據,支持滾動,可以很好地適配各種屏幕大小。ListView通常用於實現類似聊天記錄、聯繫人列表等需要展示大量數據的場景。
ListView展示數據的原理比較簡單:首先,需要一個適配器(Adapter),將數據進行封裝和處理,然後將適配器設置到ListView中,再刷新ListView即可顯示出數據。
二、創建ListView
接下來我們就來實現一個簡單的ListView,展示一組字符串數組。首先,我們需要在XML文件中定義ListView組件:
<ListView android:id="@+id/my_list_view" android:layout_width="match_parent" android:layout_height="wrap_content" />
定義好ListView組件後,我們需要在Java文件中獲取到這個組件,並進行設置:
ListView listView = (ListView)findViewById(R.id.my_list_view);
接着,我們需要定義一個字符串數組,作為ListView要展示的數據:
String[] data = { "A", "B", "C", "D", "E", "F", "G" };
有了字符串數組後,我們就需要定義一個適配器,來將數據處理後返回給ListView。我們可以使用Android自帶的ArrayAdapter來實現適配器:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
這裡,我們使用了Android自帶的simple_list_item_1布局文件,將數據展示在ListView中。
有了適配器後,我們就需要將適配器設置到ListView中:
listView.setAdapter(adapter);
最後,我們還需要刷新ListView,以展示數據:
adapter.notifyDataSetChanged();
這樣,一個簡單的ListView就創建好了!完整代碼如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView)findViewById(R.id.my_list_view); String[] data = { "A", "B", "C", "D", "E", "F", "G" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); listView.setAdapter(adapter); adapter.notifyDataSetChanged(); } }
三、自定義ListView
雖然Android自帶的ListView可以滿足一般的需要,但如果需要更加個性化的展示效果,那麼就需要自定義ListView了。自定義ListView通常需要自定義適配器,以滿足自己的需要。
下面我們就以一個簡單的例子來介紹自定義ListView的方法。假設我們需要展示一個聯繫人列表,每個聯繫人有頭像和名字。首先,我們需要自定義一個數據結構,用來存儲聯繫人的信息:
public class Contact { private int avatar; private String name; public Contact(int avatar, String name) { this.avatar = avatar; this.name = name; } public int getAvatar() { return avatar; } public void setAvatar(int avatar) { this.avatar = avatar; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
定義好數據結構後,我們就需要自定義適配器了。自定義適配器需要繼承自BaseAdapter,並對其方法進行實現。我們可以在getView方法中自定義每個列表項的布局,並展示聯繫人的頭像和名字。
public class ContactAdapter extends BaseAdapter { private List<Contact> data; private Context context; public ContactAdapter(Context context, List<Contact> data) { this.context = context; this.data = data; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.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 = LayoutInflater.from(context).inflate(R.layout.item_contact, null); viewHolder = new ViewHolder(); viewHolder.avatar = convertView.findViewById(R.id.avatar); viewHolder.name = convertView.findViewById(R.id.name); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder)convertView.getTag(); } Contact contact = data.get(position); viewHolder.avatar.setImageResource(contact.getAvatar()); viewHolder.name.setText(contact.getName()); return convertView; } static class ViewHolder { ImageView avatar; TextView name; } }
有了適配器後,我們就可以定義一個ListView,並將自定義的適配器設置到ListView中:
ListView listView = (ListView)findViewById(R.id.my_list_view); List<Contact> data = new ArrayList<>(); data.add(new Contact(R.drawable.avatar1, "Tom")); data.add(new Contact(R.drawable.avatar2, "Jerry")); data.add(new Contact(R.drawable.avatar3, "Mike")); data.add(new Contact(R.drawable.avatar4, "John")); ContactAdapter adapter = new ContactAdapter(this, data); listView.setAdapter(adapter);
這樣,一個自定義的ListView就創建完成了!完整代碼如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView)findViewById(R.id.my_list_view); List<Contact> data = new ArrayList<>(); data.add(new Contact(R.drawable.avatar1, "Tom")); data.add(new Contact(R.drawable.avatar2, "Jerry")); data.add(new Contact(R.drawable.avatar3, "Mike")); data.add(new Contact(R.drawable.avatar4, "John")); ContactAdapter adapter = new ContactAdapter(this, data); listView.setAdapter(adapter); } public class Contact { private int avatar; private String name; public Contact(int avatar, String name) { this.avatar = avatar; this.name = name; } public int getAvatar() { return avatar; } public void setAvatar(int avatar) { this.avatar = avatar; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class ContactAdapter extends BaseAdapter { private List<Contact> data; private Context context; public ContactAdapter(Context context, List<Contact> data) { this.context = context; this.data = data; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.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 = LayoutInflater.from(context).inflate(R.layout.item_contact, null); viewHolder = new ViewHolder(); viewHolder.avatar = convertView.findViewById(R.id.avatar); viewHolder.name = convertView.findViewById(R.id.name); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder)convertView.getTag(); } Contact contact = data.get(position); viewHolder.avatar.setImageResource(contact.getAvatar()); viewHolder.name.setText(contact.getName()); return convertView; } static class ViewHolder { ImageView avatar; TextView name; } } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/272070.html