我有一些列表視圖,其中有些項目可以標記爲「已完成」。還有一個切換按鈕說「隱藏已完成的項目」。Android設置View.GONE不會在列表視圖中「釋放」空間
然而,當我這樣做隱藏設置setVisibility項目(View.GONE)仍然存在留在列表空間..
不應該是硬切換在列表視圖列表中的項目?
我有一些列表視圖,其中有些項目可以標記爲「已完成」。還有一個切換按鈕說「隱藏已完成的項目」。Android設置View.GONE不會在列表視圖中「釋放」空間
然而,當我這樣做隱藏設置setVisibility項目(View.GONE)仍然存在留在列表空間..
不應該是硬切換在列表視圖列表中的項目?
將android:layout_height =「wrap_content」更改爲android:layout_height =「fill_parent」修復了問題..正在測試一個很長的列表..與一個簡短的列表相同的空間位於列表之上..愚蠢的錯誤。 。
感謝所有的幫助..一切正在工作。
你應該名單適配器還進行操作...
這都在列表適配器上。 –
你試圖掩蓋整個列表項目?如果是這樣,我想列表視圖不會那樣,因爲它仍然在計算相同數量的項目。我不認爲它會因爲它消失而忽略它。
乾淨的解決方案將返回另一個getCount
,只是忽略你想隱藏的項目。或從內部使用的清單中刪除項目。修改列表中項目的數量時,請在適配器上調用notifyDataSetChanged
。
因此,保留一個單獨的列表與所有和唯一的檢查項目,並與任何需要顯示正確的信息列表工作..聽起來像一個計劃。 –
完全不起作用。我根據按鈕的切換狀態返回正確的項目和正確的計數。在列表中的項目是正確的項目,但仍然存在一個很大的空白空白確實存在..是否持有人類仍然存在? –
'notifyDataSetChanged'將觸發列表,使用返回的'getCount'值爲所有項目調用'getView'。這應該做的伎倆。但我不能幫助你,因爲我不知道任何細節。似乎有其他的東西真的是錯的... – Knickedi
我能夠使用Knickedi的解決方案和它下面的評論來解決這個問題。只是想展示我的相對完整的適配器來澄清一點。
我有類stockItem和字段來存儲單個庫存項目的一系列數據。對於自定義ArrayAdapter,構造函數接受從數據庫表中檢索到的StockItems的完整列表,並且我將來添加的任何添加/刪除方法也將在此列表上運行(mList)。然而,我推翻getView(),和getCount將()從一個第二列表(mFilteredList)來讀取使用該方法filterList()製備:
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();
}
}
filterList(字符串搜索)從OnQueryTextListener稱爲並刪除列表項其描述與輸入的文本不符。
在大列表的情況下,filterList()可能是主線程上的一個問題,但這與此問題無關。
編輯:必須重寫getItem(position)方法以從mFilteredList返回項目。
@Override
public StockItem getItem(int position) {
return mFilteredList.get(position);
}
在檢查了很多解決方案後,沒有一個解決了我的問題與空的空間,所以我決定提出我的解決方案。
我有兩個主要問題: 1)我有,因爲我的可見性設置爲不見了 2)我也有dividerHeight的12dp視圖的一個空的空間,即使我有了第一個問題解決了我仍然有列表視圖
的固定分頻器高度解決方案:
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>
也許它不是優雅的人,但這個解決方案爲我
祝賀解決方案。如果可以,請確保將您的答案標記爲「已接受」,以便其他人可以向您學習成功。乾杯〜 –
不適用於填寫父母。 – Thushara