更改List <string> </string>的自定义适配器

时间:2012-08-01 13:00:29

标签: java android json

我目前有一个名为TaskListAdapter的适配器类,它目前只处理一个textView,但后来将更改为保存2个textViews和2个imageViews,代码为:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class TaskListAdapter extends ArrayAdapter<TaskListItem> {
Context context;
int layoutResourceId;
TaskListItem data[] = null;

public TaskListAdapter(Context context, int layoutResourceId, TaskListItem[] data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    TaskListHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new TaskListHolder();
        holder.txtTitle = (TextView)row.findViewById(R.id.txtDashCol1Name);

        row.setTag(holder);
    }
    else
    {
        holder = (TaskListHolder)row.getTag();
    }

    TaskListItem list_item = data[position];
    holder.txtTitle.setText(list_item.title);

    return row;
}

static class TaskListHolder
{
    TextView txtTitle;
}

}

它使用TaskListItem类,即:

public class TaskListItem {
    public String title;
    public TaskListItem() {
        super();
    }

    public TaskListItem(String title) {
        super();
        this.title = title;
    }

}

现在,在我处理JSON查询的主类中,它当前填充了一个List。我是Java和Android开发人员的新手,所以请尽量解释所有答案!这是我从URL获得响应然后解析响应的部分。

//It first gets the response from the http request.
            String response = new RequestTask(this).execute(MY_URL).get();
            //And then parses the JSONObject that is returned
            JSONObject results = new JSONObject(response);
            recordList = results.getJSONArray("records");
            int length = recordList.length();

            //Below, the text item at the top of the list which indicates the number of tasks total, is populated.
            ((TextView)findViewById(R.id.txtTotalListItems)).setText("Tasks (" + length + ")");

            //Then it loops around each entry in the JSONObject and adds anything with the label 'title' into an array
            List<String> listContents = new ArrayList<String>(length);
            for (int i=0; i < length; i++) {
                JSONObject item = recordList.getJSONObject(i);
                listContents.add(item.getString("title"));
            }

            myListView = (ListView) findViewById(R.id.ltPageTwoList);
            myListView.setAdapter(new ArrayAdapter<String>(TaskList.this, R.layout.list_item, R.id.txtTitle, listContents));

这是一个try / catch子句包围,如果我使用标准的setAdapter(新的ArrayAdapter ......那么东西,似乎所有东西都能正常工作。我希望能做的是为备用列表之类的东西设置自定义适配器颜色,填充多个textViews和imageViews。任何想法家伙?我尝试的第一件事是:

TaskListAdapter task = new TaskListAdapter(this, R.layout.task_list_layout, listContents);

但它引发了错误:

The constructor TaskListAdapter(TaskList, int, List<String>) is undefined

那么......有什么帮助吗?提前致谢!正如我之前所说的......我对这个领域非常陌生,所以尽量不要太苛刻!

1 个答案:

答案 0 :(得分:2)

List与对象数组不同。数组是更基本的类型,不能与列表互换使用。您之前没有遇到任何问题,因为使用ArrayAdapter时,有多个构造函数,其中一个构造函数被重载以使用对象列表。

ArrayAdapter(Context context, int textViewResourceId, List<T> objects)

在您定义的类中,您只定义了一个接受对象数组的构造函数,并且构造函数不是在Java中继承的,尽管您仍然可以通过super()调用来访问它们。

要解决您的问题,只需将构造函数更改为

即可
TaskListAdapter(Context context, int textViewResourceId, List<TaskListItem> objects)

并更改引用以反映您正在使用List。即:

List<TaskListItem> data = new ArrayList <TaskListItem> ();
...
TaskListItem task_item = data.get(position);

如果您对List vs array,ArrayList vs List或继承感到困惑,我认为这些问题对于问题的范围来说太宽泛了,我建议您阅读一些基本的java教程。请参阅:http://docs.oracle.com/javase/tutorial/java/index.html

编辑: 因此,在解析JSON的类中,将add调用添加到

add(new TaskListItem(item.getString("title"))

并且,执行我最初想要的Adapter类,将对数组的所有引用更改为对列表的引用。

我突然想到你之前在解析json的类中使用了String列表,并且你将更改该列表。

快速说明是通过参数化List你告诉Java编译器你只会在那里放置某种类型的对象。您使用类型TaskListItem对列表进行参数化,因此它不再接受String类型。我告诉你做的是更改你的add调用,所以它为每个String创建一个新的TaskListItem并添加它,而不是尝试添加普通的String。如果您在此之后仍然遇到问题,请发布完整的代码,我会尝试提供更多帮助。