Android ListViewの中に、ヘッダーとコンテンツを入れて一緒にスクロールするサンプル

<strong><font color="DeepPink">
ListViewの中に、ヘッダーとコンテンツを入れて一緒にスクロールするサンプル
Android Studio 2.3.2
</font>
</strong>


![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/0d88e46c-a4b7-da79-7764-3a8cfd534100.png)
![002.png](https://qiita-image-store.s3.amazonaws.com/0/93155/2f0f5581-297d-e9fd-f69a-87b84bccf9de.png)
![003.png](https://qiita-image-store.s3.amazonaws.com/0/93155/6a70002b-76b6-faa0-2a83-10d1e9953239.png)
![004.png](https://qiita-image-store.s3.amazonaws.com/0/93155/e46de8c7-8d27-06c3-5d75-9743a9fd9041.png)

![005.png](https://qiita-image-store.s3.amazonaws.com/0/93155/3969cfa7-b5c7-43f0-153d-b0b9a6597ab1.png)


```Java:MainActivity
package com.example.non.nonsample;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;

/**
 * MainActivity
 */
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
    //コンテンツ内容
    private List<ContentsData> contentsDataList;
    //先頭行セルimage
    private ImageData imageData;
    //メインのリストビュー
    private ListView mainListView;
    //Click時のURL
    private String HEADER_URL = "http://book.geocities.jp/nonpipo/index.html";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //メインのリストビュー
        mainListView = (ListView)findViewById(R.id.main_listView);

        //リスト内のコンテンツ
        contentsDataList= new ArrayList<>();
        ContentsData contentsData = new ContentsData();
        for(int i =0; i < 20; i++) {
            contentsData = new ContentsData();
            contentsData.setName("test:" + i);
            contentsDataList.add(contentsData);
        }

        //先頭行セルimageセット
        Bitmap nonicon_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.smal_noncoin);
        imageData = new ImageData();
        imageData.setImage(nonicon_bitmap);
        imageData.setTargetUrl(HEADER_URL);

        //Adapter
        NonAdapter nonadapter = new NonAdapter(this.getApplicationContext(),contentsDataList,imageData);
        mainListView.setAdapter(nonadapter);
        //ClickListener
        mainListView.setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
       if(position == 0){
           //先頭行セルClickのみ外部ブラウザで起動する
           startExternalBrowser();
       }
    }

   /**
    * startExternalBrowser 外部ブラウザで起動する
    */
    public void startExternalBrowser(){
        Log.d("MainActivity","startExternalBrowser start");
        try{
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(imageData.getTargetUrl()));
            intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
            startActivity(intent);
        }catch(Exception e){
            Log.e("startExternalBrowser","Exception:" + e);
        }
    }

}
```


```Java:NonAdapter
package com.example.non.nonsample;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;

/**
 * NonAdapter
 */
public class NonAdapter extends BaseAdapter{
    private Context context;
    private List<ContentsData> contentsDataList;
    private ImageData imageData;
    //viewの数（ヘッダーとコンテンツの２種類）
    private int viewCount = 0;
    //ヘッダー行の数（1行）
    private int headerCount = 0;
    //コンテンツ行の数
    private int contentsCount = 0;
    //全ての行数(ヘッダー行とコンテンツ行の合計行数)
    private int all_dataCount = 0;
    private LayoutInflater inflater;
    private enum ViewTypeMode {
        HEADER, //
        CONTENTS //
        ;
    }

    /**
     * NonAdapter
     * @param context
     * @param para_contentsData
     * @param para_imageData
     */
    public NonAdapter(Context context, List<ContentsData> para_contentsData,ImageData para_imageData) {
        super();
        this.context = context;
        //引数 コンテンツデータ
        contentsDataList = para_contentsData;
        //引数 ヘッダーデータ
        imageData = para_imageData;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(imageData != null){
            headerCount = 1;
            viewCount = 1;
        }

        if(contentsDataList.size() > 0){
            contentsCount = contentsDataList.size();
            viewCount ++;
        }
        all_dataCount = headerCount + contentsCount;
    }

    /**
     * @return viewの種類数（ヘッダーとコンテンツの２つ）
     */
    @Override
    public int getViewTypeCount(){
        return viewCount;
    }

    /**
     *
     * @return 全ての行数
     */
    @Override
    public int getCount() {
        return all_dataCount;
    }

    /**
     * itemのタイプ
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        return position == 0 ? ViewTypeMode.HEADER.ordinal() : ViewTypeMode.CONTENTS.ordinal();
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    /**
     * @param position
     * @param view
     * @param viewGroup
     * @return
     */
    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {

        //viewのType
        int viewType = getItemViewType(position);


        if(viewType == ViewTypeMode.HEADER.ordinal()) {
            //Header
            if(view == null || (Integer)view.getTag() == ViewTypeMode.CONTENTS.ordinal()) {
                //viewが変わったら再設定する
                view = setHeaderView(view, viewType);
            }
            //ヘッダー行を設定する
            ImageView imageView =(ImageView) view.findViewById(R.id.lead_imageView);
            imageView.setImageBitmap((Bitmap) imageData.getImage());

        }else{
            //ヘッダーを引いた位置
            int index = position - headerCount;
            //Contents
            if(view == null || (Integer)view.getTag() == ViewTypeMode.HEADER.ordinal()) {
                //viewが変わったら再設定する
                view = setContentsView(view, viewType);
            }
            //コンテンツ行を設定する
            TextView contentsView =(TextView) view.findViewById(R.id.contents_cell_text_view);
            ContentsData contentsData = contentsDataList.get(index);
            contentsView.setText(contentsData.getName());
            contentsView.setTextColor(Color.BLACK);
        }

        return view;
    }

    /**
     * setHeaderView ヘッダーview設定
     * @param view
     * @param viewType
     * @return
     */
    private View setHeaderView(View view,int viewType){
        view = inflater.inflate(R.layout.lead_cell, null);
        view.setTag(ViewTypeMode.HEADER.ordinal());
        return view;
    }

    /**
     * setContentsView コンテンツview設定
     * @param view
     * @param viewType
     * @return
     */
    private View setContentsView(View view,int viewType){
        view = inflater.inflate(R.layout.contents_cell, null);
        view.setTag(ViewTypeMode.CONTENTS.ordinal());
        return view;
    }

}
```



```Java:ContentsData
package com.example.non.nonsample;

/**
 * ContentsData
 */
public class ContentsData {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

```


```Java:ImageData
package com.example.non.nonsample;

import android.graphics.Bitmap;

/**
 * ImageData
 */
public class ImageData {
    // image
    private Bitmap image;
    // 外部ブラウザ起動先URL
    private String targetUrl;

    public Bitmap getImage() {
        return image;
    }

    public void setImage(Bitmap image) {
        this.image = image;
    }

    public String getTargetUrl() {
        return targetUrl;
    }

    public void setTargetUrl(String targetUrl) {
        this.targetUrl = targetUrl;
    }
}

```

```XML:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.non.nonsample.MainActivity">

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent">

      <ListView
          android:id="@+id/main_listView"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
      </ListView>
  </LinearLayout>

</android.support.constraint.ConstraintLayout>

```


```XML:contetns_cell.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:id ="@+id/contents_cell_layout"
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView
            android:id="@+id/contents_cell_text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textSize="30dp"
            android:textStyle="bold" />
    </RelativeLayout>
</LinearLayout>
```

```XML:lead_cell.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:id ="@+id/lead_cell_layout"
        android:layout_width="fill_parent"
        android:layout_height="50dp">
       <ImageView
           android:id="@+id/lead_imageView"
           android:scaleType="fitXY"
           android:layout_width="match_parent"
           android:layout_height="match_parent"/>
    </RelativeLayout>
</LinearLayout>
```