如何在android中动态创建列?

Posted

技术标签:

【中文标题】如何在android中动态创建列?【英文标题】:how to create columns dynamically in android? 【发布时间】:2015-11-08 07:51:46 【问题描述】:

我正在尝试在 android 中制作列表视图。我能够使用静态数据制作简单的列表视图。现在我在资产文件夹中获取 json 文件。然后我从 json 文件中读取竞争并显示在列表视图中。它工作正常。

我喜欢这个

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"
  
]

我需要创建四列等宽(因为有四个对象)。如果是三比它显示三列等宽。我们可以在android中做吗?

任何想法..?

如何处理网格视图?

【问题讨论】:

您是否考虑过使用 GridView 而不是 ListView?还是更新、更灵活的 ReyclerView? ok ..如何制作网格视图?在 【参考方案1】:

GridView 是一种特定类型的 ListView,旨在将您的列表放入多个列或网格中。它与 ListView 一样易于使用,只是您需要指定拥有的列数。试试这个:

    用 GridView 替换 XML 文件中的 ListView 实例 将 Activity 中的 ListView 替换为 GridView 设置所需的列数。您可以根据自己的数据对其进行更改,从而使其动态化。

公共类 MainActivity 扩展 Activity 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

【讨论】:

感谢您的回答..假设此答案有效..您设置的列数为 4,它来自数据..如何创建文本视图 4 来设置值。如果它是 3 列比如何设置三个文本视图来设置文本视图的值 在您的代码中,我不知道在哪里可以看到您想要多少列...实际上,看着您的问题,您似乎不想要列,而是想要水平列表显示。这可以通过 RecyclerView 来完成,但要复杂得多,我不认为这是推荐的设计模式。但是,请参阅此答案 (***.com/questions/3240331/…) 或查看水平 ListView 如果这是您想要的方向。【参考方案2】:

开箱即用,ArrayAdapter&lt;MyObject&gt; 将仅使用 myObject.toString() 定义的值填充 TextView。如果您需要模式复杂的列表项视图,您必须创建自己的适配器来扩展 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_
    android:layout_>
    <TextView
        android:layout_
        android:layout_weight="1"
        android:layout_ />
    <TextView
        android:layout_
        android:layout_weight="1"
        android:layout_ />
    <TextView
        android:layout_
        android:layout_weight="1"
        android:layout_ />
    <TextView
        android:layout_
        android:layout_weight="1"
        android:layout_ />
</LinearLayout>

如果您无法知道列的最大数量,则必须动态构建项目布局,而不是从资源中膨胀它,更重要的是,ViewHolder 模式几乎没用。

【讨论】:

以上是关于如何在android中动态创建列?的主要内容,如果未能解决你的问题,请参考以下文章

在网格中为动态列创建过滤器

如何在工作表中动态创建具有列数的数组,以删除多列中的重复项

如何从 Android 中每个动态创建的 EditText 获取数据?

如何在 Android 中保存(用户创建的)动态布局?

如何使用列设置动态创建角剑道网格列?

动态创建的 Firebase 动态链接不适用于 Android