本文包含:
一、一般的listview(系统自定义样式)
二、自定义Listview
EditText
回车则添加到ListView
中ListView
中某item
直接删除该Item
属性 | 解释 |
---|---|
android:entries=”@array/listViewNameArray” | 指定数据 |
android:divider=”@color/colorAccent” | 分隔符颜色 |
android:choiceMode=”singleChoice” | 选择模式(单选、多选) |
android:entries="@array/listViewNameArray"
指定内容"@array/listViewNameArray"
为value
下String
中的String-array
(string数组)
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.feather.androiddemos.ListViewActivity"
android:orientation="vertical">
<ListView
android:entries="@array/listViewNameArray"
android:divider="@color/colorAccent"
android:choiceMode="singleChoice"
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
ListView>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10pt"
android:hint="输入内容进行添加"/>
LinearLayout>
//string 数组
String arrays[] = {"nanjing", "beijing", "nantong", "shanghai", "chongqing"};
//初始化适配器
ArrayAdapter adapter = new ArrayAdapter(this, //context
android.R.layout.simple_spinner_item, //布局:使用系统自带文字布局
arrays); //string数组
//获得控件ListView
listView = (ListView) findViewById(R.id.listView);
//设置适配器
listView.setAdapter(adapter);
如:
1. simple_list_item_1
2. simple_list_item_single_choice 有单选框
ListActivity
中使用ListViewListView
的ID必须为@android:id/list
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.feather.androiddemos.ListViewActivity"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10pt"
android:layout_alignParentBottom="true"
android:hint="输入内容进行添加"/>
<ListView
android:id="@android:id/list"
android:entries="@array/listViewNameArray"
android:divider="@color/colorAccent"
android:choiceMode="singleChoice"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/editText">
ListView>
RelativeLayout>
//string 数组
String arrays[] = {"nanjing", "beijing", "nantong", "shanghai"};
//初始化适配器
ArrayAdapter adapter = new ArrayAdapter(this, //context
android.R.layout.simple_list_item_1, //布局:使用系统自带文字布局
arrays); //string数组
//设置适配器
this.setListAdapter(adapter);
listView = getListView(); //获得ListView
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
}
});
public class ListViewActivity extends ListActivity {
ListView listView = null;
ArrayList listItems = null;
EditText editText = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
editText = (EditText) findViewById(R.id.editText);
listItems = new ArrayList<>();
//初始化适配器
final ArrayAdapter adapter = new ArrayAdapter(this, //context
android.R.layout.simple_list_item_1, //布局:使用系统自带文字布局
listItems); //数据链表
this.setListAdapter(adapter);
listView = getListView(); //获得ListView
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
Toast.makeText(ListViewActivity.this, "当前点击的Item:"+position, Toast.LENGTH_SHORT).show();
}
});
//EditText监听器
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
//输入Enter并且松开
if(keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP)
{
listItems.add(editText.getText().toString());
adapter.notifyDataSetChanged();//通知数据发生改变
editText.setText(null);
}
return false;
}
});
}
}
又被称为“发布订阅模式”
这里继承了ArrayAdapter
适配器,记得构造函数中传入自定义对象ReadingItem
的链表。
public class ReadingAdapater extends ArrayAdapter<ReadingItem>{
int resource_id;
ReadingQuestion readingQuestion;
QuestionReadingActivity activity;
//记得要有`List objects`
public ReadingAdapater(Context context, int resource, List objects, ReadingQuestion readingQuestion, QuestionReadingActivity activity) {
super(context, resource, objects);
this.resource_id = resource;
this.readingQuestion = readingQuestion; //传入的一些自定义对象
this.activity = activity;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//获得具体对象(构造器传入的链表:objects)
readingItem = getItem(position);
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(resource_id, null);
/*---------------------*/
/* 这里进行自定义 */
/*---------------------*/
}
return convertView;
}
//获得ListView
ListView listView = (ListView) view.findViewById(R.id.reading_item_list);
//新建适配器对象
readingAdapater = new ReadingAdapater(QuestionReadingActivity.this, R.layout.question__item,
lists, //传入数据的链表
readingQuestion,
this);
//设置适配器
listView.setAdapter(readingAdapater);
//这里是Listview只显示一行时的解决办法,具体见错误汇总1.
fixListViewHeight(listView);
小的知识点,记录下来,以备将来用。
msgListView
是ListView
控件
adapter
是ListView
绑定的Adapter
,如果不方便直接使用,也可以通过ListView
的getAdapter()
方法获取到,前提是你已经绑定了适配器哦
里面的参数就很熟悉了吧,其实这个方法的主要作用是选中listview
的指定列,选中了,自然就得让这个item可见,自然就滚动咯
msgListView.setSelection(adapter.getCount()-1);
这个就比较直接了
msgListView.setSelection(msgListView.getBottom());
在代码正确时,发现实际效果Listview
只有一行,这是因为Listview
嵌套在ScrollView
中,会导致无法正确计算ListView
的大小。
解决方案如下:
链接:http://www.cnblogs.com/exmyth/p/4544551.html
listView = (ListView) findViewById(R.id.test_listView);
//适配器
listView.setAdapter(new ArrayAdapter(this,android.R.layout.simple_list_item_1,adapterData));
//计算高度
fixListViewHeight(listView);
public void fixListViewHeight(ListView listView) {
// 如果没有设置数据适配器,则ListView没有子项,返回。
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int index = 0, len = listAdapter.getCount(); i < len; i++) {
View listViewItem = listAdapter.getView(index , null, listView);
// 计算子项View 的宽高
listViewItem.measure(0, 0);
// 计算所有子项的高度和
totalHeight += listViewItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
// listView.getDividerHeight()获取子项间分隔符的高度
// params.height设置ListView完全显示需要的高度
params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
转载:
关于ListView中notifyDataSetChanged()刷新数据不更新原因 .
使用Listview的时候: 当要动态显示更改后的数据(例如数据库改动), 很多人应该都用过notifyDataSetChanged();这个方法来刷新Listview,显示改后的数据.
这时候就要注意了:
......
private ArrayList> usersList;
......
usersList= query(......); //根据查询函数获取一个ArrayList并赋值给绑定到Adapter的数据源usersList
sAdapter.notifyDataSetChanged();
......
如果你也是: 上面这种形式去刷新ListView的数据的话, 是不可以更新的. 必须改成如下形式:
......
//usersList= query(......);
usersList.clear();
usersList.addAll(query(......));
sAdapter.notifyDataSetChanged();
原因是:
sAdapter会通过usersList获取List中的内容。但是实际上可能(也应该)是,在调用super(MyActivity.this, R.layout.item, usersList)时sAdapter保存了usersList指向原List(假设为List a)的引用,在调用query函数之后,usersList指向了一个新的List(List b)。但是在调用notifyDataSetChanged()时,sAdapter会跟据保存的引用(即指向List a的引用)去更新,因此当然还是原来的结果,不会进行更新。
如果大家也出现这种情况可以使用后者去刷新ListView, 应该就没问题了
只需要在UI
线程执行notifyDataSetChanged()
即可
代码如下:
runOnUiThread(new Runnable() {
@Override
public void run() {
chatItemList.add(new ChatItem("test123", R.drawable.feather, "帅猎羽", msg, dateString));
adapter.notifyDataSetChanged();
}
});