您的位置:首页 > 其它

ListView 动态加载

2016-01-07 14:17 232 查看
第一次写,markdown完全不会用呀,还有就是会不会有潜规则的,真不知道写完了会是啥样,想想还有点小激动呢。不过一回生二回熟嘛,万事开头难,老鸟们见笑了!

这是一篇动态加载ListView的学习日记,小弟也是边学习边工作边加班…具体的介绍就是:提供一个下拉选,选择完数量以后,ListView加载出来。

接下来还是上代码;

public class MainActivity extends Activity {
private Context cont = MainActivity.this;
private Spinner mySpinner = null;// 下拉选
private ListView myListView = null;
ArrayAdapter<String> _AdapterMyspinner = null;
private String[] list_num = new String[] { "请选择加载的数量", "不加载", "1", "2",
"3", "4", "5", "6", "7", "8", "9", "10" };// 定义一个数组,用于模拟获取的信息条数
private List<String> list = new ArrayList<String>();
private MyAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_main);
Init();
}

public void Init() {
mySpinner = (Spinner) findViewById(R.id.myspinner);
myListView = (ListView) findViewById(R.id.mylistview);
// 将数组放在adapter中,并设置样式
_AdapterMyspinner = new ArrayAdapter<String>(cont,
R.layout.spinner_layout, list_num);
// 为spinner设置背景
mySpinner.setBackgroundResource(R.drawable.chooser_line1);
// 为spinner设置下拉样式
_AdapterMyspinner
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(_AdapterMyspinner);
// 为spinner设置监听
mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View v,
int position, long id) {

if ("请选择加载的数量".equals(list_num[position])) {
myListView.setVisibility(View.GONE);
} else if ("不加载".equals(list_num[position])) {
list.clear();
// 加载listview
setListViewHeightBasedOnChildren(myListView);
} else {
myListView.setVisibility(View.VISIBLE);
list.clear();
int sl = Integer.parseInt(list_num[position]);
for (int i = 0; i < sl; i++) {
list.add(i + "");
System.out.println(i);
}
// 加载listview
setListViewHeightBasedOnChildren(myListView);
}
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}

// 加载listview
public void setListViewHeightBasedOnChildren(ListView listView) {
adapter = new MyAdapter(cont);
adapter.setDataSource(list);
listView.setAdapter(adapter);

/**
* 为了解决listview与ScrollView不能同时使用的问题,提供以下解决方法.我没有用到scrollview,不使用也没问题.
* 原理:调整ListView高度 思路就是在设置完ListView的Adapter后,根据ListView的子项目重新计算ListView的高度,
* 然后把高度再作为LayoutParams设置给ListView,这样它的高度就正确了
* 注意:在MyItemsView中,视图必须继承LineraLayout,不然会空指针,只有LinearLyout重写了onMeasure方法.
* 如果直接在Adapter中加载view视图,xml视图中,需要以LineraLayout开始,不然也会报空指针.
*/

ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}

int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}

ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
}
}


适配器

public class MyAdapter extends BaseAdapter {
private Context context;
List<String> infolist = null;

public MyAdapter(Context context) {

this.context = context;
infolist = new ArrayList<String>();

}

public void setDataSource(List<String> infolist) {
if (infolist == null) {
this.infolist = new ArrayList<String>();
} else {
this.infolist = infolist;
}
this.notifyDataSetChanged();
}

public int getCount() {
return infolist.size();
}

public Object getItem(int position) {
return infolist.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

String info = infolist.get(position);
System.out.println("info=======" + info);
MyItemsView view = null;

if (convertView == null) {

view = new MyItemsView(context, position);
convertView = view;

} else {
view = (MyItemsView) convertView;
}
return view;
}

}


items视图

public class MyItemsView extends LinearLayout {
int position = 0;
OnClickListener listener;

public MyItemsView(Context context, int position) {
super(context);
this.position = position;
initilize(context);
}

public static EditText text;

public void initilize(Context context) {
View rootView = LayoutInflater.from(context).inflate(
R.layout.activity_items_main, null);
addView(rootView);
text = (EditText) rootView.findViewById(R.id.items_text);

text.setTag(position);
text.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
}
});
}
}


listview的xml

<ListView
android:id="@+id/mylistview"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_below="@+id/myspinner"
android:layout_marginBottom="5dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:background="@color/white_gray"
android:cacheColorHint="#00000000"
android:divider="@color/white"
android:dividerHeight="10dp"
android:fadingEdge="none"
android:focusable="true"
android:listSelector="#00000000"
android:scrollbars="none" />


items 的xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape"
android:padding="3dp" >
<!-- android:descendantFocusability="blocksDescendants"   子控件不影响父控件获取焦点 -->
<EditText
android:id="@+id/items_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请填写内容"
android:textColor="@color/black"
android:textSize="19sp" />
</RelativeLayout>


下拉选adapter设置样式的xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@color/black"
android:ellipsize="marquee"
android:gravity="center"
/>


这里还顺带解决了一下Listview和scrollview不能共同的问题,在代码里解释了。只是一种解决方案,我转载的,但忘了当时从哪给搞的了,然后改了改。

这是demo:http://download.csdn.net/detail/shuai_de_yi_ta_hu_tu/9394369

第一次写,写的不好,见笑了见笑了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: