2015-02-17 4 views
0

Я пытаюсь написать адаптер ListView, который передаст представление на основе одного из нескольких файлов xml в зависимости от атрибута данных, который я создаю для представления. Мой код работает отлично, за исключением случаев, когда я пытаюсь использовать convertView для ускорения процесса. Независимо от того, как я пытаюсь его использовать, я либо разбиваю свою программу, либо получаю странный результат. Я понимаю почему это будет проблемой для convertView, но я сильно подозреваю, что я все еще могу сделать эту работу. Может ли кто-нибудь посоветовать мне, как я могу исправить свой код? (сейчас я использую convertView как имя точки зрения, что я вернусь, даже если я не имею «если (convertView == NULL)» процедура работает должным образом)несколько представлений xml с конвертированием android

public class PaymentListFragment extends ListFragment { 

private ArrayList<Payment> mPayments; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().setTitle(R.string.payment_schedule_title); 
    mPayments = PaymentSchedule.get(getActivity()).getPayments(); 
    PaymentAdapter adapter = new PaymentAdapter(mPayments); 
    setListAdapter(adapter); 
} 


private class PaymentAdapter extends ArrayAdapter<Payment> { 

    public PaymentAdapter(ArrayList<Payment> payments) { 
     super(getActivity(), 0, payments); 
    } 

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

     Payment p = mPayments.get(position); 
     //normal 
     //if (convertView == null) { 
     //cant work out how to use convertview conditional without screwing up project 
     //it would speed it up to fix this however 
     if (p.type == Payment.TYPE_START) { 


      convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_start, null); 

      TextView remainDisplay = 
        (TextView) convertView.findViewById(R.id.remainDisplayStart); 
      remainDisplay.setText(p.getRemainString()); 
      TextView paymentDate = 
        (TextView) convertView.findViewById(R.id.paymentDateStart); 
      paymentDate.setText(p.getDateString()); 
      TextView paymentDisplay = 
        (TextView) convertView.findViewById(R.id.paymentDisplayStart); 
      paymentDisplay.setText(p.getDefaultPaymentString()); 
      TextView aprDisplay = 
        (TextView) convertView.findViewById(R.id.aprDisplayStart); 
      aprDisplay.setText(p.getInterestRate() * 1200 + "%"); 
     } else { 
      //if (convertView == null) { 
       convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_payment, null); 
      //} 
      TextView paymentDate = 
        (TextView) convertView.findViewById(R.id.paymentDate); 
      paymentDate.setText(p.getDateString()); 
      TextView paymentDisplay = 
        (TextView) convertView.findViewById(R.id.paymentDisplay); 
      paymentDisplay.setText(p.getPaymentString()); 
      TextView principalDisplay = 
        (TextView) convertView.findViewById(R.id.principalDisplay); 
      principalDisplay.setText(p.getPrincipalString()); 
      TextView interestDisplay = 
        (TextView) convertView.findViewById(R.id.interestDisplay); 
      interestDisplay.setText(p.getInterestString()); 
      TextView remainDisplay = 
        (TextView) convertView.findViewById(R.id.remainDisplay); 
      remainDisplay.setText(p.getRemainString()); 
     } 
     //} 
     return convertView; 
    } 
} 
} 
+0

ли судимое использовать 'getItemViewType()' и 'getViewTypeCount()' 'с ViewHolder' вместо кода в' GetView() '? – anil

+0

Я собирался написать, что сказал @anil - вы можете проверить этот вопрос здесь http://stackoverflow.com/questions/4777272/android-listview-with-different-layout-for-each-row –

+0

Это похоже, что это основано на позиции. По мере того, как я продолжаю, я хочу иметь возможность добавлять другие типы на основе пропущенных платежей, дополнительных платежей, штрафов и т. Д. И иметь их в хронологическом порядке. Я попытаюсь использовать метод bonnyz для использования тегов. Раньше я пытался реализовать операторы if, которые ссылались на данные, но не могли понять, как связать их с convertView. –

ответ

2

Вы можете сделать следующий трюк:

  1. Всегда прикрепить тег вам convertView при ее создании (setTag()) с указанием типа макета (в вашем случае R.layout.list_item_start или R.layout.list_item_payment).

  2. , когда вы проверяете, если convertView != null вам нужно также проверить, если тип определяется convertView.getTag() то же макет, что нужно обновить, чтобы избежать операций раздувать правильно, потому что:

    • если типы различны вам необходимо перезаписать convertView с новой работой надувания, потому что вам нужно создать правильный тип макета.
    • если типов равны вы можете просто обновить макет без операции раздувать

Вы также можете улучшить весь код, приняв ViewHolder pattern.

+0

Я сейчас дам этот снимок. –

1

Спасибо! Предложение Бонниса сработало. Я добавил следующий код:

Payment p = mPayments.get(position); 

     if (convertView == null || convertView.getTag() != p.type) { 
      if(p.type == Payment.TYPE_START) { 
       convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_start, null); 
       convertView.setTag(Payment.TYPE_START); 
      } else{ 
       convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_payment, null); 
       convertView.setTag(Payment.TYPE_PAYMENT); 
      } 

     } 

Я также буду экспериментировать с ViewHolder. Я только что узнал об этом сегодня.

+0

Это очень помогает. Спасибо, @ Томас. –

0
public class CustomAdapter extends BaseAdapter { 
String[] frName; 
String[] lrName; 
String[] myLocation; 
Context context; 
int[] imageId; 
private static LayoutInflater inflater = null; 


public CustomAdapter(MainActivity mainActivity, String[] fstName, String[] lstName, String[] location, int[] prgmImages) { 
    super(); 
    context = mainActivity; 
    frName = fstName; 
    lrName = lstName; 
    myLocation = location; 
    imageId = prgmImages; 
    inflater = (LayoutInflater) context. 
      getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 


@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return 12; 

} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public class Holder { 
    TextView tv_frname, tv_lrname, tv_location, tv_fstname, tv_lstname; 
    ImageView img; 

} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    Holder holder = new Holder(); 
    if (position < frName.length) { 
     convertView = inflater.inflate(R.layout.myadapterdesin, null); 
     holder.tv_frname = (TextView) convertView.findViewById(R.id.frname); 
     holder.tv_lrname = (TextView) convertView.findViewById(R.id.lrname); 
     holder.tv_location = (TextView) convertView.findViewById(R.id.place); 
     holder.tv_frname.setText(frName[position]); 
     holder.tv_lrname.setText(lrName[position]); 
     holder.tv_location.setText(myLocation[position]); 
     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(context, "You Clicked " + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     return convertView; 

    } else if (position >= frName.length) { 
     convertView = inflater.inflate(R.layout.mylist, null); 
     holder.img = (ImageView) convertView.findViewById(R.id.img_view); 
     holder.tv_fstname = (TextView) convertView.findViewById(R.id.fstname); 
     holder.tv_lstname = (TextView) convertView.findViewById(R.id.lstname); 
     holder.tv_fstname.setText(frName[(position) - (frName.length)]); 
     holder.tv_lstname.setText(lrName[(position) - (frName.length)]); 
     holder.img.setImageResource(imageId[(position) - (frName.length)]); 

     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(context, "You Clicked " + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     return convertView; 
    } 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "You Clicked " + position, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    return convertView; 

} 

}

Смежные вопросы