m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

androidでリストビューをカスタム

レイアウトやデータは多少いろいろしたい

のでちょっと修正する

画面

まずはブランクのアクティビティにリストビューを配置

f:id:m_shige1979:20150102235103p:plain

文字の配列を用意して設定
package jp.mshige1979.app.sampleapplist2;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity {

    private ListView listview;

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

        // 表示用データ
        String[] list = {"aaaa", "bbbb", "cccc", "dddd"};

        // 紐付け
        listview = (ListView)findViewById(R.id.listView);

        // ArrayAdapterへ設定
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                MainActivity.this,
                android.R.layout.simple_expandable_list_item_1,
                list);

        // リストビューへ設定
        listview.setAdapter(adapter);

        // リストをクリック
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // リストビューの項目を取得
                ListView listview = (ListView) parent;
                String item = (String)listview.getItemAtPosition(position);

                // 表示
                Toast.makeText(getApplicationContext(), item, Toast.LENGTH_SHORT).show();

            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
結果

f:id:m_shige1979:20150102235435p:plain

リスト用のレイアウト設定

res/layout/row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="50dp"
    android:weightSum="1">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView2"
        android:layout_weight="0.08" />

</LinearLayout>

※レイアウトリソースを新規に作成して設定
とりあえず、簡単に用意する

データを保持するクラスを作成する

RowDetail.class

package jp.mshige1979.app.sampleapplist2;

/**
 */
public class RowDetail {

    private String title;
    private String detail;

    public void setTitle(String title){
        this.title = title;
    }

    public String getTitle(){
        return this.title;
    }

    public void setDetail(String detail){
        this.detail = detail;
    }

    public String getDetail(){
        return this.detail;
    }

}
新しいアダプターを作成

RowDetailAdapter

package jp.mshige1979.app.sampleapplist2;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.textservice.TextInfo;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.List;

/**
 */
public class RowDetailAdapter extends ArrayAdapter<RowDetail> {

    private LayoutInflater layoutinflater;

    // コンストラクタ
    public RowDetailAdapter(Context context, int textViewResourceId, List<RowDetail> objects){
        super(context, textViewResourceId, objects);
        layoutinflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 指定行のデータを取得
        RowDetail detail = (RowDetail)getItem(position);

        // nullの場合のみ再作成
        if(null == convertView){
            convertView = layoutinflater.inflate(R.layout.row, null);
        }

        // 行のデータを項目へ設定
        TextView text1 = (TextView)convertView.findViewById(R.id.textView);
        text1.setText(detail.getTitle());

        TextView text2 = (TextView)convertView.findViewById(R.id.textView2);
        text2.setText(detail.getDetail());

        // 返却
        return convertView;
    }

}
メインアクティビティを修正
package jp.mshige1979.app.sampleapplist2;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends ActionBarActivity {

    private ListView listview;

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

        // 表示用データ
        List<RowDetail> objects = new ArrayList<RowDetail>();

        RowDetail item1 = new RowDetail();
        item1.setTitle("テスト1");
        item1.setDetail("テスト1の明細データです。");

        RowDetail item2 = new RowDetail();
        item2.setTitle("テスト2");
        item2.setDetail("テスト2の明細データです。");

        RowDetail item3 = new RowDetail();
        item3.setTitle("テスト3");
        item3.setDetail("テスト3の明細データです。");

        RowDetail item4 = new RowDetail();
        item4.setTitle("テスト4");
        item4.setDetail("テスト4の明細データです。");

        objects.add(item1);
        objects.add(item2);
        objects.add(item3);
        objects.add(item4);

        // 紐付け
        listview = (ListView)findViewById(R.id.listView);

        // ArrayAdapterへ設定
        RowDetailAdapter rowAdapater = new RowDetailAdapter(this, 0, objects);

        // リストビューへ設定
        listview.setAdapter(rowAdapater);

        // リストをクリック
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // リストビューの項目を取得
                ListView listview = (ListView) parent;
                RowDetail item = (RowDetail)listview.getItemAtPosition(position);
                
                String text = item.getTitle() + ":" + item.getDetail();
                
                // 表示
                Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();

            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
結果

f:id:m_shige1979:20150103003104p:plain

所感

行の明細がいろいろと変わる場合はこの方法でないといけないようです。
クラスにするかハッシュ化するかで方法は多少変化するようですけど、クラスで対応しておきます。
sqliteなどでデータを保持することで編集画面へ値を渡すことも簡単にできそうな感じ。

覚えることが多いとブログなどにメモすることで当時の状況などを認識できるので復習にも役に立ちそうです。