6

ビューの種類が異なるリストを表示する必要があります。したがって、複数のビューを膨らませる必要がある Adapter を使用して ListView を定義する必要があります。与えられた例を見てきましたが、問題は、ヘッダーが4つのアイテムの後に毎回繰り返される例のように、リストが対称的ではないことです。だから私はアイテムの再利用の問題に直面していますgetView()

 public View getView(int position, View convertView, ViewGroup parent) {   
    int type = getItemViewType(position);
    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {
             case TYPE_1:
             convertView = mInflater.inflate(R.layout.item1, null);
             .......
             break;

             case TYPE_2:
             convertView = mInflater.inflate(R.layout.item2, null);
             .......
             break;
        }
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }
    ............
    ............
}

convertView が null ではなく、以前に使用された項目タイプが異なる場合、レイアウトは同じものと一致しません。このコードはこの問題をどのように処理しますか?

4

3 に答える 3

4

この例のアダプターを見ることができます。getViewTypeCount メソッドは、異なるタイプの行を返します。getItemViewType メソッドで、position が 0 の場合は最初の行のレイアウトを膨張させ、それ以外の場合は他の行のレイアウトを膨張させます。このコード例はカスタマイズできます。

    import java.util.List;
    import android.app.Activity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;

    /**
     * Created by MustafaS on 9.2.2015.
     */
    public class CustomArrayAdapter extends ArrayAdapter<YourModel> {

       @Override
       public int getItemViewType(int position) {

          if (position == 0) {
             return 0;
          }
          else {
             return 1;
          }
       }

       @Override
       public int getViewTypeCount() {
          return 2;
       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
          int type = getItemViewType(position);
          if (type == 0) {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_first_row, parent, false);
                viewHolderFirst = new ViewHolderFirst();
                convertView.setTag(viewHolderFirst);
             }
             else {
                viewHolderFirst = (ViewHolderFirst) convertView.getTag();
             }

          }
          else {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_other_row, parent, false);
                viewHolder = new ViewHolder();

             }
             else {
                viewHolder = (ViewHolder) convertView.getTag();
             }
          }
          return convertView;
       }

       protected class ViewHolderFirst {
          private RunnableViewPager pager;
          private CircleIndicator   indicator;
       }

       protected class ViewHolder {
          private ImageView imageviewRestaurant;
          private TextView  textviewRestaurantName;
          private TextView  textviewType;
          private TextView  textviewPrice;
          private TextView  textviewDistance;
          private ImageView imageviewCall;
          private ImageView imageviewCalendar;
       }
    }
于 2015-04-06T08:32:10.397 に答える
0

getViewCount()メソッドをオーバーライドすることでそれを行うことができますgetItemViewType(int position)

最初に、持っているさまざまなビューの量を返すだけです。

2 つ目では、異なるビューごとに一意の識別子を返します。

getView()メソッドで、ビューの種類を確認し、適切なレイアウトを膨らませます。

そのトピックの詳細:行ごとに異なるレイアウトの Android ListView

行ごとに異なるレイアウトの Android ListView

于 2015-04-06T08:20:40.877 に答える
0

これは、ListView または RecyclerView 内で異なるタイプのビューを使用するときに使用する必要があるものです:-

getItemViewType() and getViewTypeCount()

まず、getViewTypeCount() を使用して、リスト内で必要な一意のビューの数を返す必要があります。次に getItemViewType() をオーバーライドし、ListView 内でビューを変更する条件に基づいてビュー タイプを返します。

それが役立つことを願っています。

于 2015-04-06T08:29:43.730 に答える