22

ListView で項目を非表示にしたり、少なくとも高さをゼロに設定したりするにはどうすればよいでしょうか?

ビューの可視性を GONE に設定しようとしましたが、アイテムのスペース (高さ) は維持されます。

4

8 に答える 8

12

このようにアイテムを隠したい場合:

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);
}
于 2015-01-06T02:52:24.787 に答える
9

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 パターンは全体で使用されていませんが、特定の拡張に使用されています。それは何もないよりはましです。

于 2014-01-24T01:54:07.280 に答える
2

ここからドラッグアンドドロップリストをいじくり回しました。アイテムがリストからポップされてセルスペース内を移動する場合、アイテムの高さは1pxに設定されているため(238行目を参照)、「なくなった」ように見えます。高さを0に設定すると、可視性が失われるのと同様に失敗するため、これをより適切に処理する方法を見つけることができませんでした。

とは言うものの、本当に一時的に行を削除したい場合は、のバッキングを変更してAdapter呼び出すnotifyDataSetChanged()ことをお勧めします。

于 2010-04-14T16:50:35.867 に答える
2

ソースコードを見てきました。を使わずにアイテムを非表示にする方法は 1 つしかありませんnotifyDataSetChanged()。すべての内部ビューの可視性を設定GONEし、アイテムのビューの背景画像とパディングを削除する必要があります。

注: このような非表示要素を含む行は選択可能になります。

PS: これは、ExpandableListViewグループ ビュー自体を非表示にする場合に非常に便利です。

于 2010-11-29T09:09:27.147 に答える
0

ListView オブジェクトに追加します: android:dividerHeight="0px" android:divider="#FFFFFF"

仕切りの色は、dividerHeight を設定するだけでは問題ありません。

ただし、これにより仕切りが削除されます...

于 2010-07-24T14:35:27.687 に答える
0

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);
    }
}
于 2019-11-26T13:00:51.610 に答える