我目前有一个名为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
那么......有什么帮助吗?提前致谢!正如我之前所说的......我对这个领域非常陌生,所以尽量不要太苛刻!
答案 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。如果您在此之后仍然遇到问题,请发布完整的代码,我会尝试提供更多帮助。