2013年12月31日火曜日

ListFragmentを使ってみる(setListShown)

ListFragmentの事を調べていたらsetListShownというメソッドをハヶ━m9( ゚д゚)っ━ン!!

setListShownを使うと、ListFragmentの表示領域にプログレスを表示することができるそうです。
これを利用してListFragmentの初期化や更新中に、表示させる事で多少見た目は良くなるかも?

■AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.listfragment4"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.listfragment4.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
■activity_main.xml

ListFragmentと同階層に、ボタンを2つ設置してあります。
この2つのボタンを操作する事で、setListShownのON/OFFが切り替わるようにしてあります。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

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

        <Button
            android:id="@+id/show"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="buttonclick"
            android:text="表示" />

        <Button
            android:id="@+id/hide"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="buttonclick"
            android:text="非表示" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>
■MyListFragment.java
package com.example.listfragment4;

import java.util.ArrayList;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class MyListFragment extends ListFragment {

 private static final String TAG = "MyListFragment";
 //
 private ListView mListView = null;
 //
 private ArrayList<String> mList = new ArrayList<String>();
 private ArrayAdapter<String> mAdapter = null;

 /*
  * 親となるActivityの「onCreate」の終了
  * 
  * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle)
  */
 @Override
 public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);

  Log.d(TAG, "onActivityCreated");

  // アダプター生成
  mAdapter = new ArrayAdapter<String>(getActivity(),
    android.R.layout.simple_list_item_1, mList);

  FragmentActivity activity = getActivity();

  // ListViewを取得する
  mListView = getListView();

  /*
   * ヘッダーの作成
   * 
   * 大枠のビューに対してsetLayoutParamsを利用すると、
   * Caused by: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
   * というエラーが発生してしまう・・・orz
   */
  LinearLayout header = new LinearLayout(activity);
  // 縦に並べる
  header.setOrientation(LinearLayout.VERTICAL);

  // TextViewを生成する
  TextView textView = new TextView(activity);
  // 幅、高さの設定
  LinearLayout.LayoutParams layoutTextView = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.MATCH_PARENT,
    LinearLayout.LayoutParams.WRAP_CONTENT);
  textView.setLayoutParams(layoutTextView);
  // 文字の位置の設定
  textView.setGravity(Gravity.CENTER);
  // 文字を設定
  textView.setText("HEADER");
  // フォントサイズ変更
  textView.setTextSize(14.0f);

  // ヘッダーにTextViewを追加する
  header.addView(textView);

  /*
   * フッターの作成
   */
  LinearLayout footer = new LinearLayout(activity);
  // 縦に並べる
  footer.setOrientation(LinearLayout.VERTICAL);

  // TextViewを生成する
  textView = new TextView(activity);
  textView.setLayoutParams(layoutTextView);
  // 文字の位置の設定
  textView.setGravity(Gravity.CENTER);
  // 文字を設定
  textView.setText("FOOTER");
  // フォントサイズ変更
  textView.setTextSize(14.0f);

  // ヘッダーにTextViewを追加する
  footer.addView(textView);

  // setListAdapterの前に設定する
  mListView.addHeaderView(header);
  mListView.addFooterView(footer);

  // アダプターの設定
  setListAdapter(mAdapter);

  //
  mListView.setOnItemLongClickListener(new OnItemLongClickListener() {

   /*
    * アイテムの長押し
    * 
    * @see
    * android.widget.AdapterView.OnItemLongClickListener#onItemLongClick
    * (android.widget.AdapterView, android.view.View, int, long)
    */
   @Override
   public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
     int arg2, long arg3) {
    Log.d(TAG, "onItemLongClick arg2 => " + arg2 + " : arg3 => "
      + arg3);
    return true;
   }
  });

  //
  getListView().setEmptyView(setEmptyItems("EMPTY"));

 }

 /*
  * アイテムの追加
  */
 public void add(String message) {
  Log.d(TAG, "message message" + message);
  mList.add(message);

 }

 /*
  * @see android.support.v4.app.Fragment#onStart()
  */
 public void onStart() {
  super.onStart();
  // getListView().setEmptyView(noItems("EMPTY"));
 }

 /*
  * ListViewにデータが無かった場合に表示するビューの設定
  */
 private TextView setEmptyItems(String text) {

  //
  TextView emptyView = new TextView(getActivity());

  //
  emptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT));

  // 文字列の設定
  emptyView.setText(text);
  // フォントサイズ
  emptyView.setTextSize(12);
  // 非表示にしておく
  emptyView.setVisibility(View.GONE);
  // 中央配置にする
  emptyView.setGravity(Gravity.CENTER_VERTICAL
    | Gravity.CENTER_HORIZONTAL);

  // ListViewの親Viewに追加する
  ((ViewGroup) getListView().getParent()).addView(emptyView);

  return emptyView;
 }

 /*
  * アイテムのクリック
  * 
  * @see
  * android.support.v4.app.ListFragment#onListItemClick(android.widget.ListView
  * , android.view.View, int, long)
  */
 @Override
 public void onListItemClick(ListView listView, View v, int position, long id) {

  Log.d(TAG, "onListItemClick position => " + position + " : id => " + id);

  // クリックされたアイテムを取得する
  String item = (String) listView.getItemAtPosition(position);

  // アイテムの削除
  mAdapter.remove(item);

  // Adapterの更新
  mAdapter.notifyDataSetChanged();

  // ListViewの再描画
  mListView.invalidateViews();

 }

}

■MainActivity.java

ボタンのクリックにsetListShownを実行して表示、非表示を切り替えています。
※setListShownのほかにsetListShownNoAnimationというメソッドもあります。
package com.example.listfragment4;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.view.View.OnClickListener;

public class MainActivity extends FragmentActivity {

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

  // ListFragmentを生成
  final MyListFragment fragment = new MyListFragment();

  // Fragmentを経由してAdapterにデータをセット
  fragment.add("LIST 1");
  fragment.add("LIST 2");
  fragment.add("LIST 3");
  fragment.add("LIST 4");
  fragment.add("LIST 5");
  fragment.add("LIST 6");
  fragment.add("LIST 7");
  fragment.add("LIST 8");
  fragment.add("LIST 9");
  fragment.add("LIST 10");

  // ListFragmentを追加する
  FragmentManager manager = getSupportFragmentManager();
  FragmentTransaction tx = manager.beginTransaction();
  tx.add(R.id.list, fragment, "list_fragment");
  tx.commit();

  Button show = (Button) this.findViewById(R.id.show);
  show.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    fragment.setListShown(true);
   }

  });

  //
  Button hide = (Button) this.findViewById(R.id.hide);
  hide.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    fragment.setListShown(false);
   }

  });

 }

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

}


実行結果は次のようになります。


 非表示を押すとリストが消えてプログレスが表示されます。


以上です(`・ω・´)ゞビシッ!!

気がつけば今年も残り僅か・・・(; ・`д・´)
年越しでAndroidだっ!( ̄ー ̄)bグッ!

参考URL

0 件のコメント:

コメントを投稿