2015-06-10 4 views
0

У меня есть список, содержащий флажок и текстовое представление. Когда isCheck, я изменил цвет этого представления и TextView. Но неправильное положение. Пожалуйста, скажи мне почему? Большое спасибоМетод ListView запущен в неправильном положении

public class GLPSelectFlight extends Activity implements OnClickListener { 
private Button btnContinue; 
private TextView tvHeader; 
private LinearLayout linBack; 
private ListView lvSelectFlight; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_glpselect_flight); 
    initView(); 
} 

private void initView() { 

    linBack = (LinearLayout) findViewById(R.id.home); 
    linBack.setOnClickListener(this); 
    linBack.setVisibility(View.VISIBLE); 

    tvHeader = (TextView) findViewById(R.id.tvHeader); 
    tvHeader.setSingleLine(true); 
    tvHeader.setEllipsize(TruncateAt.END); 
    tvHeader.setText(getString(R.string.SELECT_FLIGHT)); 

    lvSelectFlight = (ListView) findViewById(R.id.lvGlpShowFlightInfo); 
    adapter = new GLPShowFlightAdapter(); 
    lvSelectFlight.setAdapter(adapter); 

    btnContinue = (Button) findViewById(R.id.btnContinue); 
    btnContinue.setOnClickListener(this); 
} 

private class ViewHolder { 
    TextView tvFlightName; 
    RelativeLayout rllFlightName; 
    CheckBox cb; 
} 

GLPShowFlightAdapter adapter; 
ViewHolder holder; 

// for temporary Adapter. 
private class GLPShowFlightAdapter extends BaseAdapter { 

    public GLPShowFlightAdapter() { 
    } 

    @Override 
    public int getCount() { 
     return 5; 
    } 

    @Override 
    public Object getItem(int pos) { 
     return pos; 
    } 

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

    @Override 
    public View getView(final int position, View convertView, 
      ViewGroup parent) { 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = LayoutInflater.from(GLPSelectFlight.this) 
        .inflate(R.layout.glp_list_flight, parent, false); 

      holder.cb = (CheckBox) convertView 
        .findViewById(R.id.cbSelectFlight); 
      holder.rllFlightName = (RelativeLayout) convertView 
        .findViewById(R.id.rllFlightName); 
      holder.tvFlightName = (TextView) convertView 
        .findViewById(R.id.tvFlightName); 

      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton btn, 
        boolean isChecked) { 
       if (isChecked) { 
        Log.e("", "checked in pos : " + position); 
        holder.tvFlightName.setText("POS :" + position); 
        holder.rllFlightName.setBackgroundColor(Color.BLUE); 
       } else { 
        Log.e("", "unchecked in pos : " + position); 
        holder.tvFlightName 
          .setText("returned POS :" + position); 
        holder.rllFlightName.setBackgroundColor(Color.WHITE); 
       } 
      } 
     }); 
     return convertView; 
    } 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.home: 
     onBackPressed(); 
     break; 
    case R.id.btnContinue: 
     Intent in = new Intent(new Intent(GLPSelectFlight.this, 
       TranferBonusPaymentActivity.class)); 
     startActivity(in); 
     break; 
    } 
} 

}

enter image description here Я загрузить изображение, когда я нажимаю на ComboBox, этот журнал сказать точное положение (это нормально). Но событие, которое я пишу, происходит в другом pos. Выше мой адаптер, все компоненты находились из макета (без проблем).

+0

Что вы подразумеваете под неправильным положением ??? Означает ли это, что если вы проверяете флажок, меняется цвет другого текста? – Pankaj

+0

Я проверяю позицию в поле со списком 0,1,2, ничего не происходит, но в 3 - триггер в позиции 4, а в comboBox в pos 4 вызывают это срабатывание в позиции 0. – famfamfam

+0

, какую позицию вы получаете, когда вы нажимаете на список пункт? Я имею в виду проверку позиции внутри getView() – Meenaxi

ответ

0

заменить

@Override 
public Object getItem(int pos) { 
    return null; 
} 

с

@Override 
public Object getItem(int pos) { 
    return pos; 
} 
+0

Meenaxi для получения объекта вы не можете вернуть позицию, есть другой способ для этого – Pankaj

+0

ничего не меняется, я обновляю свой код. Можете увидеть это снова. Спасибо – famfamfam

1

Проблема с вашим GetView. В основном ваши коды правы, но вам нужно сделать еще несколько шагов. Проблема заключается в том, что ваши товары перерабатываются.

Я предполагаю, что ваш ListView - это многопользовательский выбор, поэтому он будет работать с ArrayList.

Шаг 1:

Объявите ArrayList ArrayList id_array = новый ArrayList();

Шаг 2:

Изменение ArrayList, как это

holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton btn, 
        boolean isChecked) { 
       if (!id_array.contains(holder.cb.getId())){ 
//add id to your arraylist 
}else{ 
//Remove id from arrayList 
} 

      } 
     }); 

следующие коды нужно писать за пределами oncheckedchangeListener

if (id_array.contains(holder.cb.getId())){ 
        Log.e("", "checked in pos : " + position); 
        holder.tvFlightName.setText("POS :" + position); 
        holder.rllFlightName.setBackgroundColor(Color.BLUE); 
       } else { 
        Log.e("", "unchecked in pos : " + position); 
        holder.tvFlightName 
          .setText("returned POS :" + position); 
        holder.rllFlightName.setBackgroundColor(Color.WHITE); 
       } 

Примечание: И я иду через код вы не используете setId для флажка. Надеюсь, у вас должен быть ID-набор, который должен быть установлен на checkBox. Тогда будет работать только мой кусок кода

+0

благодарю вас, я попробовал ваш код, но он кажется не работает. И я использую новый способ справиться с этой проблемой, и я сделал ^^. – famfamfam

0

ссылка «держатель» должна быть внутри функции getView(). Не уверен, что это так, но может быть.

0

Я узнал, что путь может решить эту проблему. Просто используйте данные и передайте их адаптеру. Когда событие срабатывает, измените данные и вызовите notifidatasetchanged().

public class GLPSelectFlight extends Activity implements OnClickListener { 
    private Button btnContinue; 
    private TextView tvHeader; 
    private LinearLayout linBack; 
    private ListView lvSelectFlight; 
    private int[] data = new int[] { Color.WHITE, Color.WHITE, Color.WHITE, 
      Color.WHITE, Color.WHITE }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_glpselect_flight); 
     initView(); 
    } 

    private void initView() { 

     linBack = (LinearLayout) findViewById(R.id.home); 
     linBack.setOnClickListener(this); 
     linBack.setVisibility(View.VISIBLE); 

     tvHeader = (TextView) findViewById(R.id.tvHeader); 
     tvHeader.setSingleLine(true); 
     tvHeader.setEllipsize(TruncateAt.END); 
     tvHeader.setText(getString(R.string.SELECT_FLIGHT)); 

     lvSelectFlight = (ListView) findViewById(R.id.lvGlpShowFlightInfo); 
     adapter = new GLPShowFlightAdapter(data); 
     lvSelectFlight.setAdapter(adapter); 

     btnContinue = (Button) findViewById(R.id.btnContinue); 
     btnContinue.setOnClickListener(this); 
    } 

    private class ViewHolder { 
     TextView tvFlightName; 
     RelativeLayout rllFlightName; 
     CheckBox cb; 
    } 

    GLPShowFlightAdapter adapter; 
    ViewHolder holder; 

    // for temporary Adapter. 
    private class GLPShowFlightAdapter extends BaseAdapter { 
     private int[] data; 

     public GLPShowFlightAdapter(int[] data) { 
      this.data = data; 
     } 

     @Override 
     public int getCount() { 
      return 5; 
     } 

     @Override 
     public Integer getItem(int pos) { 
      return data[pos]; 
     } 

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

     @Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) { 
      if (convertView == null) { 
       holder = new ViewHolder(); 
       convertView = LayoutInflater.from(GLPSelectFlight.this) 
         .inflate(R.layout.glp_list_flight, parent, false); 

       holder.cb = (CheckBox) convertView 
         .findViewById(R.id.cbSelectFlight); 
       holder.cb.setId(position * 69); 
       holder.rllFlightName = (RelativeLayout) convertView 
         .findViewById(R.id.rllFlightName); 
       holder.tvFlightName = (TextView) convertView 
         .findViewById(R.id.tvFlightName); 

       convertView.setTag(holder); 

      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton btn, 
         boolean isChecked) { 
        if (isChecked) { 
         Log.e("", "checked in pos : " + position); 
         data[position] = Color.BLUE; 
         adapter.notifyDataSetChanged(); 
        } else { 
         Log.e("", "unchecked in pos : " + position); 
         data[position] = Color.WHITE; 
         adapter.notifyDataSetChanged(); 
        } 
       } 
      }); 
      holder.rllFlightName.setBackgroundColor(data[position]); 
      return convertView; 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.home: 
      onBackPressed(); 
      break; 
     case R.id.btnContinue: 
      Intent in = new Intent(new Intent(GLPSelectFlight.this, 
        TranferBonusPaymentActivity.class)); 
      startActivity(in); 
      break; 
     } 
    } 
} 

НО Я НЕ ЗНАЮ ВЫШЕ ВОПРОС: ПОЧЕМУ ЭТО ПРОБЛЕМА ПОЯВЛЯЕТСЯ. Если кто-нибудь ЗНАЕТ ПОЖАЛУЙСТА, РАССКАЗАТЬ МЕНЯ. THANKS :)

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