タイトルとして、フラグメントのカスタム行を使用してリストビューを作成します。以下の私のコード。
フラグメントクラス
public class PhotosFragment extends Fragment{
public PhotosFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_photos, container, false);
ArrayList<ListviewContactItem> listContact = GetlistContact();
ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact);
lv.setAdapter(new ListviewContactAdapter(getActivity(), listContact));
return rootView;
}
private ArrayList<ListviewContactItem> GetlistContact(){
ArrayList<ListviewContactItem> contactlist = new ArrayList<ListviewContactItem>();
ListviewContactItem contact = new ListviewContactItem();
contact.SetName("Topher");
contact.SetPhone("01213113568");
contactlist.add(contact);
contact = new ListviewContactItem();
contact.SetName("Jean");
contact.SetPhone("01213869102");
contactlist.add(contact);
contact = new ListviewContactItem();
contact.SetName("Andrew");
contact.SetPhone("01213123985");
contactlist.add(contact);
return contactlist;
}
}
アダプタークラス
public class ListviewContactAdapter extends BaseAdapter{
private static ArrayList<ListviewContactItem> listContact;
private LayoutInflater mInflater;
public ListviewContactAdapter(Context photosFragment, ArrayList<ListviewContactItem> results){
listContact = results;
mInflater = LayoutInflater.from(photosFragment);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listContact.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return listContact.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if(convertView == null){
convertView = mInflater.inflate(R.layout.contact_item, null);
holder = new ViewHolder();
holder.txtname = (TextView) convertView.findViewById(R.id.lv_contact_item_name);
holder.txtphone = (TextView) convertView.findViewById(R.id.lv_contact_item_phone);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtname.setText(listContact.get(position).GetName());
holder.txtphone.setText(listContact.get(position).GetPhone());
return convertView;
}
static class ViewHolder{
TextView txtname, txtphone;
}
}
しかし、何も表示しないアプリを実行すると。誰がここで何が間違っているのか教えてください、どうすれば修正できますか?
NullPointerException
が原因でアプリがクラッシュしたと思います。
これを変える
ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact);
に
ListView lv = (ListView)rootView.findViewById(R.id.lv_contact);
リストビューがフラグメントレイアウトに属すると仮定します。
コードの残りは大丈夫に見える
編集:
あなたはそれが機能していないと言ったので、私はそれを自分で試しました
ListFragment
を使用してください。そうしないと、機能しません。
編集1:次に、必要なのはsetListAdapter()
とgetListView()
だけです。
フラグメントのビューが挿入される親ViewGroup
レイアウトXMLファイルから拡張されたフラグメントのビューを親ViewGroupに挿入する必要があるかどうかを示す3番目のブール値。
この場合、Viewは、Androidを呼び出すコードの一部(つまり、背中の後ろ))によって親ViewGroupに接続されるため、falseを渡します。 inflate()の最後のパラメーター、親ViewGroupは、膨張したビューのレイアウト計算に引き続き使用されるため、親ViewGroupとしてnullを渡すことはできません。
View rootView = inflater.inflate(R.layout.fragment_photos, container, false);
したがって、ここでrootView
を呼び出す必要があります
ListView lv = (ListView)rootView.findViewById(R.id.lv_contact);
あなたが与える必要があります:
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
}
内部フラグメント。
代わりに:
public class PhotosFragment extends Fragment
次を使用できます。
public class PhotosFragment extends ListFragment
方法を変える
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ArrayList<ListviewContactItem> listContact = GetlistContact();
setAdapter(new ListviewContactAdapter(getActivity(), listContact));
}
onActivityCreatedはvoidであり、onCreateViewのようにビューを返す必要はありませんでした
あなたは例を見ることができます here