【问题标题】:how to create columns dynamically in android?如何在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 ..如何制作网格视图?在

标签: android android-layout android-intent android-activity


【解决方案1】:

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

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

公共类 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 来完成,但要复杂得多,我不认为这是推荐的设计模式。但是,请参阅此答案 (stackoverflow.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_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 模式几乎没用。

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 2019-11-25
    • 2018-09-17
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多