2015-08-15 103 views
2

我想在android中創建列表視圖。我能夠使用靜態數據創建簡單的列表視圖。現在,我將資源文件夾中的json文件。然後我從json文件中讀取競爭並在列表視圖中顯示。它工作正常。如何在android中動態創建列?

我喜歡這個

public class MainActivity extends Activity { 
    ListView listView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     listView = (ListView) findViewById(R.id.list_view); 

     Log.d("==", loadJSONFromAsset()); 
     String arr[]; 
     try { 
      JSONArray js = new JSONArray(loadJSONFromAsset()); 
      arr = new String[js.length()]; 
      for (int i = 0; i < js.length(); i++) { 
       JSONObject obj = js.getJSONObject(i); 
       arr[i] = obj.getString("name"); 
      } 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr); 
      listView.setAdapter(adapter); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String loadJSONFromAsset() { 
     String json = null; 
     try { 

      InputStream is = getAssets().open("data.json"); 

      int size = is.available(); 

      byte[] buffer = new byte[size]; 

      is.read(buffer); 

      is.close(); 

      json = new String(buffer, "UTF-8"); 


     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
     return json; 

    } 


} 

這是工作的罰款 但我需要做不同的任務。我需要閱讀從資源文件夾JSON文件。和創建爲相同數目的列作爲JSON數組

這是新的JSON文件

{"coulmns":[ 
    { 
    "name": "Test_1" 
    }, 
    { 
    "name": "Test_2" 
    }, 
    { 
    "name": "Test_3" 
    }, 
    { 
    "name": "Test_4" 
    } 
]} 

我需要創建相等寬度的4柱(因爲有4個對象)。如果它是三比它顯示三列等寬。我們可以在android嗎?

任何想法..?

如何處理網格視圖?

+1

你有沒有考慮一個GridView而不是ListView?或者更新,更靈活的ReyclerView? – Scott

+0

好..如何使網格視圖?在 – user944513

回答

0

GridView是一種特定類型的ListView,用於將列表放入多個列或網格中。除了需要指定列的數量之外,它與ListView一樣易於使用。試試這個:

  1. 更換的ListView的實例在XML文件中與GridView控件
  2. 在您的活動與GridView控件
  3. 更換ListView控件設置所需的列數。您可以通過根據您的數據進行更改來實現此動態。

public class MainActivity extends Activity GridView gridView;

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    gridView = (ListView) findViewById(R.id.grid_view); 

    Log.d("==", loadJSONFromAsset()); 
    String arr[]; 
    try { 
     JSONArray js = new JSONArray(loadJSONFromAsset()); 
     arr = new String[js.length()]; 
     for (int i = 0; i < js.length(); i++) { 
      JSONObject obj = js.getJSONObject(i); 
      arr[i] = obj.getString("name"); 
     } 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr); 
     gridView.setAdapter(adapter); 
     gridview.setNumColumns(4); 
     //You can replace 4 with a formula if you want it to be variable 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

另見:http://developer.android.com/reference/android/widget/GridView.html

+0

謝謝你回答..let supose這個答案工作..你設置的列數是4來自數據..如何創建文本視圖4設置值。如果它是3列比如何設置三個文本查看設置文本視圖的價值 – user944513

+0

在你的代碼中,我不知道在哪裏看到你想要多少列...其實,看着你的問題,你似乎不想像你想要的列那麼多水平的ListView。這可以用RecyclerView完成,但它要複雜得多,我不認爲這是推薦的設計模式。然而,看到這個答案(http://stackoverflow.com/questions/3240331/horizo​​ntal-listview-in-android)或查找水平的ListView,如果這是你想要去的方向。 – Scott

0

直開箱時,ArrayAdapter<MyObject>將要填充只值一個TextView通過myObject.toString()定義。如果您需要模式複雜列表項目視圖,則必須創建自己的適配器,該適配器可以延伸ArrayAdapter並覆蓋getView(...)

例如,您的適配器建立將是:

MyArrayAdapter adapter = new MyArrayAdapter(this,R.layout.my_list_item,arr); 

我定義MyObject的轉接器內,但它可以在任何地方。這個想法是MyObject將包括從一個「行」(所有列的值)的文本

一個適配器的非常原始的版本可能是:

public class MyArrayAdapter extends ArrayAdapter<MyArrayAdapter.MyObject> { 

    public MyArrayAdapter(Context context, int resource, ArrayList<MyObject> objects) { 
     super(context, resource, objects); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder; 
     if (convertView == null) 
     { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.item, parent, false); 
      viewHolder = new ViewHolder(); 
      for (int i= 0; i < MyObject.MAX_COLUMNS; i++) 
       viewHolder.mTextViews[i] = (TextView)((ViewGroup)convertView).getChildAt(i); 
      convertView.setTag(viewHolder); 
     } 
     else 
     { 
      viewHolder = (ViewHolder)convertView.getTag(); 
     } 

     MyObject myObject = getItem(position); 
     for (int i = 0; i < myObject.myTexts.length; i++) 
     { 
      viewHolder.mTextViews[i].setVisibility(View.VISIBLE); 
      viewHolder.mTextViews[i].setText(myObject.myTexts[i]); 
     } 
     for (int i = myObject.myTexts.length; i < MyObject.MAX_COLUMNS; i++) 
      viewHolder.mTextViews[i].setVisibility(View.GONE); 

     return convertView; 
    } 

    private static class ViewHolder { 
     public TextView[] mTextViews = new TextView[MyObject.MAX_COLUMNS]; 
    } 


    public static class MyObject { 
     public static int MAX_COLUMNS = 4; 
     public MyObject(String[] texts) { 
      myTexts = texts; 
     } 
     public String[] myTexts; 
    } 
} 

而且你的項目佈局(四TextViews ,但添加/刪除,如果你的最大列是不同的):

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" /> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" /> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" /> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

如果你沒有辦法知道你列的最大數量,你必須構建項目佈局動態,而不是誇大它的從資源,更重要的是ViewHolder模式幾乎沒用。