ListView で項目を非表示にしたり、少なくとも高さをゼロに設定したりするにはどうすればよいでしょうか?
ビューの可視性を GONE に設定しようとしましたが、アイテムのスペース (高さ) は維持されます。
ListView で項目を非表示にしたり、少なくとも高さをゼロに設定したりするにはどうすればよいでしょうか?
ビューの可視性を GONE に設定しようとしましたが、アイテムのスペース (高さ) は維持されます。
このようにアイテムを隠したい場合:
convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,1));
convertView.setVisibility(View.GONE);
AbsListView.LayoutParams(-1,0) にすることはできません。
convertview を再利用する場合は、以下を追加して高さを元に戻す必要があります。
if(convertView.getVisibility() == View.GONE) {
convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));
convertView.setVisibility(View.VISIBLE);
}
ListView に関しては、効率化するために ViewHolder パターンを使用します。以下のxmlのViewHolder PatternとR.layout.row_nullの使い方
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</LinearLayout>
次のようにgetViewTypeCount()およびgetItemViewType(int position)で使用することです。
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return (hideStatusCheck(position)) ? 1 : 0;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
View rowView = convertView;
if (hideStatusCheck(pos)) {
if (rowView == null || rowView.getTag() != null) {
LayoutInflater inflater = mActivity.getLayoutInflater();
rowView = inflater.inflate(R.layout.row_null, parent, false);
}
} else {
if (rowView == null) {
rowView = inflateNormalView(parent);
} else if (rowView.getTag() == null) {
rowView = inflateNormalView(parent);
} else {
ViewHolder holderToCheck = (ViewHolder) rowView.getTag();
Integer storedPos = (Integer) holderToCheck.getTag(POSITION);
if (storedPos == null || storedPos != pos)
rowView = inflateNormalView(parent);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
holder.setTag(POSITION,pos);
/*
Populate data
*/
return rowView;
}
private View inflateNormalView(ViewGroup parent) {
View rowView;
LayoutInflater inflater = mActivity.getLayoutInflater();
rowView = inflater.inflate(R.layout.normal_item, parent, false);
ViewHolder viewHolder = new ViewHolder();
assert rowView != null;
/* Initiate normal findViewById thing*/
rowView.setTag(viewHolder);
return rowView;
}
アイテムのビュー タイプのチェックを行い、非表示チェックを満たす場合は 1 を返し、そうでない場合は 0 を返します。ListView は、getViewTypeCount から 2 つのタイプのビューがあることを認識しています。これで、getView は hideStatusCheck に応じて適切なビューを返します。堅牢な ListView を作成するには、ViewHolder パターンを使用します。非表示の場合、ViewHolder を使用する必要はありません。R.layout.row_null を単純にインフレートして返します。R.layout.normal_item には ViewHolder を使用します。非表示チェックが静的でないと仮定すると、ここで注意が必要な部分があります。の最初のチェックrowView==null
は標準です。の 2 番目のチェックはrowView.getTag()==null
、ビューが非表示から通常に戻っているかどうかを確認することです。最後の3回目のチェックelse
句は、タグに保持されている ViewHolder が正しい ViewHolder であるかどうかを確認することです。これらの条件が満たされた場合、常にビューを再び膨張させます。はい、確かに、ViewHolder パターンは全体で使用されていませんが、特定の拡張に使用されています。それは何もないよりはましです。
ここからドラッグアンドドロップリストをいじくり回しました。アイテムがリストからポップされてセルスペース内を移動する場合、アイテムの高さは1pxに設定されているため(238行目を参照)、「なくなった」ように見えます。高さを0に設定すると、可視性が失われるのと同様に失敗するため、これをより適切に処理する方法を見つけることができませんでした。
とは言うものの、本当に一時的に行を削除したい場合は、のバッキングを変更してAdapter
呼び出すnotifyDataSetChanged()
ことをお勧めします。
ソースコードを見てきました。を使わずにアイテムを非表示にする方法は 1 つしかありませんnotifyDataSetChanged()
。すべての内部ビューの可視性を設定GONE
し、アイテムのビューの背景画像とパディングを削除する必要があります。
注: このような非表示要素を含む行は選択可能になります。
PS: これは、ExpandableListView
グループ ビュー自体を非表示にする場合に非常に便利です。
ListView オブジェクトに追加します: android:dividerHeight="0px" android:divider="#FFFFFF"
仕切りの色は、dividerHeight を設定するだけでは問題ありません。
ただし、これにより仕切りが削除されます...
Androidのリストビューから生全体を非表示にするには:-
RelativeLayout parentLayout = (RelativeLayout) view.findViewById(R.id.relative);
if (productPojoList.get(position).getSERSERVICETYPE().toString().equals("Group|Promotional")){
view.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,1));
view.setVisibility(View.GONE);
} else {
if(view.getVisibility() == View.GONE) {
view.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));
view.setVisibility(View.VISIBLE);
}
}