setOnItemClickListener

setOnItemClickListenerでタップした時の処理

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

        ListView myListView = (ListView) findViewById(R.id.myListView);

        ArrayList<User> users = new ArrayList<>();
        int[] icons = {
                R.mipmap.ic_launcher,
                R.mipmap.ic_launcher,
                R.mipmap.ic_launcher,
        };
        String[] names = {
                "yoshida",
                "kobayashi",
                "igawa"
        };

        String[] locs = {
                "Hamamatsucho",
                "Marunouchi",
                "Ebisu"
        };

        for(int i = 0; i < icons.length; i++){
            User user = new User();
            user.setIcon(BitmapFactory.decodeResource(
                    getResources(),
                    icons&#91;i&#93;
            ));
            user.setName(names&#91;i&#93;);
            user.setLoc(locs&#91;i&#93;);
            users.add(user);
        }
        UserAdapter adapter = new UserAdapter(this, 0, users);
        myListView.setAdapter(adapter);
        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
           @Override
           public void onItemClick(
                   AdapterView<?> adapterView,
                   View view,
                   int i,
                   long l
           ) {
                TextView name = (TextView) view.findViewById(R.id.name);
                Toast.makeText(
                        MainActivity.this,
                        Integer.toString(i) + ":" + name.getText().toString(),
                        Toast.LENGTH_SHORT
                ).show();
                name.setText("Tapped");
           }
        });

    }

こりゃ覚えること多すぎて、思ってたより時間かかりそーだ

classを使ったArrayList

かなり複雑

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

        ListView myListView = (ListView) findViewById(R.id.myListView);

        ArrayList<User> users = new ArrayList<>();
        int[] icons = {
                R.mipmap.ic_launcher,
                R.mipmap.ic_launcher,
                R.mipmap.ic_launcher,
        };
        String[] names = {
                "yoshida",
                "kobayashi",
                "igawa"
        };

        String[] locs = {
                "Hamamatsucho",
                "Marunouchi",
                "Ebisu"
        };

        for(int i = 0; i < icons.length; i++){
            User user = new User();
            user.setIcon(BitmapFactory.decodeResource(
                    getResources(),
                    icons&#91;i&#93;
            ));
            user.setName(names&#91;i&#93;);
            user.setLoc(locs&#91;i&#93;);
            users.add(user);
        }
        UserAdapter adapter = new UserAdapter(this, 0, users);
        myListView.setAdapter(adapter);

    }
    public class UserAdapter extends ArrayAdapter<User>{

        private LayoutInflater layoutInflater;
        public UserAdapter(Context c, int id, ArrayList<User> users){
            super(c, id, users);
            this.layoutInflater = (LayoutInflater) c.getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE
            );
        }
        @Override
        public View getView(int pos, View convertView, ViewGroup parent){
            if (convertView == null){
                convertView = layoutInflater.inflate(
                        R.layout.list_item,
                        parent,
                        false
                );
            }
            User user = (User) getItem(pos);

            ((ImageView) convertView.findViewById(R.id.icon))
                    .setImageBitmap(user.getIcon());
            ((TextView) convertView.findViewById(R.id.name))
                    .setText(user.getName());
            ((TextView) convertView.findViewById(R.id.loc))
                    .setText(user.getLoc());

            return convertView;
        }
    }
    public class User {
        private Bitmap icon;
        private String name;
        private String loc;

        public Bitmap getIcon() {
            return icon;
        }

        public void setIcon(Bitmap icon) {
            this.icon = icon;
        }

        public String getName() {
            return name;
        }

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

        public String getLoc() {
            return loc;
        }

        public void setLoc(String loc) {
            this.loc = loc;
        }
    }

LinearLayoutのリストをつくろう

linearlayoutを入れ子にします。

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

    <ImageView
        android:id="@+id/icon"
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <LinearLayout
        android:layout_weight="1"
        android:orientation="vertical"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        >

        <TextView
            android:id="@+id/name"
            android:text="yamada"
            android:textSize="24sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
        <TextView
            android:id="@+id/loc"
            android:text="tokyo"
            android:textSize="16sp"
            android:textColor="#999999"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />

    </LinearLayout>

</LinearLayout>

azure Web.configで301リダイレクトさせてRSSを取得

Web.configのファイルをつくります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="boj-zh.azurewebsites.net" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^boj-zh\.azurewebsites\.net$" />
                    </conditions>
                    <action type="Redirect" url="http://hpscript.com/rss/rss.xml" redirectType="Permanent" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

boj-zh.azurewebsites.net のwebrootのディレクトリにconfigファイルを置きます。

boj-zh.azurewebsites.netにアクセスすると、http://hpscript.com/rss/rss.xmlにリダイレクトされるようになりました。
では、vagrantから、azureにアクセスして、rssが取得できるか確認してみましょう。
vagrantからazureのアドレスを読みに行きます。

require_once 'vendor/dg/rss-php/src/Feed.php';
$rss = Feed::loadRss('https://boj-zh.azurewebsites.net');

foreach($rss->item as $item){
	echo $item->title ."<br>";
}

問題なくリダイレクトして取れてます。なるほど!

icon付きのListViewを表示する

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

    <ImageView
        android:id="@+id/icon"
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

