ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
Android : Data Binding( ListView と ViewSwitcher の次画面 ) + Include 画面 + Firebase
日時: 2016/10/04 18:05
名前: lightbox



activity_main.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">

    <data>
        <variable name="user" type="sample.lightbox.myapplication.User"/>
        <variable name="item" type="sample.lightbox.myapplication.Item"/>
    </data>

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

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="10dp">

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/buttonFirebase"
                android:text="@string/button_2"/>

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/buttonSetValue"
                android:text="@string/button_1"/>

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

        <include
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            layout="@layout/myitem_entry"
            bind:user="@{user}"
            bind:item="@{item}"/>

    </ViewSwitcher>
</layout>
myitem.xml ▼ ListView 用の画面定義
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="item" type="sample.lightbox.myapplication.Item"/>
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp">

        <TextView
            android:text="@{item.title}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView3"/>

        <TextView
            android:text="@{item.text}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/text1"
        />
    </LinearLayout>
</layout>
myitem_entry.xml ▼ ViewSwitcher の次画面
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable name="user" type="sample.lightbox.myapplication.User"/>
        <variable name="item" type="sample.lightbox.myapplication.Item"/>
    </data>

    <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:padding="16dp">

        <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:textSize="26dp"
              android:text="@{user.firstName}"
              android:id="@+id/textView"/>

        <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:textSize="26dp"
              android:text="@{user.lastName}"
              android:id="@+id/textView2"/>

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

            <Button
                android:text="@string/button_3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/buttonBack"/>

            <Button
                android:text="@string/button_4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/buttonUpdate"
                android:layout_weight="1"/>
        </LinearLayout>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="@{item.title}"
            android:ems="10"
            android:id="@+id/editTextName"/>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="@{item.text}"
            android:ems="10"
            android:id="@+id/editTextFuri"/>

    </LinearLayout>
</layout>
メンテナンス

MainActivity ( No.1 )
日時: 2016/10/04 18:18
名前: lightbox


日時: 2016/10/04 18:18
名前: lightbox
public class MainActivity extends Activity {

	private FirebaseDatabase database;
	private DatabaseReference mDatabase;
	private ArrayList<Item> userList;
	private User user;
	private ListView listView;
	private int targetPosition;
	private ActivityMainBinding binding;
	private NextViewAction nva;
	private ItemArrayAdapter adapter;
	private ViewSwitcher vs;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 処理の中心となるインスタンスの取得
		database = FirebaseDatabase.getInstance();
		mDatabase = database.getReference();
		binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

		// 初期データをバインドでセット
		user = new User();
		user.setFirstName("山田");
		user.setLastName("タロウ");
		// User のみセット
		binding.setUser(user);

		// 次画面の処理を別クラスで
		nva = new NextViewAction(MainActivity.this,database,mDatabase,binding);
		nva.initAction();

		// ViewSwitcher のアニメーション
		vs = (ViewSwitcher) MainActivity.this
			.findViewById(R.id.viewSwitcher);
		vs.setInAnimation(AnimationUtils.loadAnimation(
			MainActivity.this, android.R.anim.fade_in));
		vs.setOutAnimation(AnimationUtils.loadAnimation(
			MainActivity.this, android.R.anim.fade_out));


		// ListView のアダプタ
		adapter = new ItemArrayAdapter( MainActivity.this, R.layout.myitem );

		// ListView
		listView = ((ListView)MainActivity.this.findViewById(R.id.listView));
		listView.setAdapter(adapter);

		// 行から次画面
		listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				targetPosition = position;

				ItemArrayAdapter adapter = (ItemArrayAdapter)parent.getAdapter();
				// この時点で次画面に Item の値がセットされる
				binding.setItem( adapter.getItem(position) );

