ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.

本篇主要功能.

通过xml pull解析得到数据,然后通过自定义的Adapter绑定数据源,ListView绑定适配器,并且实现Item项的点击事件以及子View控件的点击事件.


一.实体类.

Book.java

package cn.skychi.news;

/**
 * @package : cn.skychi.news
 * @description: 实体类.
 * @author : qc
 * @version : v1.0
 * @date : 2012-11-29 下午2:45:49
 */

public class Book
{
    private int id;

    private String name;

    private float price;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public float getPrice()
    {
        return price;
    }

    public void setPrice(float price)
    {
        this.price = price;
    }

    @Override
    public String toString()
    {
        return this.id + ":" + this.name + ":" + this.price;
    }

}

二.xmlPull解析.


package cn.skychi.parser;

/**
 * @package : cn.skychi.parser
 * @description:
 * @author : qc
 * @version : v1.0
 * @date : 2012-11-29 下午2:49:00
 */

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import cn.skychi.news.Book;

import android.content.Context;
import android.util.Log;
import android.util.Xml;

public class PullParseService
{
    public static List<Book> getBooks(Context context) throws Exception
    {
        List<Book> books = null;
        Book book = null;
        InputStream inputStream = context.getResources().getAssets()
                .open("book.xml");
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(inputStream, "UTF-8");

        int event = parser.getEventType();// 产生第一个事件
        while (event != XmlPullParser.END_DOCUMENT)
        {
            switch (event)
            {
            case XmlPullParser.START_DOCUMENT:// 判断当前事件是否是文档开始事件
                books = new ArrayList<Book>();// 初始化books集合
                break;
            case XmlPullParser.START_TAG:// 判断当前事件是否是标签元素开始事件
                if ("book".equals(parser.getName()))
                {// 判断开始标签元素是否是book
                    book = new Book();
                    book.setId(Integer.parseInt(parser.getAttributeValue(0)));// 得到book标签的属性值,并设置book的id
                }
                if (book != null)
                {
                    if ("name".equals(parser.getName()))
                    {// 判断开始标签元素是否是name
                        book.setName(parser.nextText());
                    }
                    else if ("price".equals(parser.getName()))
                    {// 判断开始标签元素是否是price
                        book.setPrice(Float.parseFloat(parser.nextText()));
                    }
                    Log.d("TAG", "" + book.toString());
                }
                break;
            case XmlPullParser.END_TAG:// 判断当前事件是否是标签元素结束事件
                if ("book".equals(parser.getName()))
                {// 判断结束标签元素是否是book
                    books.add(book);// 将book添加到books集合
                    book = null;
                }
                break;
            }
            event = parser.next();// 进入下一个元素并触发相应事件
        }// end while
        return books;
    }
}

三.MainActivity

package cn.skychi;

import java.util.ArrayList;
import java.util.List;

