2015-08-15 192 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模式几乎没用。