2011-01-25 11 views
3

私はこの問題をプロジェクトの全期間を通じて解決しています。プロジェクトには多くのリストがあり、そのほとんどにヘッダーがあります。私は別のレイアウトファイルを作成してaddHeaderView()を使ってリストに追加しています。問題は、データ(ArrayList、私の場合)が空の場合、ヘッダーが表示されないことです。ヘッダーレイアウトを空のビューとして再利用する方法を何時間も探してから、私はあきらめて、コードでレイアウトを複製し、setEmptyView()を使用して空のビューとして割り当てました。この問題は、多くのヘッダーにクリック可能なビューが含まれているため、複製されるすべてのビューに対してクリック可能なロジックを2倍にする必要があります。私は前にヘッダーを含めようとしましたが失敗しました。なぜなら、レイアウトがどのように膨らんでいるかをまだよく分かっていないからです。Androidリストビューの空のビューとしてヘッダーレイアウトを再利用する方法

最後に、私はコミュニティと共有したい解決策を思いつきました。他のケースでも同様の問題が発生しています。私はこれがこの問題を解決する最良の方法であるかどうかわからないし、フィードバックや提案は間違いなく歓迎されるだろう。ここ

は、リストのリストビューを含むレイアウト用のコードです:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
> 
    <ListView 
     android:id="@+id/lv_my_list" 
     style="@style/ListStyle" 
     android:headerDividersEnabled="false" 
    /> 
    <include 
     layout="@layout/my_list_header" 
     android:id="@+id/my_list_empty" 
    /> 
</LinearLayout> 

スタイルは、他のものの間でレイアウトの幅と高さを定義します。

今私はヘッダビュー

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:id="@+id/my_list_header" 
> 
    <Button 
     android:id="@+id/my_list_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Click Me" 
    /> 
</LinearLayout> 

が含まれているレイアウトファイルを持って、私はのLinearLayoutは非常に効率的ではありません知っていると私はマージ使用したり、他の効率化対策を試していますが、これはそう働く最初のバージョンであります私は今それと一緒に行くつもりです。最後にコード:

// set up the header 
myListView = (ListView)findViewById(R.id.lv_my_list); 
View header = View.inflate(this, R.layout.my_list_header, null); 
Button b = (Button)header.findViewById(R.id.my_list_button); 
b.setOnClickListener(this); 
myListView.addHeaderView(header); 

// set up the empty view   
LinearLayout ll = (LinearLayout)findViewById(R.id.my_list_empty); 
b = (Button)ll.findViewById(R.id.my_list_button); 
b.setOnClickListener(this); 
meLocalListView.setEmptyView(ll); 

IはOnClickListenerとしてこれを使用するには、ボタンの各インスタンスを設定し、単一のIDとそれらの両方を指すことができるので、私はレイアウトのボタンを包んだ理由である。R.私のonClickメソッドのid.my_list_button私はこれをさらに多くテストする必要がありますが、今のところうまくいくようです。私はすべての私のリストにまだそれを実装していないので、それはすべての状況で動作しない可能性があります。何か提案があれば、これは私にとって長い間今問題だったので、私に知らせてください。 1つの問題は、IDからボタンをインスタンス化する場合は、正しいIDにアクセスするためにこのプロセス全体を再度実行しなければならない可能性があるということです。

+0

ここには、ソリューション - > http:// stackoverflowがあります。com/a/34557372/542532 – Sadegh

答えて

1

リストが空のときにListViewのヘッダーを表示する場合は、別の空のビューではなくリスト自体を表示します。だから、最も簡単な方法は、あなたのリストが空であるかどうかをチェックし、それがまだない場合は目に見えるリストを設定することです:

getListView().setVisibility(View.VISIBLE); 

次のコードで非常に簡単にこれをテストすることができます

public class TestListActivity extends ListActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test_listview); 

     // create the empty grid item mapping 
     String[] from = new String[] {}; 
     int[] to = new int[] {}; 

     // prepare the empty list 
     List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>(); 

     // fill in the grid_item layout 
     SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, R.layout.test_listitem, from, to); 

     View listHeader = 
       ((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)) 
       .inflate(R.layout.test_listheader, null, false); 

     getListView().addHeaderView(listHeader); 
     getListView().setAdapter(adapter); 
    } 
} 

リストは空ですが、ヘッダーは表示されます。

+3

コードサンプルでリストビューの可視性をどこに設定しますか? – tbruyelle

0

私の解決策は、ヘッダーのレイアウトでビューを作成するが、背景をリストアイテムと同じにすることです。 アンドロイド:背景=「@アンドロイド:描画可能/ list_selector_background」

しかし、私は別のレイアウトファイルからヘッダーレイアウトを埋め込むこと「を含む」を使用している場合、私の解決策は動作しません。なぜだか分からない。

関連する問題