實(shí)現(xiàn)思路: 1.首先要準(zhǔn)備并拷入Xlistview的源代碼或者jar包,新建一個(gè)項(xiàng)目XlistviewDemo對(duì)Xlistview的源代碼形成依賴。 2.準(zhǔn)備Xlistview的主布局文件Xlistview_layout.xml中添加X(jué)listview控件。 3.準(zhǔn)備Xlistview的Item布局文件Xlistview_item.xml,里面兩個(gè)控件,一個(gè)放數(shù)據(jù),一個(gè)放點(diǎn)擊可顯示的單選圖標(biāo)。 4.新建一個(gè)adapter包和MyBaseAdapter繼承BaseAdapter。(并優(yōu)化) 5.在主activity中聲明并注冊(cè)Xlistview,初始化數(shù)據(jù)源和適配器,并設(shè)置給Xlistview實(shí)現(xiàn)代碼。(至此已實(shí)現(xiàn)listview)。最后讓Mainactivity實(shí)現(xiàn)IXListViewListener接口,重寫(xiě)兩個(gè)方法實(shí)現(xiàn)上拉刷新和下拉加載功能。
1.首先要準(zhǔn)備并拷入Xlistview的源代碼或者jar包,新建一個(gè)項(xiàng)目XlistviewDemo對(duì)Xlistview的源代碼形成依賴。
拷入源代碼形成依賴的方法待完善
2.準(zhǔn)備Xlistview的主布局文件Xlistview_layout.xml中添加X(jué)listview控件。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ll"android:layout_width="match_parent" android:layout_height="match_parent"tools:context="com.soft.qianyu.sw在外圍用LinearLayout包裹Xlistview(注意布局和Xlistview都要設(shè)置id)。3.準(zhǔn)備Xlistview的Item布局文件Xlistview_item.xml,里面兩個(gè)控件,一個(gè)放數(shù)據(jù),一個(gè)放點(diǎn)擊可顯示的單選圖標(biāo)。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"><TextView android:id="@+id/text" android:layout_width="0dp" android:layout_weight="9" android:layout_height="wrap_content" android:textSize="35sp" android:gravity="center" /> <TextView android:id="@+id/select_tv" android:visibility="invisible" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="√" android:textColor="@color/colorAccent" android:gravity="center" android:textSize="35sp" /></LinearLayout>兩個(gè)TextView一個(gè)放置數(shù)據(jù),另外一個(gè)點(diǎn)擊會(huì)改變visitible屬性。
4.新建一個(gè)adapter包和MyBaseAdapter繼承BaseAdapter。(并優(yōu)化)
public class MyBaseAdapter extends BaseAdapter { //一個(gè)BaseAdapter需要數(shù)據(jù)源和打氣筒,所以先聲明兩個(gè)變量 ArrayList<String> datas; LayoutInflater inflater; //為了能定位到點(diǎn)擊的位置,所以先聲明一個(gè)選中項(xiàng)的位置常量 public int selectedPosition = 0 ; //提供BaseAdapter適配器的構(gòu)造器 public MyBaseAdapter(ArrayList<String> datas, Context context){ this.datas = datas; //inflater對(duì)象是從上下文中來(lái)獲取來(lái)的 inflater = LayoutInflater.from(context); } //獲得數(shù)據(jù)源的總數(shù) @Override public int getCount() { return datas==null?0:datas.size(); } //獲得指定位置的數(shù)據(jù)源 @Override public Object getItem(int position) { //如果數(shù)據(jù)源為空,返回為空 return datas==null?null:datas.get(position); } //獲得指定位置的item的下標(biāo) @Override public long getItemId(int position) { return position; } //加載item布局并展示數(shù)據(jù) @Override public View getView(int position, View convertView, ViewGroup viewGroup) { //為實(shí)現(xiàn)單布局加載和緩存控件,先要聲明者兩個(gè)變量 View view; ViewHolder holder;//實(shí)現(xiàn)單布局加載if (convertView==null){view=inflater.inflate(R.layout.xlistview_item,null);//實(shí)現(xiàn)緩存控件holder = new ViewHolder();holder.text = (TextView) view.findViewById(R.id.text);holder.select_tv = (TextView) view.findViewById(R.id.select_tv); //將holder與view綁定緩存 view.setTag(holder); }else { //直接顯示控件 view = convertView ; holder = (ViewHolder) view.getTag(); } //獲得指定位置的數(shù)據(jù),若定位的是所選控件,則改變它的visible屬性。 String data = datas.get(position); if(selectedPosition== position) { holder.select_tv.setVisibility(View.VISIBLE); }else { holder.select_tv.setVisibility(View.INVISIBLE); } //將數(shù)據(jù)展示出來(lái) holder.text.setText(data); return view; } //緩存控件的ViewHolder類 class ViewHolder{ TextView text ; TextView select_tv; }}5.在MainActivity中聲明并注冊(cè)Xlistview,初始化數(shù)據(jù)源和適配器,并設(shè)置給Xlistview實(shí)現(xiàn)代碼。(至此將實(shí)現(xiàn)listview基本效果)
//implements XListView.IXListViewListener的意思是將會(huì)提供刷新和加載這兩個(gè)方法讓你進(jìn)行重寫(xiě),你只要在里面放入你要處理的數(shù)據(jù)就可以了。public class MainActivity extends Activity implements XListView.IXListViewListener {//首先聲明各個(gè)變量,包括Xlistview控件,數(shù)據(jù)源datas,適配器adapter等//flag表示你每次刷新的時(shí)候的標(biāo)記。 ArrayList<String> datas; MyBaseAdapter adapter; XListView xListView; boolean flag = false; @Override PRotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化方法 init(); }//進(jìn)行初始化 private void init() { //初始化xlistview xListView = (XListView) findViewById(R.id.xListView); //初始化數(shù)據(jù)源和數(shù)據(jù) datas = new ArrayList<String>(); getData1(); //初始化適配器并為Xlistview綁定適配器 adapter = new MyBaseAdapter(datas,MainActivity.this); xListView.setAdapter(adapter);//以上方法即可實(shí)現(xiàn)簡(jiǎn)單類似listview的展示效果,以下就是上拉刷新下拉加載的代碼部分 //為xlistview設(shè)置監(jiān)聽(tīng)事件,重寫(xiě)刷新加載的兩個(gè)方法 xListView.setXListViewListener(this); //設(shè)置xlistview允許上拉加載更多 xListView.setPullLoadEnable(true); //設(shè)置xlistview的item點(diǎn)擊事件,顯示單選功能 xListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {//點(diǎn)擊item的時(shí)候講adapter的selectedPosition的值設(shè)定為當(dāng)前點(diǎn)擊的item位置(因?yàn)閤listview有個(gè)默認(rèn)的標(biāo)題欄占據(jù)了一個(gè)位置,所以要減1)adapter.selectedPosition = position-1 ;//只要是adapter里面的數(shù)據(jù)發(fā)生了變化就必須要調(diào)用notifyDataSetChanged通知改變 adapter.notifyDataSetChanged(); } }); }//初始化的數(shù)據(jù) private void getData1() { datas.add("趙云"); datas.add("關(guān)羽"); datas.add("劉備"); datas.add("曹操"); datas.add("貂蟬"); datas.add("呂布"); datas.add("李師師"); } //刷新的數(shù)據(jù) private void getData2() { datas.add("常勝將軍"); datas.add("漢壽亭候"); datas.add("仁君"); datas.add("奸雄"); datas.add("三國(guó)新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注