18012


ListViewに対して内部的に作成した配列をtextViewに入れて表示をさせているのですが、更なる疑問が上がってきたので質問させていただきます。簡潔に言うと、動的に複数のtextをListView上に配置したい、というものです。  
前回の質問→[アンドロイドのListViewの背景について](https://ja.stackoverflow.com/questions/17845/%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AD%E3%82%A4%E3%83%89%E3%81%AElistview%E3%81%AE%E8%83%8C%E6%99%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

AndroidSDKのsimple_list_item_multiple_choiceから自作したcustom_row.xmlを用いることにしました。  
現状ArrayAdapter(context,int resource,int textViewResourceId,ArrayList)
を用いており、第三引数にtextViewのIDを指定しています。その為、第三引数のtextViewのみが動的に動く形となっています。これを複数に増やしたいのですが、最も良い方法を探しております。自分の乏しい知識を駆使して調べたこと、考えたことを以下に箇条書きで記しておきます。

・引数が一つしか取れないことが問題である。  
→ArrayAdapter ではないAdapterを実装する必要がある？⇒SimpleAdapterも考えました。  
→動的に配置したい配列を二次元配列にする⇒対応するtextViewに上手く入れることができない。  
・HashMapを用いてkeyとvalueをタグ付けして持ってくる  
⇒並列するものが関連性の低いものなのでマップで関連付けするのはできれば避けたい。

どうぞ、よろしくお願いします。  
以下に作ったコードを記しておきます。

[code]

    MainActivity.java
    
     public class MainActivity extends AppCompatActivity {
    
     final String[]  baseArray ={"ApplePie", "BananaBread", "CupCake", "Donut", "Eclair", "Froyo",
     "GingerBread", "Honeycomb", "IcecreamSandwich","JellyBean", "KitKat", "Lollipop", "Marshmallow", "Nougat", "Oreo", "Popcorn"};
     ListView list1;
     Button btn1;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {Snackbar.make(view, "Replace with your own action",Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    
        findView();
        ArrayAdapter<String> adapter = new MyAdapter(getApplicationContext(),
        R.layout.custom_row,R.id.custom_row_textview2,baseArray);
    
    
    
        list1.setAdapter(adapter);
        list1.setScrollingCacheEnabled(true);
    
        }
        @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);
        }
    
    public void findView() {
    
        btn1 = (Button) findViewById(R.id.button1);
        list1 = (ListView) findViewById(R.id.listView1);
    
    
      }
    }
    
[/code]

MyAdapter.java

[code]

    public class MyAdapter extends ArrayAdapter {
     public MyAdapter(Context context,int resource,int textViewResourceId,String[] objects){
        super(context,resource,textViewResourceId, objects);
    
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
    
         if (position % 2 == 0) {
            view.setBackgroundColor(Color.rgb(100, 100, 100));
        } else {
            view.setBackgroundColor(Color.rgb(170,170,170));
        }
        return view;
     }
    }
    
[/code]

custom_row.xml

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@drawable/list_item">
    
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:focusable="false"
        />
    <TextView
        android:id="@+id/custom_row_textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="18sp"
        android:text="gender"
        android:padding="8dp"
        android:textColor="#ff0acc"
        />
    <TextView
        android:id="@+id/custom_row_textview2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="20sp"
        android:padding="10dp"
        android:textColor="#ff0022"/>
    
    <TextView
        android:id="@+id/custom_row_textview3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:padding="10dp"
        android:textColor="#2050ff"
        android:textSize="15sp"
        android:text="phoneNumber"/>
    
    </LinearLayout>
    
[/code]


CC BY-SA 3.0
2015-10-23T07:38:38.493
17977
2015-10-27T03:18:29.197
2017-04-13T12:52:39.113
-1
12789
question
android java android-studio android-listfragment
ListViewのTextView動的獲得について


ArrayAdapter
では複数のテキストを使うには向かないので、SimpleAdapterを使うかBaseAdapterを直接継承してAdapterを作ることになるかと思います。

SimpleAdapter の場合は、データをMap の List として渡す必要があり、またMapのキーは各ListItem
ごとに変えるといったことはできません。もしListItem 毎に異なるキーを使いたいとか、そもそもMapには入れたくないのであれば BaseAdapter
を継承するのが良さそうに思います。


CC BY-SA 3.0
2015-10-24T03:35:01.330
18012
2015-10-24T03:35:01.330
319
17977
answer


inflateしなおしてArrayAdapter継承という方法もあります。修正の程度にもよりますが、最低限getViewのオーバライドだけなので、最初のうちはやりやすいと思います。

[code]

    class MyAdapter extends ArrayAdapter<String> {
        public MyAdapter(Context context) {
            super(context, R.layout.custom_row);
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                LayoutInflater inflater = getLayoutInflater();
                convertView = inflater.inflate(R.layout.custom_row,
                        null);
            }
    
            // ゴニョゴニョ...
    
            return convertView;
        }
    }
    
[/code]


CC BY-SA 3.0
2015-10-27T03:18:29.197
18108
2015-10-27T03:18:29.197
12988
17977
answer