ListView и List Adapter в Android меняют цвет - PullRequest
0 голосов
/ 26 июля 2011

У меня есть список действий, в котором есть список, показывающий результаты запроса.Ну, я хочу иметь возможность нажимать на каждый элемент, и элемент меняет цвет, но он не работает.Я хочу, чтобы элемент оставался в выбранном состоянии до тех пор, пока не будет нажата кнопка «принять» или снова будет нажат элемент.Я знаю, что так работают текстовые поля, но я предпочитаю делать это по-своему.

Вот мой код:

public void createList() {

    if (ok == 1) {
    //hay muachas possibilidades
    if (sol.get(i).getMultiseleccion() != 0){

        bt2.setVisibility(View.INVISIBLE);
    }else {
        //solo se clika en una
        //lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        bt2.setVisibility(View.VISIBLE);
    }

        String hd1 = sol.get(i).getDescSolicitud();

        tv2.setText(hd1);

        ArrayList<SubSolicitud> sub = sol.get(i).getSubSol();
        mAdapter = new EventAdapter(this, sub);
        setListAdapter(mAdapter);
        lv.setTextFilterEnabled(true);
        lv.computeScroll();
        lv.setDividerHeight(1);
        lv.setItemsCanFocus(false);
        lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {

                    ok = 1;
                    //OnListClick(position, arg1);
                    if (sol.get(i).getMultiseleccion() != 0) {
                        // multiples respuestas

                                ((EventEntryView)arg1).text1.setTextColor(Color.YELLOW);

                        guardarRespuesta();
                    }else {
                    buscarElementos();
                    }

            }

        });
    }

    // informar el usuario de que hay un error
    else
        buildAlertDialog();

}

, а остальные классы: открытый класс EventAdapter extends BaseAdapter {

    public ArrayList<SubSolicitud> mEvents = null;

    public EventAdapter(Context c, ArrayList<SubSolicitud> subsol) {
        mContext = c;
        mEvents = subsol;
    }

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

    public Object getItem(int position) {
        return position;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        EventEntryView btv;
        if (convertView == null) {
            btv = new EventEntryView(mContext, mEvents.get(position));

        } else {
            btv = (EventEntryView) convertView;
            String title1 = mEvents.get(position).getDescripcion();

            if (title1 != null) {
                btv.setText1Title(title1);
            }

        }
        btv.setBackgroundColor(Color.BLACK);

        return btv;

    }

    private Context mContext;

    public void clearEvents() {
        mEvents.clear();
        notifyDataSetChanged();
    }

    public void addEvent(SubSolicitud e) {
        mEvents.add(e);

    }

}

public class EventEntryView extends LinearLayout {

    // private View inflatedView;
    private TextView text1;

    // private TextView text2;

    public EventEntryView(Context context, SubSolicitud subSolicitud) {
        super(context);
        this.setOrientation(VERTICAL);



        text1=new TextView(context);
        text1.setTextSize(20);
        text1.setPadding(10, 10, 10, 10);
        text1.setTextColor(Color.WHITE);
        String t = subSolicitud.getDescripcion();
        text1.setText(t);

        addView(text1, new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    }

    public void setText1Title(String title1) {
        // TODO Auto-generated method stub
        text1.setText(title1);

    }

}

Как видите, я пытаюсь получить текст желтым цветом, но он не работает, я нажимаю, и он не становится желтым.

Есть ли решение?

спасибо

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

Это не работает, потому что для каждого элемента в списке нет EventEntryView - один и тот же EventEntryView повторно используется для визуализации каждого.

Вам нужно что-то добавить в свой SubSolicitud объект модели, чтобы указать, что он был выбран (скажем, логическое свойство «selected»).

В вашем обработчике onItemClicked вы бы переключили это свойство -

 public void onItemClick(AdapterView<?> adapterView, View view,
                int position, long id) {
     // ...
     SubSolicitud selectedSubSol = (SubSolicitud)adapterView.getAdapter().getItem(id);
     boolean currentValue = selectedSubSol.isSelected();
     selectedSubSol.setSelected(!currentValue); // toggle 'selected' on and off
     // ... 
}

(Вам также нужно исправить свой EventAdapter getItem метод, чтобы он возвращал mEvents.get(position), чтобы это работало ...)

Затем в вашем методе EventAdapter getView вы используете значение свойства selected для отображения цвета текста -

public View getView(int position, View convertView, ViewGroup parent) {
    // ...
    if (mEvents.get(position).isSelected()) {
        btv.text1.setTextColor(Color.YELLOW);
    } else {
        // you have to have an else to set it back to the default
        // color, because the view is reused for all list items.
        btv.text1.setTextColor(Color.WHITE);
    }
    // ...
} 
0 голосов
/ 26 июля 2011

Это то, как вы меняете цвет.

public void onItemClick(AdapterView<?> arg0, View arg1,
                        int position, long arg3) {

                       position = position - listView.getFirstVisibleItem();
                       ((EditText)arg0.getChildAt(position).findViewById(R.id.myTextView)).setTextColor(Color.YELLOW);

    }

Но если вы хотите освободить элемент от цвета, вы должны выполнить итерацию по каждому элементу списка и изменить его на нормальный, или вы можете сделать это.он внутри getView(), так как он вызывается каждый раз, когда в списке просмотра есть действие

...