ArrayListへの配列の追加

javaでarraylistに配列に追加していく。

ArrayList<String> items = new ArrayList<>();
          items.add("マネックスグループ");
          items.add("オウケイウェブ");
          items.add("アカツキ");
          items.add("ジーエヌアイグループ");
          items.add("そーせいグループ");
          items.add("KLab");
          items.add("ブライトパスバイオ");
          items.add("リミックスポイント");
          items.add("ラクオリア創薬");
          items.add("楽天");

rss-phpでも、301リダイレクトのフィードからRSSを取得できるか?

composerでrss-phpを入れます。

[vagrant@localhost app]$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 1.6.5) successfully installed to: /home/vagrant/app/composer.phar
Use it: php composer.phar

[vagrant@localhost app]$ php composer.phar require dg/rss-php
Using version ^1.2 for dg/rss-php
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing dg/rss-php (v1.2): Loading from cache
Writing lock file
Generating autoload files
[vagrant@localhost app]$ ls
composer.json  composer.lock  composer.phar  index.php  vendor

rss-phpでfetchします。

require_once 'vendor/dg/rss-php/src/Feed.php';
$rss = Feed::loadRss('http://hpscript.com/rss/rss.xml');

foreach($rss->item as $item){
	echo $item->title ."<br>";
}

301リダイレクトを設定しているURLをfetchします。

require_once 'vendor/dg/rss-php/src/Feed.php';
$rss = Feed::loadRss('http://phone-search.online/test/index.php');

foreach($rss->item as $item){
	echo $item->title ."<br>";
}

OK つまり、301リダイレクトで、フィードのURLが変わっても、旧URLに301リダイレクトをかけている間は、新URLのフィードを取得できる。

rssフィードのurlが移転したときに、301リダイレクトで取得

xmlファイルをつくります。

<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>HPScript</title>
<link>http://hpscript.com/rss/test.xml</link>
<description>hpscriptのRSSです</description>
<language>ja-JP</language>
<item>
<guid isPermaLink="false"></guid>
<link>
SCSK
</link> <title>scsk</title> <description/> </item> <item> <guid isPermaLink="false"></guid> <link>
JBS
</link> <title>jbs</title> <description/> </item> </channel> </rss>

vagrantでphpファイルをつくって取得する。

$rss = simplexml_load_file('http://hpscript.com/rss/rss.xml');

foreach($rss->channel->item as $item){
	echo $item->title ."<br>";
}

モチ、ここまではOK

hpscript.com/rss/のディレクトリに.htaccessで301リダイレクトを書きます。

RewriteEngine on
RewriteRule ^index.php$ http://hpscript.com/rss/rss.xml [R=301,L]

http://hpscript.com/rss/index.php をたたくと、http://hpscript.com/rss/rss.xmlに301リダイレクトします。

では、vagrant側で、index.phpをfetchした場合。

$rss = simplexml_load_file('http://hpscript.com/rss/index.php');

foreach($rss->channel->item as $item){
	echo $item->title ."<br>";
}

取れてます!

では、下層ディレクトリから301リダイレクトをした場合。corpというディレクトリをつくり、301リダイレクトの設定をします。
下層ディレクトリでも全く同じで、301リダイレクトをすれば、取得できました。

RewriteEngine on
RewriteRule ^old.php$ http://hpscript.com/rss/rss.xml [R=301,L]

では、異なるドメインから301リダイレクトをした場合を考えたい。
http://phone-search.online/ というurl(電話のサービスづくりで取得したドメイン)にtestというディレクトリをつくり、同じように、301ディダイレクト設定を行う。

RewriteEngine on
RewriteRule ^old.php$ http://hpscript.com/rss/rss.xml [R=301,L]

phone-search.online/test/index.phpからfetchすると、

$rss = simplexml_load_file('http://phone-search.online/test/index.php');

foreach($rss->channel->item as $item){
	echo $item->title ."<br>";
}

ドメインが変わっても、301リダイレクトで取れている。
つまり、RSSのドメインが変わっても、旧URLに301リダイレクトが設定できれば、新しいURLのRSS取得はできる。

simplexml_load_file以外でもいけるか試したい。

Layout resource file

app -> res -> layout から新規にresource layout fileを作成します。

list_item.xmlを編集します。TextViewにして、layout_heightをwrap_contentにします。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:padding="16dp"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

</TextView>

MainActivityでデータを用意する。
adapterの設定が必要
Adapter – ArrayAdapter

データを準備する。

ArrayList items = new ArrayList<>();
        for (int i = 0; i < 30; i++){
            items.add("item-" + i);
        }

1.findViewById(R.id.myListView)で、idがmyListViewを取得します。
2.ArrayList<>()を定義します。
3.ArrayAdapterで定義する。
4.setAapter(adapter)でつなげる。

ListView myListView = (ListView) findViewById(R.id.myListView);


        ArrayList<String> items = new ArrayList<>();
        for (int i = 0; i < 30; i++){
            items.add("item-" + i);
        }

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                R.layout.list_item,
                items
        );

        myListView.setAdapter(adapter);

build runします。
はぁぁああああ?

listViewをつくろう

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

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

</LinearLayout>

何故かpreviewにitemlistが表示されている。何故だ?