				vs.showNext();
			}
		});

		// Firebase Database より読み込み
		Button buttonFirebase = (Button) MainActivity.this.findViewById(R.id.buttonFirebase);
		buttonFirebase.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				mDatabase.child("class")
					.orderByChild("code")
					.addListenerForSingleValueEvent(new ValueEventListener() {
					@Override
					public void onDataChange(DataSnapshot dataSnapshot) {
						if ( dataSnapshot.exists() ) {
							Log.i("lightbox", dataSnapshot.getValue().toString());

							userList = new ArrayList<Item>();

							Iterator<DataSnapshot> child
								= dataSnapshot.getChildren().iterator();
							while(child.hasNext()) {

								DataSnapshot next = child.next();
								Item item = next.getValue(Item.class);
								Log.i("lightbox",item.getCode()+"/"+item.getName());

								userList.add(item);
							}

							adapter.clear();
							adapter.addAll(userList);

						}
						else {
							Log.i("lightbox","データを読み込めませんでした");
						}
					}

					@Override
					public void onCancelled(DatabaseError databaseError) {
						Log.i("lightbox","onCancelled");
						databaseError.toException().printStackTrace();
					}
				});
			}
		});

		// ボタンを押して、オブジェクトの変更のみで反映されます
		Button buttonSetValue = (Button) MainActivity.this.findViewById(R.id.buttonSetValue);
		buttonSetValue.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				user.setFirstName("鈴木");
				user.setLastName("ジロウ");
				if ( userList != null ) {
					userList.get(0).setText("getView での記述が簡単になりました");
					userList.get(1).setText("しかも、オブジェクトを変更すると ListView も変わります");
				}
			}
		});
	}
}
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
ItemArrayAdapter ( No.2 )
日時: 2016/10/04 18:19
名前: lightbox
public class ItemArrayAdapter extends ArrayAdapter<Item> {

	private int mResource;

	public ItemArrayAdapter(Context context, int resource) {
		super(context, resource);
		this.mResource = resource;
	}

	@NonNull
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		MyitemBinding myitem;

		if ( convertView == null ) {
			LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService
				(Context.LAYOUT_INFLATER_SERVICE);
			myitem = DataBindingUtil.inflate(inflater, mResource, parent, false);
		}
		else {
			myitem = DataBindingUtil.getBinding(convertView);
		}

		ListView lv = (ListView)parent;
		ItemArrayAdapter iaa = (ItemArrayAdapter)lv.getAdapter();
		myitem.setItem( iaa.getItem(position) );

		// ここが重要です
		return myitem.getRoot();
	}
}
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
NextViewAction ( No.3 )
日時: 2016/10/04 18:20
名前: lightbox
public class NextViewAction {

	private MainActivity context;
	private FirebaseDatabase database;
	private DatabaseReference mDatabase;
	private ActivityMainBinding binding;

	public NextViewAction(MainActivity context, FirebaseDatabase database, DatabaseReference mDatabase, ActivityMainBinding binding ) {
		this.context = context;
		this.mDatabase = mDatabase;
		this.binding = binding;
		this.database = database;
	}

	public void initAction(){

		Button buttonBack = (Button) context.findViewById(R.id.buttonBack);
		buttonBack.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				ViewSwitcher vs = (ViewSwitcher) context.findViewById(R.id.viewSwitcher);
				vs.showPrevious();
			}
		});

	}


}
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
User クラスと Item クラス ( No.4 )
日時: 2016/10/04 18:25
名前: lightbox
User
public class User extends BaseObservable {

	private String firstName;
	private String lastName;

	@Bindable
	public String getFirstName() {
		return this.firstName;
	}
	@Bindable
	public String getLastName() {
		return this.lastName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
		notifyPropertyChanged(sample.lightbox.myapplication.BR.firstName);
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
		notifyPropertyChanged(sample.lightbox.myapplication.BR.lastName);
	}

}
Item バインドと Firebase で使用
public class Item extends BaseObservable {
	private String title;
	private String text;
	private boolean flg = false;

	public Item() {}

	public Item(String text,String title) {
		this.text = text;
		this.title = title;
	}

	@Bindable
	public String getText() {
		return this.text;
	}
	@Bindable
	public String getTitle() {
		return this.title;
	}

	public void setText(String text) {
		this.text = text;
		notifyPropertyChanged(sample.lightbox.myapplication.BR.text);
	}

	public void seTitle(String title) {
		this.title = title;
		notifyPropertyChanged(sample.lightbox.myapplication.BR.title);
	}

	public String getCode() {
		return title;
	}
	public String getName() {
		return text;
	}
	public void setCode(String code) {
		this.title = code;
	}
	public void setName(String name) {
		this.text = name;
	}

}
このアーティクルの参照用URLをクリップボードにコピー メンテナンス