3

カスタム リスト アダプターで項目を非表示にしようとしました。テキストの可視性を非表示にすることはできますが、リスト アイテム全体を非表示にすることはできません。それはまだ仕切りなどを示しています。私は試しました:

tv.setVisibility(View.INVISIBLE);
tv.setVisibility(View.GONE);
convertView.setVisibility(View.INVISIBLE);
convertView.setVisibility(View.GONE);

convertView を使用すると、null ポインター例外が発生します。

4

7 に答える 7

11
  1. 要素なしで ContentView を設定できます。

    カスタム アダプタの getView() 内。

    if(condition)
    {
      convertView=layoutInflater.inflate(R.layout.row_null,null);
      return convertView;
    }
    else
    {
       convertView=layoutInflater.inflate(R.layout.row_content,null);
       return convertView;
    }
    
  2. XML row_null.xml

    <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
    </LinearLayout>
    
于 2013-12-16T12:33:59.780 に答える
1

これを行うには 3 つの方法があります。

  1. アダプターの内側または外側のリストからアイテムを削除します。アダプター内では、コンストラクターで実行できます。

    private List<String> list; public MyAdapter(Context context, List<String> list) { list.remove(0); list.remove(1); list.remove(<whateverPositionYouLike>); this.list = list; }

  2. 非表示にするアイテムの数を把握し、同様のロジックを構築する必要があります。

@Override public int getCount() { // In this adapter, we are supposed to hide the first item of the list view // Returning 0 if no of items are already 0 if(list.size() <=1) return 0; // if number of items are more than one, returning one item less return list.size() - 1; }

@Override public Object getItem(int position) { // skipping the position return list.get(position + 1); }

`

 @Override
    public View getView(final int position, View v, ViewGroup arg2) {

    // this is important, as we are supposed to skip the first item of listview
    final int localPosition = position +1;

    ViewHolderItem holder;
    if (v == null) {
        holder = new ViewHolderItem();
        v = inflater.inflate(R.layout.list_row, null);
        v.setTag(holder);
    } else {
        holder = (ViewHolderItem) v.getTag();
    }
    return v;
    }

`

  1. @ hims_3009 が提供する回答
于 2014-12-19T10:33:13.133 に答える
0

はるかに簡単で安全な解決策があると思います。アイテムをレイアウトに「埋め込み」、この親レイアウトの可視性を変更するだけです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <!-- Embed ListView Item into a "parent" Layout -->
    <LinearLayout
        android:id="@+id/parentLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <!-- This is the normal content of your ListView Item -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="World" />

    </LinearLayout>
</LinearLayout>

次に、コードで次のようにします。

public View getView(int position, View view, ViewGroup parent) {
    if (view == null) {
        LayoutInflater li = mActivity.getLayoutInflater();
        view = li.inflate(R.layout.my_listview_item, null);
    }
    LinearLayout parentLayout = (LinearLayout) view.findViewById(R.id.parentLayout);
    if (shouldDisplayItem(position)) {
        parentLayout.setVisibility(View.VISIBLE);
    } else {
        parentLayout.setVisibility(View.GONE);
    }
    return view;
}

このようにして、常に同じアイテムを使用/再利用し、非表示/表示するだけです。

于 2014-05-13T14:03:11.627 に答える
0

カスタム リスト アダプターが既にある場合は、アダプターで notifyDataSetChanged() を呼び出すだけでよく、もちろん、非表示にする行のビューを除外するロジックをアダプター自体に実装する必要があります。これらは、そのロジックを反映する必要がある私の頭に浮かぶメソッドです。

    @Override
    public Object getItem(int position) {
        return mItems.get(position);
    }

    @Override
    public int getCount() {
        return mItems.size();
    }

    @Override
    public View getView(final int position, final View convertView, final ViewGroup parent) {
        // here goes your logic to hide a row

さらに、getItemId() も変更する必要がある場合があります。

于 2013-03-10T15:57:01.957 に答える
0

あなたがしようとしている方法ではできません。カスタム アダプターを使用し、そこに行を表示する/表示しないためのロジックを実装する必要があります。

于 2013-03-10T15:47:03.190 に答える
0

リストビューで行を非表示にする場合は、その位置のデータを削除する必要があります。たとえば、配列アダプターを使用していて、位置の行を非表示にしたい場合。配列から行を削除し、notifyDatasetChanged() メソッドを呼び出す必要があります。

(tempArray を使用して、配列からデータを削除できます)

またはこのように使用します

private List<String> items = new ArrayList<String>();    
// make list a new array, clearing out all old values in it.
for(i=0; i<10; i++)
{
  if((i != 5)  && (i != 6)){        
   // if k = 5 or 6, dont add those items to the list
     items.add(something[i]);   /// whatever your list items are.
   }
}

ArrayAdapter<String> itemList = new
ArrayAdapter<String>(this,R.layout.itemlistlayout);
setListAdapter(itemlist); 
于 2013-03-10T15:54:25.957 に答える
0

アイテム全体を非表示にする場合は、 getView() メソッドにロジックを組み込んで、データのさまざまな部分をスキップする必要があります。

ArrayAdapter があり、インデックス 2 のデータを非表示にしたいとします。getView() メソッドは次のようになります。

@Override
public View getView(int pos, View convertView, ViewGroup, parent){
    View mView = convertView;
    //TODO: Check if convertView was null, and inflate
    //      or instantiate if needed.

    //Now we are going to set the data
    mTxt = mView.findViewById(R.id.mTxt);
    if(pos >= 2){
        //If position is 2 or above, we ignore it and take the next item.
        mTxt.setText(this.getItem(pos + 1).toString()); 
    }else{
        //If position is below 2 then we take the current item.
        mTxt.setText(this.getItem(pos).toString());
    }
    return mView;
}

この例は一般化されていることに注意してください。プロジェクトに直接ドロップできるようにするためのものではありません。真実がわからないいくつかのことについて、私は推測をしなければなりませんでした。ただし、ここで示したものと同じ概念を使用して、状況に合わせて変更して、ListView で行を「非表示」にすることができます。

于 2013-03-10T15:55:12.140 に答える