2015-07-20 107 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... 
}