我有一个列表视图,其中包含一些可以标记为“已完成”的项目。还有一个togglebutton说“隐藏完成的项目”。
但是,当我通过设置setVisibility(View.GONE)来隐藏项目时,列表中仍然留有空间..
列表视图中的列表项不应该难以切换吗?
答案 0 :(得分:9)
更改android:layout_height =“wrap_content”到android:layout_height =“fill_parent”修复了问题..正在测试一个很长的列表..用一个短列表相同的空间在列表上方..愚蠢的错误..
感谢大家的帮助......现在一切正常。
答案 1 :(得分:3)
您是否试图隐藏整个列表项?如果是这样,我猜列表视图不会那样,因为它仍然使用相同数量的项目进行计算。我不认为它会忽略它,因为它已经消失了。
干净的解决方案是返回另一个getCount
并忽略您要隐藏的项目。或者从内部使用的列表中删除项目。修改列表中的项目数量时,在适配器上调用notifyDataSetChanged
。
答案 2 :(得分:1)
你也应该对列表适配器进行操作......
答案 3 :(得分:0)
我能够使用Knickedi的解决方案及其下的评论来解决这个问题。只是想展示我相对完整的适配器来澄清它。
我有类StockItem,其中包含用于保存单个库存项目的数据范围的字段。对于自定义ArrayAdapter,构造函数获取从数据库表中检索的StockItem的完整列表,并且我将来可能添加的任何添加/删除方法也将在此列表上运行(mList)。但是,我重写了getView()和getCount()来读取使用filterList()方法生成的第二个列表(mFilteredList):
public class StockItemAdapter extends ArrayAdapter<StockItem> {
...
ArrayList<StockItem> mList;
ArrayList<StockItem> mFilteredList;
public StockItemAdapter(Context context, int resource, ArrayList<StockItem> list) {
super(context, resource, list);
...
mList = list;
mFilteredList = list;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
StockItemHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
row = inflater.inflate(mResource, parent, false);
holder = new StockItemHolder();
holder.imageView = (ImageView)row.findViewById(R.id.imageView);
...
row.setTag(holder);
} else {
holder = (StockItemHolder)row.getTag();
}
StockItem stockItem = mFilteredList.get(position);
if (stockItem.getImage() != null) {
holder.imageView.setImageBitmap(stockItem.getImage());
} else {
holder.imageView.setImageResource(R.drawable.terencephilip);
}
...
return row;
}
@Override
public int getCount() {
return mFilteredList.size();
}
static class StockItemHolder {
ImageView imageView;
...
}
public void filterList(String search) {
mFilteredList = new ArrayList<StockItem>();
for (StockItem item : mList) {
if (item.getDescription().toLowerCase(Locale.ENGLISH)
.contains(search.toLowerCase(Locale.ENGLISH))) {
mFilteredList.add(item);
}
}
notifyDataSetChanged();
}
}
从OnQueryTextListener调用filterList(字符串搜索)并删除其描述与输入的文本不匹配的列表项。
对于大型列表,filterList()可能是主线程上的问题,但这与此问题无关。
编辑:还必须重写getItem(position)方法以从mFilteredList返回项目。
@Override
public StockItem getItem(int position) {
return mFilteredList.get(position);
}
答案 4 :(得分:0)
在检查了许多解决方案后,没有一个解决了我的空白问题,所以我决定提出我的解决方案。
我有两个主要问题: 1)我有一个空的空间,因为我认为它的可见性消失了 2)我也有12dp的dividerHeight,即使我已经解决了第一个问题,我仍然有listview的固定分频器高度
解决方案:
1.1)我在列表数据中添加了一个布尔值,通知适配器跳过了哪些项目
1.2)我创建了一个空布局来模拟“跳过的项目”
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dp"
android:layout_height="0dp"/>
1.3)我在列表视图,选定项目,常规项目和现在跳过的项目中有几种类型的视图
public class AdvancedTestAdapter extends BaseAdapter
{
private static final int REGULAR_STEP = 0;
private static final int SELECTED_STEP = 1;
private static final int SKIPPED_STEP = 2;
private static final int TYPE_MAX_COUNT = 3;
private List<AdvancedTestData> _data;
private Context _context;
private Typeface _fontTypeFace;
public AdvancedTestAdapter(Context context, List<AdvancedTestData> data)
{
_context = context;
_data = data;
_fontTypeFace = Typeface.createFromAsset(_context.getResources().getAssets(), Consts.Fonts.UniversLTStdBoldCn);
}
@Override
public AdvancedTestData getItem(int position)
{
return _data.get(position);
}
@Override
public int getCount()
{
return _data.size();
}
@Override
public long getItemId(int position)
{
return 0;
}
@Override
public int getItemViewType(int position)
{
AdvancedTestData step = getItem(position);
if(step.isSkipped())
{
return SKIPPED_STEP;
}
return _data.get(position).isStepSelected() ? SELECTED_STEP : REGULAR_STEP;
}
@Override
public int getViewTypeCount()
{
return TYPE_MAX_COUNT;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
RegularViewHolder regHolder;
SelectedViewHolder selectHolder;
AdvancedTestData item = getItem(position);
int currentStepType = getItemViewType(position);
switch (currentStepType)
{
case SKIPPED_STEP:
convertView = LayoutInflater.from(_context).inflate(R.layout.skipped_item_layout, parent, false);
break;
case REGULAR_STEP:
if (convertView == null)
{
regHolder = new RegularViewHolder();
convertView = LayoutInflater.from(_context).inflate(R.layout.advanced_test_layout, parent, false);
regHolder._regTestUpperHeader = (TextView) convertView.findViewById(R.id.advanced_test_upper_name);
regHolder._regTestLowerHeader = (TextView) convertView.findViewById(R.id.advanced_test_lower_name);
regHolder._regTestImage = (ImageView) convertView.findViewById(R.id.advanced_test_image);
regHolder._regTestWithoutLowerHeader = (TextView) convertView.findViewById(R.id.step_without_lower_header);
regHolder._regTestUpperHeader.setTypeface(_fontTypeFace);
regHolder._regTestLowerHeader.setTypeface(_fontTypeFace);
regHolder._regTestWithoutLowerHeader.setTypeface(_fontTypeFace);
convertView.setTag(regHolder);
}
else
{
regHolder = (RegularViewHolder) convertView.getTag();
}
String upperHeader = item.getTestUpperHeader();
String lowerHeader = item.getTestLowerHeader();
if(lowerHeader.isEmpty())
{
regHolder._regTestUpperHeader.setVisibility(View.GONE);
regHolder._regTestLowerHeader.setVisibility(View.GONE);
regHolder._regTestWithoutLowerHeader.setVisibility(View.VISIBLE);
regHolder._regTestWithoutLowerHeader.setText(upperHeader);
}
else
{
regHolder._regTestUpperHeader.setVisibility(View.VISIBLE);
regHolder._regTestLowerHeader.setVisibility(View.VISIBLE);
regHolder._regTestWithoutLowerHeader.setVisibility(View.GONE);
regHolder._regTestUpperHeader.setText(upperHeader);
regHolder._regTestLowerHeader.setText(lowerHeader);
}
regHolder._regTestImage.setBackgroundResource(item.getResourceId());
break;
case SELECTED_STEP:
if (convertView == null)
{
selectHolder = new SelectedViewHolder();
convertView = LayoutInflater.from(_context).inflate(R.layout.advanced_selected_step_layout, parent, false);
selectHolder._selectedTestName = (TextView) convertView.findViewById(R.id.selected_header_text);
selectHolder._selectedTestDesc = (TextView) convertView.findViewById(R.id.selected_desc_text);
selectHolder._selectedPreFinishControllers = (RelativeLayout) convertView.findViewById(R.id.prefinish_step_controllers);
selectHolder._selectedFvEndControllers = (RelativeLayout) convertView.findViewById(R.id.advanced_fv_controllers);
selectHolder._selectedNvEndControllers = (RelativeLayout) convertView.findViewById(R.id.advanced_nv_controllers);
convertView.setTag(selectHolder);
}
else
{
selectHolder = (SelectedViewHolder) convertView.getTag();
}
selectHolder._selectedPreFinishControllers.setVisibility(View.INVISIBLE);
selectHolder._selectedFvEndControllers.setVisibility(View.INVISIBLE);
selectHolder._selectedNvEndControllers.setVisibility(View.INVISIBLE);
int testIndex = item.getTestIndex();
ADVANCED_QUICK_TEST_TESPS currentStep = ADVANCED_QUICK_TEST_TESPS.valueOf(testIndex);
//show action buttons in each step in advanced mode
switch (currentStep)
{
case QUESTIONS://nothing to show
break;
case RIGHT_VERIFICATION:
case LEFT_VERIFICATION:
case BINOCULAR_BALANCE:
case SPHERE_VERIFICATION:
case ADD_VERIFICATION:
if(item.isStepPreFinished())
{
selectHolder._selectedPreFinishControllers.setVisibility(View.VISIBLE);
}
break;
case RIGHT_VA:
case LEFT_VA:
case BINO_VA:
selectHolder._selectedPreFinishControllers.setVisibility(View.VISIBLE);
break;
case FV_DONE:
selectHolder._selectedFvEndControllers.setVisibility(View.VISIBLE);
break;
case FULL_EXAM_DONE:
selectHolder._selectedNvEndControllers.setVisibility(View.VISIBLE);
break;
}
String textHeader = String.format("%s\n%s", item.getTestUpperHeader(),item.getTestLowerHeader());
selectHolder._selectedTestName.setText(textHeader);
selectHolder._selectedTestDesc.setText(item.getTestDescription());
break;
}
return convertView;
}
public void setData(List<AdvancedTestData> data)
{
_data = data;
notifyDataSetChanged();
}
public static class RegularViewHolder
{
public TextView _regTestWithoutLowerHeader;
public TextView _regTestUpperHeader;
public TextView _regTestLowerHeader;
public ImageView _regTestImage;
}
public static class SelectedViewHolder
{
public TextView _selectedTestName;
public TextView _selectedTestDesc;
public RelativeLayout _selectedPreFinishControllers;
public RelativeLayout _selectedFvEndControllers;
public RelativeLayout _selectedNvEndControllers;
}
只有当项目被跳过时,适配器才会膨胀为空布局,如上一步所示,仍然存在分隔符高度问题
2)为了修正分频器高度,我将分频器高度更改为0而不是12dp, 每个未跳过的项目我添加了另一个透明背景的布局(我的情况下的divier颜色应该是透明的)并添加了12dp的底部填充
例如我的一件物品
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"
android:paddingBottom="12dp" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/quick_test_background_selector" >
<ImageView
android:id="@+id/advanced_test_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/done_step" />
<TextView
android:id="@+id/advanced_test_upper_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@id/advanced_test_image"
android:gravity="center_vertical"
android:text="ETAPE 1"
android:textColor="@android:color/black"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/advanced_test_lower_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/advanced_test_image"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@id/advanced_test_image"
android:gravity="center_vertical"
android:text="ETAPE 1"
android:textColor="@android:color/black"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/step_without_lower_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/advanced_test_image"
android:layout_alignTop="@id/advanced_test_image"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@id/advanced_test_image"
android:gravity="center_vertical"
android:text="123"
android:textColor="@android:color/black"
android:textSize="14sp"
android:textStyle="bold" />
</RelativeLayout>
</RelativeLayout>
也许它不优雅,但这个解决方案对我有用
答案 5 :(得分:0)
View.GONE实际上是在释放空间,但其他元素可能已被限制在其当前位置。尝试这个。在自定义布局文件(充当列表项目的视图)中,
假设X是您想成为的UI元素,W是X之下的元素,Y是X之上的元素
在ListView的自定义布局中,(假设它是相对布局)将W的顶部附加到X的底部。然后将元素X的顶部附加到Y的底部。
答案 6 :(得分:0)
convertView = inflater.inflate(R.layout.custom_layout, parent, false);
if (CONDITION) {
holder.wholeLayout.getLayoutParams().height = 1; // visibility Gone not working && 0 height crash app.
} else {
holder.wholeLayout.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT;
}