import cn.skychi.news.Book;
import cn.skychi.news.NewsInfo;
import cn.skychi.parser.NewsPullParser;
import cn.skychi.parser.PullParseService;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity
{
    private ListView newsListView;

    private ArrayList<NewsInfo> newsInfoList;

    private List<Book> bookList;

    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        newsListView = (ListView) findViewById(R.id.listView);
        try
        {
            bookList = PullParseService.getBooks(this);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        adapter = new MyAdapter(this, bookList);

        newsListView.setAdapter(adapter);

        newsListView
                .setOnItemClickListener(new AdapterView.OnItemClickListener()
                {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id)
                    {
                        Toast.makeText(
                                MainActivity.this,
                                "position = " + position + "\n" + "第" + id
                                        + "行", 3000).show();
                    }
                });
    }

    private class MyAdapter extends BaseAdapter
    {
        private Context context;

        private List<Book> book;

        private LayoutInflater inflater;

        public MyAdapter(Context context, List<Book> book)
        {
            super();
            this.context = context;
            this.book = book;
            inflater = LayoutInflater.from(context);

        }

        class ViewHolder
        {
            ImageView picture;

            TextView name;

            TextView price;

            ImageButton arrowPicture;

        }

        @Override
        public Object getItem(int position)
        {

            return book.get(position);
        }

        @Override
        public long getItemId(int position)
        {

            return position;
        }

        @Override
        public View getView(final int position, View convertView,
                ViewGroup parent)
        {
            ViewHolder holder = new ViewHolder();
            if (convertView == null)
            {
                convertView = inflater.inflate(R.layout.news_item, null);
                holder.picture = (ImageView) convertView
                        .findViewById(R.id.newsImage);
                convertView.setTag(holder);
                holder.name = (TextView) convertView
                        .findViewById(R.id.newsTitle);
                holder.price = (TextView) convertView
                        .findViewById(R.id.newsDate);

                holder.arrowPicture = (ImageButton) convertView
                        .findViewById(R.id.menuSend);
            }
            else
            {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.name.setText(book.get(position).getName());
            holder.price.setText(String.valueOf(book.get(position).getPrice()));
            holder.arrowPicture
                    .setImageResource(android.R.drawable.ic_menu_more);
            holder.picture.setImageResource(R.drawable.ic_launcher);

            holder.arrowPicture.setOnClickListener(new View.OnClickListener()
            {

                @Override
                public void onClick(View v)
                {
                    showDetailDialog(book, position);
                }
            });

            return convertView;
        }

        @Override
        public int getCount()
        {
            return book.size();
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is
        // present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void showDetailDialog(List<Book> book, int position)
    {
        if (book != null && position >= 0)
        {

            new AlertDialog.Builder(MainActivity.this)
                    .setTitle("详细信息")
                    .setMessage(
                            "Name :" + "\n" + book.get(position).getName()
                                    + "\n\n" + "Price :" + "\n"
                                    + +book.get(position).getPrice() + "\n")
                    .setPositiveButton("ok",
                            new DialogInterface.OnClickListener()
                            {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which)
                                {
                                    dialog.cancel();
                                }
                            }).show();
        }
    }

}
四.assert目录下.book.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book>
	<book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book>
	
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book><book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book>
</books>




五.布局文件:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
         >
    </ListView>

</RelativeLayout>

news_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/newsInfoLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants" >

    <TextView
        android:id="@+id/newsTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/newsImage"
        android:layout_marginLeft="20dp"
        android:layout_toLeftOf="@+id/menuSend"
        android:layout_toRightOf="@+id/newsImage"
        android:ellipsize="middle"
        android:singleLine="true"
        android:text="TextView" />

    <!--
             <TextView
            android:id="@+id/newsContent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/newsDate"
            android:layout_alignLeft="@+id/newsTitle"
            android:layout_below="@+id/newsTitle"
            android:layout_toLeftOf="@+id/menuSend"
            android:visibility="gone" />
    -->

    <TextView
        android:id="@+id/newsDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/newsImage"
        android:layout_marginLeft="20dp"
        android:layout_toLeftOf="@+id/menuSend"
        android:layout_toRightOf="@+id/newsImage"
        android:singleLine="true"
        android:text="TextView" />

    <ImageView
        android:id="@+id/newsImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="30dp"
        android:src="@drawable/ic_launcher" />

    <ImageButton
        android:id="@+id/menuSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="19dp"
        android:background="#ff00ff"
        android:clickable="false"
        android:focusable="false"
        android:src="@android:drawable/ic_menu_more" />

</RelativeLayout>

说明:在实现listview item 项以及View控件的监听时要在news_item.xml 中进行配置.即:

android:descendantFocusability="blocksDescendants" 以及android:clickable="false"android:focusable="false"

否则,item 点击事件不会执行.






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现省份和城市的联动选择和显示,可以使用两个ListView控件,一个用于显示省份,另一个用于显示城市。当用户选择某个省份时,根据该省份所属的城市列表,更新城市ListView数据源。 以下是一个简单的实现过程: 1. 在布局文件中添加两个ListView控件,分别用于显示省份和城市: ```xml <ListView android:id="@+id/province_list" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ListView android:id="@+id/city_list" android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 2. 在代码中获取两个ListView控件的引用,并设置适配器: ```java ListView provinceList = findViewById(R.id.province_list); ListView cityList = findViewById(R.id.city_list); // 设置省份ListView适配器 ArrayAdapter<String> provinceAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, provinceListData); provinceList.setAdapter(provinceAdapter); // 设置城市ListView适配器 ArrayAdapter<String> cityAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, cityListData); cityList.setAdapter(cityAdapter); ``` 其中,`provinceListData`和`cityListData`分别是省份和城市的数据源,可以从本地文件或网络获取。 3. 设置省份ListView的选择监听器,在选择某个省份时更新城市ListView数据源: ```java provinceList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 获取选中的省份名称 String province = provinceListData.get(position); // 根据省份名称获取城市列表 List<String> cities = getCityListByProvince(province); // 更新城市ListView数据源 cityListData.clear(); cityListData.addAll(cities); cityAdapter.notifyDataSetChanged(); } }); ``` 其中,`getCityListByProvince`是一个自定义方法,用于根据省份名称获取该省份所属的城市列表。 4. 完成以上步骤后,运行程序即可看到联动选择和显示效果。 以上是一个简单的实现过程,实际应用中可能需要更复杂的逻辑和界面设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值