所以我有一个自定义ListView对象。列表项具有两个彼此叠放的textview,以及一个水平进度条,在我实际执行某项操作之前,我一直希望保持水平状态。最右边是一个复选框,仅在用户需要将更新下载到他们的数据库时才显示。通过将可见性设置为Visibility.GONE禁用复选框时,我可以单击列表项。当该复选框可见时,我无法单击列表中除复选框以外的任何内容。我已经进行了一些搜索,但没有找到与我当前状况有关的任何内容。我发现了这个问题但由于使用ArrayLists内部包含数据库列表,因此我使用了重写的ArrayAdapter。我是否只需要获取LinearLayout视图并像Tom一样添加onClickListener?我不确定。
这是listview行布局XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="fill_parent">
<TextView
android:id="@+id/UpdateNameText"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:layout_weight="1"
android:textSize="18sp"
android:gravity="center_vertical"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:id="@+id/UpdateStatusText"
android:singleLine="true"
android:ellipsize="marquee"
/>
<ProgressBar android:id="@+id/UpdateProgress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminateOnly="false"
android:progressDrawable="@android:drawable/progress_horizontal"
android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"
android:minHeight="10dip"
android:maxHeight="10dip"
/>
</LinearLayout>
<CheckBox android:text=""
android:id="@+id/UpdateCheckBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
这是扩展ListActivity的类。显然它仍在开发中,因此可以原谅遗漏或遗留的东西:
public class UpdateActivity extends ListActivity {
AccountManager lookupDb;
boolean allSelected;
UpdateListAdapter list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lookupDb = new AccountManager(this);
lookupDb.loadUpdates();
setContentView(R.layout.update);
allSelected = false;
list = new UpdateListAdapter(this, R.layout.update_row, lookupDb.getUpdateItems());
setListAdapter(list);
Button btnEnterRegCode = (Button)findViewById(R.id.btnUpdateRegister);
btnEnterRegCode.setVisibility(View.GONE);
Button btnSelectAll = (Button)findViewById(R.id.btnSelectAll);
btnSelectAll.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
allSelected = !allSelected;
for(int i=0; i < lookupDb.getUpdateItems().size(); i++) {
lookupDb.getUpdateItem(i).setSelected(!lookupDb.getUpdateItem(i).isSelected());
}
list.notifyDataSetChanged();
// loop through each UpdateItem and set the selected attribute to the inverse
} // end onClick
}); // end setOnClickListener
Button btnUpdate = (Button)findViewById(R.id.btnUpdate);
btnUpdate.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
} // end onClick
}); // end setOnClickListener
lookupDb.close();
} // end onCreate
@Override
protected void onDestroy() {
super.onDestroy();
for (UpdateItem item : lookupDb.getUpdateItems()) {
item.getDatabase().close();
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
UpdateItem item = lookupDb.getUpdateItem(position);
if (item != null) {
item.setSelected(!item.isSelected());
list.notifyDataSetChanged();
}
}
private class UpdateListAdapter extends ArrayAdapter<UpdateItem> {
private List<UpdateItem> items;
public UpdateListAdapter(Context context, int textViewResourceId, List<UpdateItem> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = null;
if (convertView == null) {
LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = li.inflate(R.layout.update_row, null);
} else {
row = convertView;
}
UpdateItem item = items.get(position);
if (item != null) {
TextView upper = (TextView)row.findViewById(R.id.UpdateNameText);
TextView lower = (TextView)row.findViewById(R.id.UpdateStatusText);
CheckBox cb = (CheckBox)row.findViewById(R.id.UpdateCheckBox);
upper.setText(item.getName());
lower.setText(item.getStatusText());
if (item.getStatusCode() == UpdateItem.UP_TO_DATE) {
cb.setVisibility(View.GONE);
} else {
cb.setVisibility(View.VISIBLE);
cb.setChecked(item.isSelected());
}
ProgressBar pb = (ProgressBar)row.findViewById(R.id.UpdateProgress);
pb.setVisibility(View.GONE);
}
return row;
}
} // end inner class UpdateListAdapter
}
编辑:我仍然有这个问题。我在作弊并将onClick处理程序添加到textviews中,但是当我不单击复选框时,根本没有调用onListItemClick()函数似乎非常愚蠢。
问题是Android不允许你选择列表元素上具有可聚焦元素的列表项。我修改了列表项上的复选框,使其具有如下所示的属性:
android:focusable="false"
现在,我的包含复选框的列表项(也适用于按钮)在传统意义上是“可选的”(它们亮起,你可以单击列表项中的任何位置,并且将触发“ onListItemClick”处理程序,等等)。
编辑:作为一个更新,一个评论者提到“只是一个注释,在更改按钮的可见性之后,我不得不再次以编程方式禁用焦点。”
浓缩咖啡用于自动测试我的应用程序。 在Espresso文档中有一个长列表的示例。处理对象列表是我通常做的事情。到目前为止,尝试从地图到对象的许多选项都没有产生好的结果。 浓缩咖啡的文档说应该使用“on data”。所以,类似于: 我的问题(我认为它们对学习社区很有帮助):-你能为此写一个好的匹配器吗?-我们如何在“关于数据”中使用它? 什么情况?在屏幕上,我有一个对象列表视图,如下所示: 我用来填
问题内容: 我有一个ListView,其行中应具有以下布局: 应该是静态的,但每隔几秒钟就会更改一次。 我通过填充,将其传递给并在每次数据更改时进行设置来实现它: 我的问题是我不知道如何以上述格式显示数据。 提前致谢。 问题答案: 将此添加到你的布局文件夹 使你的主要xml布局如下 这是你的适配器 你的Java活动
问题内容: 我浏览了教程并进行了搜索,但仍然不明白该怎么做, 当扩展在我的android应用程序中创建自定义listView 时,此方法有效。因此,我无法完全按照需要编辑“自定义”列表视图。 我需要知道何时调用此方法以及参数的含义。 如果有人可以解释以下方法很好。谢谢 问题答案: getView() :如规范中所述,getView方法将数据显示在指定位置。因此,当您设置适配器并滚动时,将调用lis
正在开发一个应用程序,采取学生考勤,我想得到的名单上勾选的名字“考勤”,当我点击一个“考勤”在相同的自定义列表视图。拜托,我该怎么做? 这是我的密码...自定义视图 ListAdapter公共类StudentListAdapter1扩展了BaseAdapter{private Context mContext;private List mStudentList; } 考勤activityprote
本文向大家介绍Android ListView的Item点击效果的定制,包括了Android ListView的Item点击效果的定制的使用技巧和注意事项,需要的朋友参考一下 Android ListView的Item点击效果的定制 前言: 对于listview Android开发的朋友都知道用的很多,网上关于Android ListView的Item点击特
我试图在片段中创建自定义listView,我搜索了其他问题,但找不到任何东西。我的列表适配器是这样的 我的片段类是这样的: } 问题是这部分:CustomList adapter=新CustomList(tab1.this,string,imageId);构造函数(public CustomList(活动上下文,字符串[]web,整数[]imageId))只接受活动 我怎样才能解决这个问题?