2015-07-20 104 views
2

我试图从JSON数据创建一个自定义Adapter,我可以创建装在每个记录一列中的所有数据ListView但我想每个值是在它的上一行。样品JSONJSON数据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; 

}; 
} 
+0

你是说你想要这个:“outagnumber”:“567273”在它自己的列表中,并且这个:“impact”:在它自己的列表中的“half a block”,并且为你的数组中的每个json对象做这件事?对不起,我不明白你想要实现什么 – TooManyEduardos

+0

@TooManyEduardos是的,每个都在列表中的行中。 – Dwill

+0

但是你的问题是什么?你在问如何解析json,或者你在问如何为列表视图制作UI? – TooManyEduardos

回答

2

我觉得您需要一些帮助了解适配器,所以让我们从头开始。希望这可以帮助你。

您遇到的问题是适配器只是一个“单元”,适配器将创建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)。

+0

。你能提供一个例子吗?谢谢 – Dwill

+0

我刚刚添加了一个活动+适配器的例子。 – TooManyEduardos

+0

这回答你的问题,请将其标记为已回答,以便将来可以帮助其他人 – TooManyEduardos

1

如何变革项目,如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... 
}