Android-动态地将对象添加到列表视图

时间:2011-10-25 05:10:19

标签: android listview

我的目标是在启用复选框时将列表项推送到列表的末尾。我的列表项是一个对象“任务”。

ListView lv=this.getListView();
int size=lv.getCount();
Myarrayadapter adapter = new Myarrayadapter(this,getTasks());   
lv.setAdapter(adapter);
lv.invalidateViews();


private List<Task> getTasks() {
List<Task> list = new ArrayList<Task>();
for(int k=0;k<taskname.length;k++)//taskname is an array of tasknames
{
list.add(new Task(taskname[k],status[k]));
    return list;
}

Myarrayadapter类如下所示。我的目的是检查复选框是否已启用。如果是,请进行一些更改(文本颜色和按钮文本)并将此更改的视图移动到最后位置。

public class Myarrayadapter extends ArrayAdapter<Task> {
private final Activity context;
private final List<Task> list;

public Myarrayadapter(Activity context, List<Task> list) {
super(context, R.layout.list_item, list);
this.context = context;
this.list=list;
}

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

LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.list_item, null, true);
final TextView text = (TextView) rowView.findViewById(R.id.label);
CheckBox checkbox = (CheckBox) rowView.findViewById(R.id.cb);
final Button btnChild = (Button) rowView.findViewById(R.id.directions);
text.setText(list.get(position).getName());
checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
                if(isChecked)
                {
                    text.setTextColor(Color.parseColor("#468765"));
                    btnChild.setText("Revert");
                    Task taskItem= list.get(position);
                    list.remove(position);
                    list.add(taskItem);

                }
        }});

    return rowView;
}

它没有移动我想要的确切列表项目。

先谢谢!!!!

3 个答案:

答案 0 :(得分:1)

您需要调用notifyDataSetChanged()来更新列表视图:

list.remove(position);
list.add(taskItem);
notifyDataSetChanged();   // add this line after adding task again at last position

答案 1 :(得分:1)

试试这个(没有编写整个适配器,但是你看到需要替换的部分):

        View v = convertView;

        if(v == null){
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.list_item, null);
        }

        final Task task = getItem(position);
        if(isChecked)
        {
              text.setTextColor(Color.parseColor("#468765"));
              btnChild.setText("Revert");
              list.remove(task);
              list.add(task);
              notifyDataSetChanged();
        }
       return v;

要获取按钮和颜色的新更改,您需要在删除它之后在任务上设置setColor和setText(在Task.class中创建自己的setColor()和setText(),然后添加它和在适配器中使用if else语句(通过使用getColor()和getText()),检查任务的颜色和文本。

答案 2 :(得分:0)

您应该覆盖ArrayAdapter中的某些方法

@Override
public int getCount() { 
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}