ListFragment のサンプル

画面向きの回転でActivityライフサイクルより、再生成されず、縦横の各々のレイアウトに沿った Fragment の表示は、
XML の Fragment タグを使うよりも Framelayout / LinearLayout などのコンテナとしてレイアウトを用意して、
FragmentTransaction で割り当てた方が簡単に作れる。
リストを表示後、リストの最後にさらに読込みを実行するための選択行を付与するパターンで、サンプルのモデルを書いておくと、後々使い回しに便利である。

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
/**
 * AlphaListFragment
 */

public class AlphaListFragment extends ListFragment{
   List<Alpha> mlist;
   private View mView;

   @Override
   public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setRetainInstance(true);   // 再生を抑止
   }
   @Override
   public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
      setRetainInstance(true);   // 再生を抑止
      if (mView==null){
         mlist = new ArrayList<Alpha>();
         mView = new ListView(getActivity());
         setListAdapter(new ArrayAdapter<Alpha>(getActivity(), 0, mlist){
            @Override
            public View getView(int position, View convertView, ViewGroup parent){
               View view = inflater.inflate(R.layout.nexlist_row, null);
               Alpha data = mlist.get(position);
               // ダミーデータか判定もしくは、最終データの表示か判定して、次の読み込み表示を返す 
               if (data.time==null){
                  // 次の読み込みを表示
                  return inflater.inflate(R.layout.next_continue_row, null);
               }
               // 取得データの表示View

               return view;
            }
         });
         AlphaReadTask task = createAlphaReadTask(0);
         task.execute();
      }
      return mView;
   }
   @Override
   public void onActivityCreated(Bundle savedInstanceState){
      super.onActivityCreated(savedInstanceState);
      setRetainInstance(true);   // 再生を抑止
   }
   @Override
   public void onListItemClick(ListView listview, View view, int position, long id){
      Alpha data = (Alpha)listview.getAdapter().getItem(position);
      // ダミーデータか判定して、次のデータ読込を行う。
      if (data.msg==null){
         // 次のデータ読込
         int size = listview.getAdapter().getCount();
         mlist.remove(size - 1);
         *1.notifyDataSetChanged();
         createAlphaReadTask(size - 1).execute();
      }
   }
   protected AlphaReadTask createAlphaReadTask(int offset){
      return new AlphaReadTask(offset, 10)
{
         @Override
         protected void showProgress(){
            *2.showLoadingView();
         }
         @Override
         protected void onResult(boolean result, List<Alpha> addList){
            if (result){
               mlist.addAll(addList);
               *3.notifyDataSetChanged();
            }
         }
         @Override
         protected void dissmissProgress(){
            *4.dissmissLoadingView();
         }
      };
   }

}
======================

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.os.AsyncTask;
/**
 * AsyncTask の サンプルモデル
 */
public abstract class AlphaReadTask extends AsyncTask<String,Integer,Boolean>{
   protected abstract void showProgress();
   protected abstract void dissmissProgress();
   protected abstract void onResult(boolean result, List<Alpha> addList);

   private int mseqno;
   private int mCount;
   private List<Alpha> list;

   public AlphaReadTask(int offset, int count){
      mseqno = offset + 1;
      mCount = count;
   }
   @Override
   protected void onPreExecute(){
      showProgress();
      list = new ArrayList<Alpha>();
   }
   @Override
   protected Boolean doInBackground(String...params){
      SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss");
      for(int i=0;i < mCount;i++){
         list.add(new Alpha(sf.format(new Date()), "Test Message - "+Integer.toString(mseqno)));
         try{
            Thread.sleep(300);
         }catch(InterruptedException e){
         }
         mseqno++;
      }

       if (mseqno < 100){
        // 100 に達しない場合、ダミーをセット
         list.add(new Alpha(null, null));
      }

      return true;
   }
   @Override
   protected void onPostExecute(Boolean result){
      dissmissProgress();
      onResult(result, list);
   }
}

======================
Activity 側の onCreate で、、、
@Override
protected void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.listfragment_layout);

   if (savedInstanceState==null){
      FragmentTransaction tr = getFragmentManager().beginTransaction();
      tr.add(R.id.container, new AlphaListFragment(), "container");
      tr.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
      tr.commit();
   }
}

レイアウトXML の記述


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

*1:BaseAdapter)getListAdapter(

*2:NextListSampleActivity)getActivity(

*3:BaseAdapter)getListAdapter(

*4:NextListSampleActivity)getActivity(