画面向きの回転で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>