如何在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<MyObject>
将仅使用 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中动态创建列?的主要内容,如果未能解决你的问题,请参考以下文章