如何在android中动态创建列?
我想在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吗?
任何想法..?
如何处理网格视图?
GridView是一种特定类型的ListView,用于将列表放入多个列或网格中。除了需要指定列的数量之外,它与ListView一样易于使用。试试这个:
- 更换的ListView的实例在XML文件中与GridView控件
- 在您的活动与GridView控件
- 更换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
谢谢你回答..let supose这个答案工作..你设置的列数是4来自数据..如何创建文本视图4设置值。如果它是3列比如何设置三个文本查看设置文本视图的价值 – user944513
在你的代码中,我不知道在哪里看到你想要多少列...其实,看着你的问题,你似乎不想像你想要的列那么多水平的ListView。这可以用RecyclerView完成,但它要复杂得多,我不认为这是推荐的设计模式。然而,看到这个答案(http://*.com/questions/3240331/horizontal-listview-in-android)或查找水平的ListView,如果这是你想要去的方向。 – Scott
直开箱时,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
模式几乎没用。
你有没有考虑一个GridView而不是ListView?或者更新,更灵活的ReyclerView? – Scott
好..如何使网格视图?在 – user944513