web-dev-qa-db-ja.com

フラグメントにリストビューを作成android

タイトルとして、フラグメントのカスタム行を使用してリストビューを作成します。以下の私のコード。

フラグメントクラス

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;
}
}

しかし、何も表示しないアプリを実行すると。誰がここで何が間違っているのか教えてください、どうすれば修正できますか?

26
gamo

NullPointerExceptionが原因でアプリがクラッシュしたと思います。

これを変える

ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact);

ListView lv = (ListView)rootView.findViewById(R.id.lv_contact);

リストビューがフラグメントレイアウトに属すると仮定します。

コードの残りは大丈夫に見える

編集:

あなたはそれが機能していないと言ったので、私はそれを自分で試しました

enter image description here

40
Raghunandan

ListFragmentを使用してください。そうしないと、機能しません。

編集1:次に、必要なのはsetListAdapter()getListView()だけです。

4
Julisch

Inflate()メソッドは3つのパラメーターを取ります。

  1. レイアウトXMLファイルのID(R.layout内)、
  2. フラグメントのビューが挿入される親ViewGroup

  3. レイアウト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);
2
IntelliJ Amiya

あなたが与える必要があります:

public void onActivityCreated(Bundle savedInstanceState)    
{
  super.onActivityCreated(savedInstanceState);
}

内部フラグメント。

2
user3936680

代わりに:

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

0
VictorPurMar