1、ListView添加数据
效果图:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.admin.vip_07.MainActivity">
<Button
android:id="@+id/add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"
/>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
listview_layout.xml
<?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"
>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="12313"
android:gravity="center"
android:textSize="19sp"
/>
</LinearLayout>
MyAdapter.java
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class MyAdapter extends BaseAdapter{
private Context mContext;
private List<String> mStringList;
public MyAdapter(Context context, List<String> stringList) {
mContext = context;
mStringList = stringList;
}
public void setData(int postion, String content) {
mStringList.set(postion, content);
}
@Override
public int getCount() {
return mStringList.size();
}
@Override
public Object getItem(int position) {
return mStringList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder myHolder;
if(convertView == null) {
convertView = View.inflate(mContext, R.layout.listview_layout, null);
myHolder = new MyHolder();
myHolder.mTextView = convertView.findViewById(R.id.text);
convertView.setTag(myHolder);
}
else {
myHolder = (MyHolder) convertView.getTag();
}
myHolder.mTextView.setText(mStringList.get(position));
return convertView;
}
class MyHolder {
TextView mTextView;
}
}
MainActivity.java
package com.example.admin.vip_07;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
final List<String> list = new ArrayList<>();
for(int i = 0; i < 30; i++) {
list.add("数据" + i);
}
final MyAdapter myAdapter = new MyAdapter(MainActivity.this, list);
mListView.setAdapter(myAdapter);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < 10; i++) {
list.add("添加的数据" + i);
}
myAdapter.notifyDataSetChanged();
}
});
}
private void initView() {
mListView = findViewById(R.id.listView);
mButton = findViewById(R.id.add);
}
}
唯一要注意的一点就是,在list中添加完数据后,一定要使用
myAdapter.notifyDataSetChanged(); 更新myAdapter中的mStringList数据,这样添加数据才成功。
1.1 ListView的点击事件与长按事件
效果图:
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TextView textView = view.findViewById(R.id.text);
// textView.setText("别按我了QAQ...");
myAdapter.setData(position, "别按我了QAQ...");
myAdapter.notifyDataSetChanged();
}
});
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
// TextView textView = view.findViewById(R.id.text);
// textView.setText("放开我了QAQ...");
myAdapter.setData(position, "放开我了QAQ...");
myAdapter.notifyDataSetChanged();
//设置为true,则长按事件与点击事件不冲突。
return true;
}
});
注释掉的四行代码,可以成功的修改TextView的内容,但是当你下拉ListView,再返回的时候,数据会恢复成未改变的样子。
这是因为myAdapter中的mStringList数据并没有被修改,所以需要使用函数setData()去改变mStringList的数据,同时在最后也要调用myAdapter.notifyDataSetChanged()方法。
2、ExpendableListView
效果图:
ExpendableListView 为二级列表。这里有三个group,分别是西方龙,九子,digimon。在这三个group中存在child项。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
tools:context="com.example.admin.vip_07_02.MainActivity">
<ExpandableListView
android:id="@+id/exListView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ExpandableListView>
</LinearLayout>
activity_group.xml
<?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">
<TextView
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="1112"
android:layout_marginLeft="25dp"
/>
</LinearLayout>
activity_child.xml
<?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:orientation="horizontal">
<ImageView
android:id="@+id/photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:src="@drawable/dragon2" />
<TextView
android:id="@+id/child"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="19sp"
android:text="迷你龙"
android:layout_marginTop="2dp"
android:layout_marginLeft="5dp"
/>
</LinearLayout>
MyAdapter.java
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class MyAdapter extends BaseExpandableListAdapter{
private Context mContext;
String[] group;
String[][] child;
List<Integer> mList;
public MyAdapter(Context context, String[] group, String[][] child, List<Integer> list) {
mContext = context;
this.group = group;
this.child = child;
mList = list;
}
@Override
public int getGroupCount() {
return group.length;
}
@Override
public int getChildrenCount(int groupPosition) {
return child[groupPosition].length;
}
@Override
public Object getGroup(int groupPosition) {
return group[groupPosition];
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return child[groupPosition][childPosition];
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupHolder groupHolder;
if(convertView == null) {
convertView = View.inflate(mContext, R.layout.layout_group, null);
groupHolder = new GroupHolder();
groupHolder.mGroupView = convertView.findViewById(R.id.group);
convertView.setTag(groupHolder);
}
else {
groupHolder = (GroupHolder) convertView.getTag();
}
groupHolder.mGroupView.setText(group[groupPosition]);
convertView.setTag(R.layout.layout_child, -1);
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildHodler childHodler;
if(convertView == null) {
convertView = View.inflate(mContext, R.layout.layout_child, null);
childHodler = new ChildHodler();
childHodler.mImageView = convertView.findViewById(R.id.photo);
childHodler.mChildView = convertView.findViewById(R.id.child);
convertView.setTag(childHodler);
}
else {
childHodler = (ChildHodler) convertView.getTag();
}
childHodler.mImageView.setImageResource(mList.get(childPosition));
childHodler.mChildView.setText(child[groupPosition][childPosition]);
convertView.setTag(R.layout.layout_child, 0);
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
//设置为true才可以点击子列表中的Item
return true;
}
class GroupHolder {
TextView mGroupView;
}
class ChildHodler {
ImageView mImageView;
TextView mChildView;
}
}
MainActivity.java
package com.example.admin.vip_07_02;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ExpandableListView mExpandableListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
String[] group = {"西方龙", "九子", "digimon"};
final String[][] child = {
{"Nidhoog","Jormungandr","Hreidmar"},
{"囚牛", "嘲风", "睚眦", "蒲牢"},
{"帝皇龙", "青龙"}};
List<Integer> imageViewList = new ArrayList<>();
imageViewList.add(R.drawable.dragon);
imageViewList.add(R.drawable.dragon2);
imageViewList.add(R.drawable.dragon3);
imageViewList.add(R.drawable.dragon4);
mExpandableListView.setAdapter(new MyAdapter(
MainActivity.this,
group,
child,
imageViewList));
}
private void initView() {
mExpandableListView = findViewById(R.id.exListView);
}
}
2.1 ExpendableListView点击事件
效果图:
mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Toast.makeText(MainActivity.this,
"我是" + child[groupPosition][childPosition],
Toast.LENGTH_SHORT).show();
return false;
}
});
2.2 ExpendableListView长按事件
效果图:
mExpandableListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
TextView textView;
if((int)(view.getTag(R.layout.layout_child)) == -1) {
textView = view.findViewById(R.id.group);
Toast.makeText(MainActivity.this,
"我是父列表的" + textView.getText(),
Toast.LENGTH_SHORT).show();
}
else {
textView = view.findViewById(R.id.child);
Toast.makeText(MainActivity.this,
"我是子列表的" + textView.getText(),
Toast.LENGTH_SHORT).show();
}
return false;
}
});