JSON数据ListView中使用自定义适配器
我试图从JSON
数据创建一个自定义Adapter
,我可以创建装在每个记录一列中的所有数据ListView
但我想每个值是在它的上一行。样品JSON
JSON数据ListView中使用自定义适配器
{
"outages": [
{
"outagnumber": "567273",
"impact": "half a block",
"status": "almost complete",
"timestamp": "07-19-2015 12:00:00am"
},
{
"outagnumber": "567243",
"impact": "whole block",
"status": "whating on crew",
"timestamp": "07-19-2015 11:00:00am"
},
]
}
实现此目的的最佳方法是什么?
适配器
public class CustomListOutageAdapter extends ArrayAdapter{
private final Activity context;
private final LinkedList<HashMap<String, String>> itemname;
public CustomListOutageAdapter(Activity context, LinkedList<HashMap<String, String>> itemname) {
super(context, R.layout.mylistoutagedetails, itemname);
// TODO Auto-generated constructor stub
this.context = context;
}
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.mylistoutagedetails, null, true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.name);
txtTitle.setText(itemname.get(position).toString());
return rowView;
};
}
我觉得您需要一些帮助了解适配器,所以让我们从头开始。希望这可以帮助你。
您遇到的问题是适配器只是一个“单元”,适配器将创建x个单元。
适配器需要列表(arraylist,list,linkedlist ...),并使用列表中的每个元素作为单元格的内容,默认情况下它将生成单元格的数量。 您可以覆盖getCount()
方法来指定您可能需要的不同数量的单元格。 (你甚至可以做一些像someList.size() + 4
,或者你要添加到细胞的数目任何其他)
所以,如果你想在自己的细胞来显示这8个元素,你有几种选择:
在活动(而不是适配器)中,您可以使用json的每个元素创建一个新的List(arrayList可能更容易)。这使得它传递1个列表,其中所有对象已经单独分开。 这通常是一个糟糕的做法和一个坏主意,但是因为无论如何你都想用这种奇怪的方式展示它,这可能是最快捷的方式。
再次在活动中,您可以创建一个名为“停机”的对象,其中包含“停机”标记中的元素(外部编号,影响...),然后将这些对象添加到新列表中,新适配器列表。然后适配器将有一个包含2个对象的列表(在本例中),然后您可以创建2个单元格,每个单元有4个textview元素,并将每个对象的每个元素添加到每个文本视图中。 这可能是最好的方法,但每个元素都不在自己的单元格中。
您可以使用@nolleh建议的viewHolder方法,但由于您现在正在使用Recycler视图,因此它会使此问题复杂化。
让我知道这是否有帮助。
编辑:添加例子
这里有一个如何你可以用一个适配器做2个细胞为例,每个单元包括文字你想:
Activity类
public class OutagesActivity extends ListActivity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Please don't create objects like this. This is just an example
Outages outagesObject = new Outages();
outagesObject.outagnumber = jsonValue;
outagesObject.impact = jsonValue;
outagesObject.status = jsonValue;
outagesObject.timestamp = jsonValue;
List<Outages> listOfOutagesObjects = new ArrayList<Outages>();
listOfOutagesObjects.add(outagesObject);
listOfOutagesObjects.add(outagesObject2);
OutagesAdapter adapter = new OutagesAdapter(listOfOutagesObjects);
setListAdapter(adapter);
}
}
适配器类
public class OutagesAdapter extends ArrayAdapter<Outages>
{
private List<Outages> listOfOutagesObjects;
public InitialGetDataActivityAdapter(List<Outages> listOfOutagesObjects)
{
super(context, R.layout.single_row, listOfOutagesObjects);
this.listOfOutagesObjects = listOfOutagesObjects;
}
@Override
public int getCount() {
return listOfOutagesObjects.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
Outages outagesObject = listOfParseObjects.get(position);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.single_row, parent, false);
TextView tv_outagnumber = (TextView) rowView.findViewById(R.id.tv_outagnumber);
TextView tv_impact = (TextView) rowView.findViewById(R.id.tv_impact);
TextView tv_status = (TextView) rowView.findViewById(R.id.tv_status);
TextView tv_timestamp = (TextView) rowView.findViewById(R.id.tv_timestamp);
tv_outagnumber.setText(outagesObject.outagnumber);
tv_impact.setText(outagesObject.impact);
tv_status.setText(outagesObject.status);
tv_timestamp.setText(outagesObject.timestamp);
return rowView;
}
}
而且你需要使用你想要的任何布局顺序来制作你的布局文件(R.layout.single_row)。
。你能提供一个例子吗?谢谢 – Dwill
我刚刚添加了一个活动+适配器的例子。 – TooManyEduardos
这回答你的问题,请将其标记为已回答,以便将来可以帮助其他人 – TooManyEduardos
如何变革项目,如JSONArray? 和我不熟悉你的ArrayAdapter,更改为BaseAdapter。
代码将如下所示.. 有一些像viewHolder这样的习惯用法,它只是保留其'视图,方便访问。
import org.json.JSONArray;
public class CustomListOutageAdapter extends BaseAdapter{
private final Activity mContext;
private final JSONArray mData;
/// items is
public CustomListOutageAdapter(Activity context, JSONArray items) {
//super(context, R.layout.mylistoutagedetails, itemname);
this.mContext = context;
this.mData = items;
}
public View getView(int position, View view, ViewGroup parent) {
ViewHolder vh;
if (view == null) {
LayoutInflater inflater = context.getLayoutInflater();
view = inflater.inflate(R.layout.mylistoutagedetails, null, true);
vh = new ViewHolder();
vh.txtName = (TextView) view.findViewById(R.id.name);
view.setTag(vh);
}
else {
vh = (ViewHolder) view.getTag();
}
if (mData.size() > position) {
vh.txtTitle.setText(mData.get(position).toString());
}
return view;
}
public class ViewHolder {
TextView txtName; // so on...
}
你是说你想要这个:“outagnumber”:“567273”在它自己的列表中,并且这个:“impact”:在它自己的列表中的“half a block”,并且为你的数组中的每个json对象做这件事?对不起,我不明白你想要实现什么 – TooManyEduardos
@TooManyEduardos是的,每个都在列表中的行中。 – Dwill
但是你的问题是什么?你在问如何解析json,或者你在问如何为列表视图制作UI? – TooManyEduardos