ListView
ListView可以用于展示列表数据,配合嵌入列表的控件,可以实现各种复杂的逻辑.
我查到的资料里对ListView的使用大部分是显示固定的列表,少有谈及ListView的动态
修改.这里大致总结下怎么动态增删改查列表备忘.
ListView类似于链表,每个单元对应一个view.
单元的创建需要Adapter,包含了单元的构造和事件的监听.
比如一个单元可能包括一个TextView和一个Button控件,
Adapter负责构造单元里的控件并监听控件的事件.
整合listview逻辑
从程序设计的角度来看,listview的操作最好是独立封装成一个类.
所以应该自定义adapter继承BaseAdapter.
Adapter完全可以抽象成ListView控件的proxy,对ListView的操作都
通过Adapter实现.
示例代码
1. 定义单元控件(xml描述)
在工程中加入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/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
2. 定义adapter
public class PeerListAdapter extends BaseAdapter{
private final String tag = "Online Peer list:";
private ArrayList<String> mList;
private Context mContext;
private LayoutInflater mInflater;
public PeerListAdapter(Context context) {
super();
mContext = context;
mInflater = LayoutInflater.from(mContext);
mList = new ArrayList<String>();
mList.add(tag);
this.notifyDataSetChanged();
}
public void addPeer(String peer) {
mList.add(peer);
this.notifyDataSetChanged();
}
public void reset() {
mList.clear();
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
if (view == null) {
view = mInflater.inflate(R.layout.peerlist_view, null);
}
TextView textView = view.findViewById(R.id.text);
textView.setText(mList.get(i));
Button button = (Button)view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String msg = mList.get(i);
Log.d("sliver", msg);
Toast.makeText(mContext, msg, Toast.LENGTH_SHORT);
}
});
return view;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Nullable
@Override
public CharSequence[] getAutofillOptions() {
return new CharSequence[0];
}
}
3. activity中调用adapter
refresh_button是自定义的按钮 用来触发添加单元到listview的动作
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private ArrayList<String> mListData;
private ListView mList;
private PeerListAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdapter = new PeerListAdapter(this);
mList = (ListView)findViewById(R.id.peer_list);
mList.setAdapter(mAdapter);
Button refresh_bt = (Button)findViewById(R.id.refresh_button);
refresh_bt.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.d("sliver", "button on");
mAdapter.addPeer("sliver");
}
}