android中的ListView和List适配器改变颜色

时间:2011-07-26 15:37:48

标签: android listview text colors adapter

我有一个列表活动,其中有一个显示查询结果的列表。好吧,我想能够点击每个项目,项目改变颜色,但它不起作用。我希望项目保持selecetd状态,直到按下“acceptte”按钮或再次按下项目。我知道文本框是如何工作的,但我更喜欢按照自己的方式去做。

这是我的代码:

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扩展了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 个答案:

答案 0 :(得分:2)

它不起作用,因为列表中的每个项目都没有EventEntryView - 重复使用相同的EventEntryView来呈现每个项目。

您需要在SubSolicitud模型对象上添加一些内容以表明它已被选中(假设是一个布尔“选定”属性)。

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);
    }
    // ...
} 

答案 1 :(得分:0)

这是你改变颜色的方法。

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()内部执行它,因为每次有动作时都会调用它在列表视图