2016-03-24 12 views
-1

私はAndroidプログラミングで新しいので、カスタムListViewを作成しようとしています。私はYouTube(https://www.youtube.com/watch?v=gAIB4fTm2BA)のチュートリアルに従いますが、私はそれを断片的に処理することはできません。フラグメント内のカスタムリスト

public class DriverFragment extends Fragment implements GeneralFragment { 

ListView listView; 
public DriverFragment() { 

    // Required empty public constructor 
} 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view; 
    view = inflater.inflate(R.layout.fragment_driver, container, false); 
    listView = (ListView) view.findViewById(R.id.driverList); 
    DriverAdapter driverAdapter = new DriverAdapter(getActivity().getApplicationContext(),R.layout.driver_listview); 
    listView.setAdapter(driverAdapter); 
    Driver a = new Driver("John Smith","[email protected]","123"); 

    driverAdapter.add(a); 

    return view; 
} 

ドライバーアダプタ:あなたは罰金である、それに何かを追加する前に、リストビューへのアダプタを設定しているよう

public class DriverAdapter extends ArrayAdapter { 
ArrayList list = new ArrayList(); 

public DriverAdapter(Context context, int resource) { 
    super(context, resource); 
} 


static class Holder{ 
    TextView NAME; 
    TextView EMAIL; 
    TextView PHONE; 
} 
public void add(Driver driver) { 
    list.add(driver); 
    super.add(driver); 

} 

@Override 
public Object getItem(int position) { 
    return this.list.get(position); 
} 

public int getCount(){ 
    return this.list.size(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row; 
    row = convertView; 
    Holder holder; 
    if(convertView == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = layoutInflater.inflate(R.layout.driver_listview, parent, false); 
     holder = new Holder(); 
     holder.NAME = (TextView) row.findViewById(R.id.driverName); 
     holder.EMAIL = (TextView) row.findViewById(R.id.driverMail); 
     holder.PHONE = (TextView) row.findViewById(R.id.driverPhone); 
     row.setTag(holder); 
    }else { 
     holder = (Holder) row.getTag(); 

    } 
    Driver driver = (Driver)getItem(position); 
    holder.NAME.setText(driver.getName()); 
    holder.EMAIL.setText(driver.getMail()); 
    holder.PHONE.setText(driver.getPhone()); 

    return row; 

} 

XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="DriverName" 
    android:id="@+id/driverName" 
    android:padding="10dp" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="DriverMail" 
    android:id="@+id/driverMail" 
    android:layout_gravity="center_horizontal" 
    android:padding="10dp" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="DriverPhone" 
    android:id="@+id/driverPhone" 
    android:padding="10dp" /> 

答えて

0

私の最後の答えは、私はすぐに一緒に何かを入れて、助けていないようでした。

リストとアダプターはAndroid開発の不可欠な部分であり、どのように動作するかを理解することが本当に役に立ちますので、このトピックで詳しくお読みになることを強くお勧めします。

public class Driver { 

    private String name; 
    private String email; 
    private String phone; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 
} 

フラグメント:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment, container, false); 
     ListView listView = (ListView) view.findViewById(R.id.listView); 

     Driver a = new Driver(); 
     a.setName("Name"); 
     a.setEmail("Email"); 
     a.setPhone("Phone"); 

     ArrayList<Driver> drivers = new ArrayList<>(); 
     drivers.add(a); 

     DriverAdapter driverAdapter = new DriverAdapter(getActivity().getApplicationContext(),R.layout.driver_listview, drivers); 
     listView.setAdapter(driverAdapter); 

     return view; 

    } 

アダプタ

public class DriverAdapter extends ArrayAdapter<Driver> { 


    public DriverAdapter(Context context, int resource, List<Driver> objects) { 
     super(context, resource, objects); 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row; 
     row = convertView; 
     Holder holder; 
     if(convertView == null) { 
      LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = layoutInflater.inflate(R.layout.driver_listview, parent, false); 
      holder = new Holder(); 
      holder.name = (TextView) row.findViewById(R.id.driverName); 
      holder.email = (TextView) row.findViewById(R.id.driverMail); 
      holder.phone = (TextView) row.findViewById(R.id.driverPhone); 
      row.setTag(holder); 
     }else { 
      holder = (Holder) row.getTag(); 

     } 
     Driver driver = getItem(position); 
     holder.name.setText(driver.getName()); 
     holder.email.setText(driver.getEmail()); 
     holder.phone.setText(driver.getPhone()); 

     return row; 
    } 

    public class Holder { 
     protected TextView name; 
     protected TextView email; 
     protected TextView phone; 
    } 
} 

アダプターXML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/driverName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:text="DriverName" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/black" /> 

    <TextView 
     android:id="@+id/driverMail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:padding="10dp" 
     android:text="DriverMail" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/black" /> 

    <TextView 
     android:id="@+id/driverPhone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:text="DriverPhone" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/black" /> 

</LinearLayout> 

これはあなたを助けていない場合は、お使いのフラグメントの上映に問題がありますデバイス上にあります。私はこれを自分自身でテストしたので、画面上に正しく表示されます。

0

が見えます新しいデータでリストを更新するには、adapter.notifyDataSetChanged()を呼び出す必要があります。

アダプターの作成方法を変更することをお勧めしますが、どんな種類のアダプタを使用しても毎回私のデータリストを作成してからコンストラクタに渡します。それから私のリストビューに設定します。だから、のような:

View view; 
    view = inflater.inflate(R.layout.fragment_driver, container, false); 
    listView = (ListView) view.findViewById(R.id.driverList); 

    Driver a = new Driver("John Smith","[email protected]","123"); 
    ArrayList<Driver> drivers = new ArrayList(); 
    drivers.add(a); 

    DriverAdapter driverAdapter = new DriverAdapter(getActivity().getApplicationContext(),R.layout.driver_listview, drivers); 
    listView.setAdapter(driverAdapter); 

これは私がどうなるのかの唯一のラフな例ですが、私はこれを回避するGoogleからのいくつかの例をよく読んですることをアドバイスします。また、可能であれば、ListViewの代わりにRecyclerViewsを読み上げてください。

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html

https://www.bignerdranch.com/blog/recyclerview-part-1-fundamentals-for-listview-experts/

+0

notifyDataSetChanged()メソッドを追加しようとしましたが、オブジェクトを追加した後でもアダプタを追加しましたが、まだ表示されません。 –

1

あなたが本当にアンドロイド(リストビュー)内のリストを使用して

のようないくつかの良いチュートリアルをチェックアウトする必要がある場合は、すべての最初の - チュートリアル http://www.vogella.com/tutorials/AndroidListView/article.html

すべてが大丈夫であると仮定すると、あなたのフラグメントとそれが見えるので、あなたのアダプターに焦点を当てることができます。あなたのDriverAdapterはそれ自身のArrayListというデータを持っているので、add()メソッドでsuper.add()を呼び出す必要はありません。 notifyDataSetChanged()を呼び出すだけで、UIでコンテンツを更新する必要があることがアダプタに通知されます。このような何かを試してみてください。..

public class DriverAdapter extends BaseAdapter { 
ArrayList<Driver> data = new ArrayList(); 

public void add(Driver driver) { 
    data.add(driver); 
    notifyDataSetChanged(); 
} 

public void addAll(List<Driver> drivers) { 
    data.addAll(drivers); 
    notifyDataSetChanged(); 
} 

@Override 
public Driver getItem(int position) { 
    return data.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

public int getCount() { 
    return data.size(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Holder holder; 

    if (convertView == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.item_driver_row, parent, false); 
     holder = new Holder(); 
     holder.name = (TextView) convertView.findViewById(R.id.driverName); 
     holder.email = (TextView) convertView.findViewById(R.id.driverMail); 
     holder.phone = (TextView) convertView.findViewById(R.id.driverPhone); 
    } else { 
     holder = (Holder) convertView.getTag(); 

    } 

    Driver driver = getItem(position); 
    holder.name.setText(driver.getName()); 
    holder.email.setText(driver.getEmail()); 
    holder.phone.setText(driver.getPhone()); 
    convertView.setTag(holder); 

    return convertView; 
} 

static class Holder { 
    TextView name; 
    TextView email; 
    TextView phone; 
} 

}

+0

notifyDataSetChanged()メソッドを追加しようとしましたが、それでも動作しません –

関連する問題