ListView是android中常见的控件之一,对于它的了解和应用也是需要掌握的。
ListView需要调用setAdapter(adapter)方法,通过adapter对象来连接数据和UI。Adapter对象负责把数据格式化,并与ListView绑定将数据提供给ListView显示,而ListView只负责控件的显示以及UI的交互事件的处理。
adapter中getView方法实现使用数据、并更新UI,如果数据量大,且属于耗时操作,那么可以事先使用多线程,Asynctask来读取数据,再getView更新UI。已避免产生ANR问题。
用手边教材的例子做示范。
package com.example.ex_emptylisetview;
import android.os.Bundle;
import android.app.ListActivity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MainActivity extends ListActivity
{
private CheeseAdapter mAdapter;
private static final String[] EM = {};
private static final String[] CH = {
"asdf","qwe","tiu","fdhgfgh", "yhe",
"werert", "sfsdfq"
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdapter = new CheeseAdapter(CH);
Log.d("onCreate", "madapter");
setListAdapter(mAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onSetEmpty(View v)
{
mAdapter.changeData(EM);
}
public void onSetData(View v)
{
mAdapter.changeData(CH);
}
private class CheeseAdapter extends BaseAdapter
{
private String[] mData;
private void changeData(String[] data)
{
mData = data;
notifyDataSetChanged();
}
public CheeseAdapter(String[] mData)
{
super();
this.mData = mData;
}
@Override
public int getCount()
{
Log.d("getCount", "mData.length:"+mData.length);
return mData.length;
}
@Override
public String getItem(int position)
{
Log.d("getItem", "getItem"+position);
return mData[position];
}
@Override
public long getItemId(int position)
{
Log.d("getItemId", "getItemId:"+position);
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
Log.d("getView", position+"");
if(convertView ==null)
{
convertView = getLayoutInflater().
inflate(R.layout.text_item, parent, false);
}
((TextView)convertView).setText(getItem(position));
return convertView;
}
}
}
结果显示如下表:
setAdapter()方法后,会调用getCount()方法,之后是getView方法。
对于adapter中一些方法,做一个简单介绍。
int getCount() 返回数据信息数据总数量。
Object getItem(intposition) 从数据信息中返回下标position的数据项;
Long getItemId(intposition) 从数据信息中得到下标position的数据项的ID;
View getView(intposition, View converView, ViewGroup parent)ListView 通过它传进啊View;
intgetViewtypedCount()返回ListView使用View数量,默认为1;
intgetItemViewType(int position)根据position获得对应item使用的View类型。
booleanisEnabled(int position)根据position 设置对应的Item是否可用(是否能否接收UI事件,这句不大理解)
_______________________________
在scrollview 下显示全部的listview内容,这个问题也可以换个思路,那就是在listView HeaderView 和 FooterView 添加 scrollView 中listView 之前之后的内容。这样,整个展示效果和设定 listView 高度效果一致。
http://blog.youkuaiyun.com/tianxiangshan/article/details/7956488
http://my.oschina.net/f839903061/blog/60469
http://www.doc88.com/p-772890172277.html
三篇结合一起看。
<pre code_snippet_id="110283" snippet_file_name="blog_20131213_2_3683755">