安卓中创建listview加载两种布局的两种方法

博客访问: 794602
博文数量: 268
博客积分: 5587
博客等级: 大校
技术积分: 2070
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
& && & 写Android程序的时候,免不了要使用ListView,也免不了要使用ContextMenu,但是如何将其结合起来呢。比如Contacts程序是如何删除练习人的呢。
& && & 添加或则删除一个tem有不同的方式,添加Item可以使用ListView自身带的add()方法即可,但是在ContextMenu中删除这个Item还是有些麻烦的。
& && & 下面是一个小例子:
& && & 1、可以在EditText中输入内容后动态添加Item
& && & 2、可以在ContextMenu中添加(但只能添加同一个Item)
& && & 3、可以点击Item直接删除Item
& && & 4、可以长按Item后弹出ContextMenu来删除Item
java代码:
<LinearLayout xmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:id="@+id/edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/additem"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="4"
android:text="添加"
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
& && & ArrayAdapterTest.java
java代码:
package eoe.
import java.util.ArrayL
import android.app.ListA
import android.os.B
import android.view.ContextM
import android.view.ContextMenu.ContextMenuI
import android.view.M
import android.view.MenuI
import android.view.V
import android.widget.AdapterView.AdapterContextMenuI
import android.widget.ArrayA
import android.widget.B
import android.widget.EditT
import android.widget.ListV
import android.widget.T
public class ArrayActivity extends ListActivity {
private EditT
private ArrayList list = new ArrayList();
ArrayAdapter
private static final int ITEM1=Menu.FIRST;
private static final int ITEM2=Menu.FIRST+1;
private static final int ITEM3=Menu.FIRST+2;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
* 这里虽然是继承了ListActivit,但是如果想使用自己的布局,
* ListView中的id必须是“@android:id/list”,否则出错
setContentView(R.layout.main);
inputtext = (EditText)findViewById(R.id.edittext);
btnadd = (Button)findViewById(R.id.additem);
adapter = new ArrayAdapter(&&this,&&android.R.layout.simple_expandable_list_item_1,&&list);
//设置适配器
setListAdapter(adapter);
//为 ListView 的所有 item 注册 ContextMenu
this.registerForContextMenu(getListView());
btnadd.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
list.add(inputtext.getText().toString());
adapter.notifyDataSetChanged();
inputtext.setText("");
java代码:
//设置Context,用来进行删除操作
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
list.remove(position);
adapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(), "删除此项", Toast.LENGTH_SHORT).show();
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("提示信息");
menu.setHeaderIcon(R.drawable.icon);
menu.add(0,ITEM1,0,"删除Item");
menu.add(0,ITEM2,0,"添加Item");
menu.add(0,ITEM3,0,"关于我");
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo();
switch(item.getItemId())
case ITEM1:
//System.out.println("Item id="+item.getItemId());
//System.out.println("position="+getListAdapter().getItemId(menuInfo.position));
* getListAdapter().getItemId(menuInfo.position)返回的值是Long型,
* 而list.remove(position)是String java.util.ArrayList.remove(int index),
* 所以当执行到这里的时候,如果直接使用Long型的话,由于不是int型的,所以默认
* 使用的是:boolean java.util.ArrayList.remove(Object object)
* 两个remove()不匹配,所以重载的是remove(Object object),而这个方法是不能删除item的
* 所以需要将得到的position强制转换为int型的才能运行
//list.remove(getListAdapter().getItemId(menuInfo.position));这句话是错误的
int pos = (int) getListAdapter().getItemId(menuInfo.position);
if(list.remove(pos) != null){
System.out.println("success");
System.out.println("failed");
adapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(), "删除此项", Toast.LENGTH_SHORT).show();
case ITEM2:
list.add("我是花郎!");
adapter.notifyDataSetChanged();
case ITEM3:
Toast.makeText(getApplicationContext(), "我是花郎!", Toast.LENGTH_SHORT).show();
return super.onContextItemSelected(item);
& && & 在这里需要说明几点:
& && & 1、本程序是继承ListActivity,但是又用到了自己定义的布局文件。注意,这里的布局文件一定要包含ListView,并且id必须是"@android:id/list",否则会报错
& && & 2、 getListAdapter().getItemId(menuInfo.position)返
回的值是Long型, 而list.remove(position)是String java.util.ArrayList.remove(int
index), 所以当执行到这里的时候,如果直接使用Long型的话,由于不是int型的,所以默认使用的是:boolean
java.util.ArrayList.remove(Object object)
两个remove()不匹配,所以重载的是remove(Object
object),而这个方法是不能删除item的所以需要将得到的position强制转换为int型的才能运行
& && &&&首先添加几项数据,这是动态添加的
& && &&&点击2,即可删除该Item
& && &&&长按3Item,弹出ContextMenu后,点击删除Item
/forum.php?mod=viewthread&tid=97868&reltid=162322&pre_thread_id=69288&pre_pos=2&ext=
阅读(5983) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。17:28 提问
android中添加LayoutParams的不同方法
我创建了一个EditText ,用户可以输入公司的名称。在 EditText 下面有一个 ListView,用户已经添加了数据库。
&EditText android:id="@+id/txtBusinessName" android:hint="Name of Business" /&
&ListView android:id="@+id/suggestionList"
android:layout_width="fill_parent" android:layout_height="wrap_content"&
&/ListView&
现在当用户输入时,我检查他们输入的关键字,在数据库中检索,在ListView中显示用户。现在当每个关键字事件销毁时,我就调用一个新的AsyncTask:
EditText txtBusinessName = (EditText) findViewById(R.id.txtBusinessName);
txtBusinessName.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP) {
if (v instanceof EditText) {
EditText txtBusinessName = ((EditText) v);
if (txtBusinessName.length() & 0) {
if (suggestionTask != null) {
suggestionTask.cancel(true);
suggestionTask =
suggestionTask = new GetCompaniesByKeywordAsyncTask(
AddBusinessActivity.this, s);
suggestionTask.execute(txtBusinessName.getText()
.toString());
有什么方法能让AsyncTask中的一个单一实例来检索用户在EditText中输入的名称?
创建很多的AsyncTask 不是很有效,会出现异常。我将填充列表来接收名称。是否要让ListView根据自身内容的多少设置大小?
按赞数排序
不是有个AutoCompleteTextView
15807关注|1576收录
其他相似问题
相关参考资料Android ListView两种长按弹出菜单方式 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 9时,
Android&ListView两种长按弹出菜单方式
代码片段(3)
1.&[代码][Java]代码&&&&
* @author xianglong guo
* 知识点1:ListView item:两种长按弹出菜单方式
* 知识点2:ListView SimpleAdapter的使用
知识点 3:在java代码中创建一个ListView
-----------------------------------------------------
代码片段,双击复制
publicclass ListOnLongClickActivity extendsActivity {
privateLinearLayout myListV
privateListView mListV
publicint MID;
// 创建一个List对象,用来存放列表项的每一行map信息
List&Map&String, Object&& list = newArrayList&Map&String, Object&&();
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myListViewlayout = (LinearLayout) findViewById(R.id.myListViewlayout);
mListView = newListView(this);
// 创建布局参数
LinearLayout.LayoutParams listviewParams = newLinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT);
// 当滑动列表上,默认显示的黑色
mListView.setCacheColorHint(Color.WHITE);
// 将列表添加到流式布局myListViewlayout中
myListViewlayout.addView(mListView, listviewParams);
FillListData();
// 列表现的单机事件
mListView.setOnItemClickListener(newOnItemClickListener() {
publicvoid onItemClick(AdapterView&?& arg0, View arg1,
intposition, longid) {
* 点击列表项时触发onItemClick方法,四个参数含义分别为
* arg0:发生单击事件的AdapterView
* arg1:AdapterView中被点击的View
* position:当前点击的行在adapter的下标
* id:当前点击的行的id
Toast.makeText(ListOnLongClickActivity.this,
"您选择的是" + list.get(position).get("name").toString(),
Toast.LENGTH_SHORT).show();
* Item 长按方式弹出菜单多选方式1
* Item 长按方式弹出菜单多选方式2
* ItemOnLongClick1()与ItemOnLongClick2()不共存,按实际需要选择
ItemOnLongClick1();
ItemOnLongClick2();
// 填充ListView资源
privatevoid FillListData() {
adapter = newSimpleAdapter(ListOnLongClickActivity.this,
getListData(), R.layout.listviewrow, newString[] { "name",
"price"}, newint[] { R.id.tv_name, R.id.tv_price });
mListView.setAdapter(adapter);
privateList&Map&String, Object&& getListData() {
Map&String, Object& _map = newHashMap&String, Object&();
_map.put("name","MOTO ME865");
_map.put("price","2350元");
list.add(_map);
_map = newHashMap&String, Object&();
_map.put("name","HTC G18");
_map.put("price","3340元");
list.add(_map);
_map = newHashMap&String, Object&();
_map.put("name","MOTO XT928");
_map.put("price","5450元");
list.add(_map);
_map = newHashMap&String, Object&();
_map.put("name","iPhone 4S");
_map.put("price","4650元");
list.add(_map);
_map = newHashMap&String, Object&();
_map.put("name","MOTO ME525");
_map.put("price","1345元");
list.add(_map);
privatevoid ItemOnLongClick1() {
//注:setOnCreateContextMenuListener是与下面onContextItemSelected配套使用的
.setOnCreateContextMenuListener(newOnCreateContextMenuListener() {
publicvoid onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(0,0,0,"添加");
menu.add(0,1,0,"删除");
menu.add(0,2,0,"删除ALL");
// 长按菜单响应函数
publicboolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
MID = (int) info.// 这里的info.id对应的就是数据库中_id的值
switch(item.getItemId()) {
// 添加操作
Toast.makeText(ListOnLongClickActivity.this,
Toast.LENGTH_SHORT).show();
// 删除操作
// 删除ALL操作
returnsuper.onContextItemSelected(item);
privatevoid ItemOnLongClick2() {
mListView.setOnItemLongClickListener(newOnItemLongClickListener() {
publicboolean onItemLongClick(AdapterView&?& arg0, View arg1,
finalint arg2, longarg3) {
list.remove(arg2);
newAlertDialog.Builder(ListOnLongClickActivity.this)
.setTitle("对Item进行操作")
.setItems(R.array.arrcontent,
newDialogInterface.OnClickListener() {
publicvoid onClick(DialogInterface dialog,
intwhich) {
String[] PK = getResources()
.getStringArray(
R.array.arrcontent);
Toast.makeText(
ListOnLongClickActivity.this,
PK[which], Toast.LENGTH_LONG)
if(PK[which].equals("删除")) {
// 按照这种方式做删除操作,这个if内的代码有bug,实际代码中按需操作
list.remove(arg2);
adapter = (SimpleAdapter) mListView
.getAdapter();
if(!adapter.isEmpty()) {
adapter.notifyDataSetChanged();// 实现数据的实时刷新
.setNegativeButton("取消",
newDialogInterface.OnClickListener() {
publicvoid onClick(DialogInterface dialog,
intwhich) {
// TODO Auto-generated method stub
}).show();
2.&[图片] 0000.png&&&&
3.&[图片] .png&&&&
开源中国-程序员在线工具:
相关的代码(1505)
开源从代码分享开始
一别经年的其它代码下次自动登录
现在的位置:
& 综合 & 正文
android中listview添加2个headerview显示效果的演示
效果图如下:
第一个头布局我 设置了一下 位置,目的是为了证明,在自定义下拉刷新时,当listview已经添加了一个headerview时候,可以继续添加一个headerview,不影响下拉刷新
MainActivity
package com.ss.
import android.app.A
import android.os.B
import android.widget.ArrayA
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MyListView listView = (MyListView) findViewById(R.id.listView);
String[] data = new String[] { "第一个", "第二个", "第三个" };
ArrayAdapter&String& adapter = new ArrayAdapter&String&(MainActivity.this, android.R.layout.simple_list_item_1, data);
listView.setAdapter(adapter);
MyListView
package com.ss.
import android.content.C
import android.util.AttributeS
import android.view.LayoutI
import android.view.V
import android.widget.ListV
public class MyListView extends ListView {
public MyListView(Context context) {
super(context);
initHeaderView(context);
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
initHeaderView(context);
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initHeaderView(context);
private void initHeaderView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
one = inflater.inflate(R.layout.one, null);
View two = inflater.inflate(R.layout.two, null);
addHeaderView(one);
addHeaderView(two);
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//控制第一个头部布局的位置
one.setPadding(0, -1 * one.getHeight()/2, 0, 0);
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 listview两种布局 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信