我试图动态地将列表项插入到列表视图中。当列表视图被创建并显示在屏幕上时,现在假设我从服务器或某个地方获得了一个项目,现在我想在同一个列表视图中添加此项目。怎么做 ??有没有什么方法可以在显示的列表视图中动态插入项目,而无需再次创建列表agtain。有什么方法可以改变列表项的状态,这意味着我们可以在显示时进行交互?你的答复将不胜感激。 Thnx提前!ListView Activity,动态插入列表项
2
A
回答
5
任何你想要添加到正在使用你的Adapter
,然后调用notifiyDataSetChanged()
您Adapter
与常规ArrayAdapter
这将是数据结构(指List
)是这样的:
MyAdapter adapter = new MyAdapter(this, R.layout.row, myList);
listView.setAdapter(adapter);
...
//make a bunch of changes to data
list.add(foo);
listView.getAdapter().notifyDataSetChanged();
我也可以提供一个更复杂的示例,其中包含BaseAdapter
。
编辑
我创建了一个小样本,因为这个问题似乎是很常见的。
在我的示例中,我在一个类中做了所有事情,只是为了让它更容易在一个地方跟踪它。
最后,这是一个非常模型 - 视图 - 控制器类型的情况。你甚至可以从这里克隆它运行实际的项目:https://github.com/levinotik/Android-Frequently-Asked-Questions
它的本质是这样的:
/**
* This Activity answers the frequently asked question
* of how to change items on the fly in a ListView.
*
* In my own project, some of the elements (inner classes, etc)
* might be extracted into separate classes, but for clarity
* purposes, I'm doing everything inline.
*
* The example here is very, very basic. But if you understand
* the concept, it can scale to anything. You have complex
* views bound to complex data wit complex conditions.
* You could model a facebook user and update the ListView
* based on changes to that user's data that's represented in
* your model.
*/
public class DynamicListViewActivity extends Activity {
MyCustomAdapter mAdapter;
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
ListView listView = new ListView(this);
setContentView(listView);
/**
* Obviously, this will typically some from somewhere else,
* as opposed to be creating manually, one by one.
*/
ArrayList<MyObject> myListOfObjects = new ArrayList<MyObject>();
MyObject object1 = new MyObject("I love Android", "ListViews are cool");
myListOfObjects.add(object1);
MyObject object2 = new MyObject("Broccoli is healthy", "Pizza tastes good");
myListOfObjects.add(object2);
MyObject object3 = new MyObject("bla bla bla", "random string");
myListOfObjects.add(object3);
//Instantiate your custom adapter and hand it your listOfObjects
mAdapter = new MyCustomAdapter(this, myListOfObjects);
listView.setAdapter(mAdapter);
/**
* Now you are free to do whatever the hell you want to your ListView.
* You can add to the List, change an object in it, whatever.
* Just let your Adapter know that that the data has changed so it
* can refresh itself and the Views in the ListView.
*/
/**Here's an example. Set object2's condition to true.
If everyting worked right, then the background color
of that row will change to blue
Obviously you would do this based on some later event.
*/
object2.setSomeCondition(true);
mAdapter.notifyDataSetChanged();
}
/**
*
* An Adapter is bridge between your data
* and the views that make up the ListView.
* You provide some data and the adapter
* helps to place them into the rows
* of the ListView.
*
* Subclassing BaseAdapter gives you the most
* flexibility. You'll have to override some
* methods to get it working.
*/
class MyCustomAdapter extends BaseAdapter {
private List<MyObject> mObjects;
private Context mContext;
/**
* Create a constructor that takes a List
* of some Objects to use as the Adapter's
* data
*/
public MyCustomAdapter(Context context, List<MyObject> objects) {
mObjects = objects;
mContext = context;
}
/**
* Tell the Adapter how many items are in your data.
* Here, we can just return the size of mObjects!
*/
@Override
public int getCount() {
return mObjects.size();
}
/**
* Tell your the Adapter how to get an
* item as the specified position in the list.
*/
@Override
public Object getItem(int position) {
return mObjects.get(position);
}
/**
* If you want the id of the item
* to be something else, do something fancy here.
* Rarely any need for that.
*/
@Override
public long getItemId(int position) {
return position;
}
/**
* Here's where the real work takes place.
* Here you tell the Adapter what View to show
* for the rows in the ListView.
*
* ListViews try to recycle views, so the "convertView"
* is provided for you to reuse, but you need to check if
* it's null before trying to reuse it.
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyView view;
if(convertView == null){
view = new MyView(mContext);
} else {
view = (MyView) convertView;
}
/**Here's where we utilize the method we exposed
in order to change the view based on the data
So right before you return the View for the ListView
to use, you just call that method.
*/
view.configure(mObjects.get(position));
return view;
}
}
/**
* Very simple layout to use in the ListView.
* Just shows some text in the center of the View
*/
public class MyView extends RelativeLayout {
private TextView someText;
public MyView(Context context) {
super(context);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.addRule(CENTER_IN_PARENT);
someText = new TextView(context);
someText.setTextSize(20);
someText.setTextColor(Color.BLACK);
someText.setLayoutParams(params);
addView(someText);
}
/**
* Remember, your View is an regular object like any other.
* You can add whatever methods you want and expose it to the world!
* We have the method take a "MyObject" and do things to the View
* based on it.
*/
public void configure(MyObject object) {
someText.setText(object.bar);
//Check if the condition is true, if it is, set background of view to Blue.
if(object.isSomeCondition()) {
this.setBackgroundColor(Color.BLUE);
} else { //You probably need this else, because when views are recycled, it may just use Blue even when the condition isn't true.
this.setBackgroundColor(Color.WHITE);
}
}
}
/**
* This can be anything you want. Usually,
* it's some object that makes sense according
* to your business logic/domain.
*
* I'm purposely keeping this class as simple
* as possible to demonstrate the point.
*/
class MyObject {
private String foo;
private String bar;
private boolean someCondition;
public boolean isSomeCondition() {
return someCondition;
}
MyObject(String foo, String bar) {
this.foo = foo;
this.bar = bar;
}
public void setSomeCondition(boolean b) {
someCondition = b;
}
}
}
如果您在此处把握的概念,你应该能够适应(没有双关语意)这ArrayAdapters等
0
是,通过一个适配器,您在ListView填充,更新项目需要时,增加新项目等
如果你过网拉取数据,你可以首先使用普通的ArrayAdapter
(通常通过继承和重写getView()
方法来构建您的布局),然后添加和删除它提供的列表中的项目。如果将项目添加到列表中,则向下滚动时会显示在列表的末尾(如果您位于最下面,则立即显示)。如果您修改一个项目,该列表将立即在屏幕上更新。
如果您在模型对象上使用setter,那么适配器将不会知道这一点,但您可以拨打notifyDataSetChanged()
。如果您想一次对列表进行多处更改而不会导致屏幕闪烁,您可能还需要查看setNotifyOnChange()
方法。
0
相关问题
- 1. 通过类对象动态地在列表中插入项目
- 2. ListView - 插入项目
- 3. QAbstractItemModel动态项插入
- 4. 根据条件动态插入列表项目
- 5. ListView项列表
- 6. listView onclick activity
- 7. 列表视图中添加WPF ListView项创建动态
- 8. 插入新项目的ListView第一项
- 9. listView动态添加项目
- 10. 从另一个Activity更新ListView项目
- 11. 列表视图动态项目高度
- 12. 动态选项列表
- 13. 动态地在QListWidget中插入项目
- 14. 移动到另一个activity通过点击listview项目,android
- 15. 插入动态数据从数据列表导入数据库
- 16. SQLite3 - 在表中插入列表项
- 17. C#动态输入列表
- 18. Jquery - 表单插件,动态选项卡
- 19. 在MariaDB的插入动态列
- 20. 动态插入均匀间隔列表项目打破对齐方法
- 21. 如何在动态表的特定列中插入/更新项目?
- 22. 动态添加项目到多列listView滚动
- 23. ListView插入项目的索引
- 24. 在ListView项目之间插入元素
- 25. ListView在标签上插入新项目
- 26. PLSQL动态插入
- 27. jquery mobile listview,动态est数据插入小屏幕设备
- 28. 将多行动态插入表格
- 29. 动态插入表单组件
- 30. JMeter如何将值插入动态表
可不可以用示例代码详细阐述??这对我更有帮助。 – 2011-12-14 05:17:13
好吧。假设有一些列表视图项目(例如联系人列表)存在,现在显示时我想要更改特定列表项目的文本颜色,假设线上/离线状态来自服务器端或某些地方。我怎样才能做到这一点?? – 2011-12-14 06:04:11