ListView中的JSON数据使用自定义适配器

时间:2015-07-20 14:07:23

标签: java android android-listview android-arrayadapter

我正在尝试从Adapter数据创建自定义JSON,我可以创建一个ListView,每条记录包含一行所有数据,但我希望每个值都在它在排。样本JSON

{
"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;

};
}

2 个答案:

答案 0 :(得分:2)

我觉得你需要一些帮助来理解适配器,所以让我们从头开始。希望这会对你有所帮助。

你遇到的问题是适配器只是一个单元&#34;单元&#34;,适配器将创建x个单元格。

适配器需要一个列表(arraylist,list,linkedlist ...),并使用列表中的每个元素作为单元格的内容,默认情况下,它将生成的单元格数量。 您可以覆盖getCount()方法来指定您可能需要的不同数量的单元格。 (您甚至可以执行类似someList.size() + 4或其他任何您想要添加到单元格数量的内容)

因此,如果您想在自己的单元格中显示这8个元素,您可以选择以下几个选项:

  • 在活动(不是适配器)中,您可以使用json的每个元素创建一个新的List(arrayList可能会更容易)。这样就可以传递1个列表,其中所有对象已经单独分开。 这通常是一种不好的做法,也是一个坏主意,但是因为你想以这种奇怪的方式显示它,这可能是最快捷的方式。

  • 再次在活动中,您可以创建一个名为&#34;中断&#34;的对象。其中包含&#34;中断中的元素&#34; tag(outagnumber,impact ...),然后将这些对象添加到新列表中,并将此新列表传递给适配器。然后,适配器将具有包含2个对象的列表(在此示例中),然后您可以创建2个单元格,每个单元格包含4个textview元素,并将每个对象的每个元素添加到每个文本视图中。 这可能是最好的方法,但每个元素都不会在自己的单元格中。

  • 您可以使用@nolleh建议的viewHolder方法,但由于您现在正在使用Recycler视图,因此会使此问题复杂化。

如果有帮助,请告诉我。

编辑:添加了示例

以下是一个如何使用适用于2个单元格的适配器的示例,每个单元格包含您想要的文本:

活动类

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)。

答案 1 :(得分: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...   
}