如何从列表项调用按钮? [英] How to invoke button from inside ListItem?

查看:288
本文介绍了如何从列表项调用按钮?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建一个的LinearLayout 与下面的XML code列表项

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:方向=垂直
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =WRAP_CONTENT
    机器人:填充=10dip>    <的TextView
        机器人:ID =@ + ID / txtTitle
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:TEXTSTYLE =正常|大胆
        机器人:TEXTSIZE =16dip
        机器人:填充=5dip
        机器人:文字=标题
        机器人:文字颜色=#001a90/>    <的TextView
        机器人:ID =@ + ID / txtDescription
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文字样式=大胆
        机器人:TEXTSIZE =18dip
        机器人:填充=5dip
        机器人:文字=说明
        机器人:文字颜色=#000000
        机器人:textIsSelectable =FALSE/>    <按钮
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文字=新按钮
        机器人:ID =@ + ID /按钮
        安卓的onClick =myClickHandler/>    <查看
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =1DP
        机器人:ID =@ + ID / separator1
        机器人:知名度=看得见
        机器人:背景=@机器人:彩色/ darker_gray/>< / LinearLayout中>

下面的布局是包含列表中的XML:

 <的RelativeLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:广告=htt​​p://schemas.android.com/apk/res-auto
    机器人:方向=垂直
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT
    机器人:背景=@绘制/ wallpaper2a
    机器人:ID =@ + ID / rlMain>    <按钮
        机器人:layout_width =30dp
        机器人:layout_height =50dp
        机器人:文字=A-
        机器人:ID =@ + ID / btn20
        机器人:TEXTSIZE =20dp
        机器人:背景=@机器人:彩色/透明
        机器人:文字颜色=#000000
        机器人:layout_alignParentTop =真
        机器人:layout_alignParentEnd =真
        机器人:文字样式=大胆
        机器人:nestedScrollingEnabled =FALSE/>    <按钮
        机器人:layout_width =50dp
        机器人:layout_height =50dp
        机器人:文字=A +
        机器人:ID =@ + ID / btn30
        机器人:TEXTSIZE =30dp
        安卓的onClick =setTextSizeUp
        机器人:背景=@机器人:彩色/透明
        机器人:文字颜色=#000000
        机器人:layout_gravity =CENTER_HORIZONTAL
        机器人:layout_alignParentTop =真
        机器人:layout_toStartOf =@ + ID / btn20
        机器人:文字样式=大胆/>    < ListView控件
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:ID =@机器人:ID /列表
        机器人:layout_alignEnd =@ + ID / btn20
        机器人:layout_below =@ + ID / btn20
        机器人:layout_above =@ + ID / AD浏览/>    <的ImageButton
        机器人:layout_width =25dp
        机器人:layout_height =50dp
        机器人:ID =@ + ID / imageButton2
        机器人:背景=@机器人:彩色/透明
        机器人:SRC =@绘制/向上
        安卓的onClick =scrollListUp
        机器人:layout_above =@机器人:ID /列表
        机器人:layout_toStartOf =@ + ID / imageButton3/>    <的ImageButton
        机器人:layout_width =25dp
        机器人:layout_height =50dp
        机器人:ID =@ + ID / imageButton3
        机器人:背景=@机器人:彩色/透明
        机器人:SRC =@绘制/下
        安卓的onClick =scrollListDown
        机器人:layout_alignParentTop =真
        机器人:layout_toStartOf =@ + ID / imageButton6/>    <的ImageButton
        机器人:layout_width =40dp
        机器人:layout_height =50dp
        机器人:ID =@ + ID / imageButton6
        机器人:背景=@机器人:彩色/透明
        安卓的onClick =setTextColor
        机器人:layout_above =@机器人:ID /列表
        机器人:layout_toStartOf =@ + ID / btn30
        机器人:SRC =@绘制/ T/>    < com.google.android.gms.ads.AdView
        机器人:ID =@ + ID / AD浏览
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_centerHorizo​​ntal =真
        机器人:layout_alignParentBottom =真
        广告:adSize时=大旗
        广告:adUnitId设置=@字符串/ banner_ad_unit_id>
    < /com.google.android.gms.ads.AdView>
< / RelativeLayout的>

该列表是从RSS源,其中低于code将展示什么,我需要能够做的是共​​享文本单击按钮时填充。我要使用的按钮,这样我可以添加多个股票期权,如的Facebook 电子邮件 WhatsApp的

 私人无效retrieveRSSFeed(字符串urlToRssFeed,ArrayList的<&的RSSItem GT;清单)
    {
        尝试
        {
            网址URL =新的URL(urlToRssFeed);
            工厂SAXParserFactory的= SAXParserFactory.newInstance();
            的SAXParser解析器= factory.newSAXParser();
            的XMLReader的XMLReader = parser.getXMLReader();
            srcRSSParser theRssHandler =新srcRSSParser(名单);            xmlreader.setContentHandler(theRssHandler);            InputSource的是=新的InputSource(url.openStream());            xmlreader.parse(是);
        }
        赶上(例外五)
        {
            e.printStackTrace();
        }
    }    私有类RetrieveRSSFeeds扩展的AsyncTask<整数,太虚,太虚>
    {
        私人ProgressDialog进度= NULL;        @覆盖
        保护无效doInBackground(整数... PARAMS){
            retrieveRSSFeed(...........................,ITEMLIST);            rssadaptor =新RSSListAdaptor(rssfeedFragment.this.getActivity(),R.layout.rssitemview,ITEMLIST,则params [0]);            返回null;
        }        @覆盖
        保护无效onCancelled(){
            super.onCancelled();
        }        @覆盖
        在preExecute保护无效(){
            进度= ProgressDialog.show(
                    rssfeedFragment.this.getActivity(),NULL,...);            super.on preExecute();
        }        @覆盖
        保护无效onPostExecute(虚空结果){
            setListAdapter(rssadaptor);            progress.dismiss();            super.onPostExecute(结果);
        }        @覆盖
        保护无效onProgressUpdate(虚空......值){
            super.onProgressUpdate(值);
        }
    }    私有类RSSListAdaptor扩展ArrayAdapter<&的RSSItem GT; {
        私人列表<&的RSSItem GT;对象= NULL;
        私人整数txtSize;        公共RSSListAdaptor(上下文的背景下,INT textviewid,列表与LT;&的RSSItem GT;对象,整数txtSize){
            超(背景下,textviewid,对象);            this.objects =物体;
            this.txtSize = txtSize;
        }        @覆盖
        公众诠释的getCount(){
            返回((零=对象)objects.size():?0);
        }        @覆盖
        众长getItemId(INT位置){
            返回的位置;
        }        @覆盖
        公众的RSSItem的getItem(INT位置){
            返回((空=对象)objects.get(位置):空!?);
        }        公共查看getView(INT位置,查看convertView,父母的ViewGroup){
            查看查看= convertView;            如果(空==视图)
            {
                LayoutInflater VI = (LayoutInflater)rssfeedFragment.this.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                鉴于= vi.inflate(R.layout.rssitemview,NULL);
            }            数据的RSSItem = objects.get(位置);            如果(空!=数据)
            {
                TextView的标题=(TextView中)view.findViewById(R.id.txtTitle);
                // TextView的日期=(TextView中)view.findViewById(R.id.txtDate);
                TextView中描述=(TextView中)view.findViewById(R.id.txtDescription);                title.setText(data.title);
                //date.setText(\"on+ data.date);
                description.setText(data.description);
                description.setTextSize(txtSize);
                如果(txtColor == 0)
                {
                    description.setTextColor(Color.BLACK);
                }其他
                {
                    description.setTextColor(Color.WHITE);
                }
            }            返回视图。
        }
    }


解决方案

的一种方法是,创建一个自定义列表适配器。因此,你必须用ArrayAdapter(例如)扩展您的适配器类。

在您的getView(...),你可以指定一个onClickListener到每行​​的按钮,然后

 公共类EventListAdapter扩展ArrayAdapter< EventEntry> {上下文语境;
清单< EventEntry> ITEMLIST;
INT layoutResID;公共EventListAdapter(上下文的背景下,诠释layoutResourceID,列表与LT; EventEntry> listItems中){
    超(背景下,layoutResourceID,listItems中);
    this.context =背景;
    this.itemList = listItems中;
    this.layoutResID = layoutResourceID;
}公共无效setCourseView(布尔courseView){
    this.courseView = courseView;
}@覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
    // TODO自动生成方法存根    ItemHolder itemHolder;    如果(convertView == NULL){
        LayoutInflater充气=((活动)上下文).getLayoutInflater();
        itemHolder =新ItemHolder();        convertView = inflater.inflate(layoutResID,父母,假);
        itemHolder.button =(按钮)convertView.findViewById(R.id.button);
    }其他{
        itemHolder =(ItemHolder)convertView.getTag();
    }
    EventEntry项目=(EventEntry)this.itemList.get(位置);    itemHolder.button.setOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(查看视图){
//你的东西放在这里。也许回调到您的活动
        }
    });
...

有关自定义适配器的更多信息: http://www.vogella.com /tutorials/AndroidListView/article.html#adapterown

另请参见 9.4节的观点持有者模式,如使用在我的例子code。

I have create a LinearLayout for a list item with the following XML code

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dip">

    <TextView
        android:id="@+id/txtTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textStyle="normal|bold"
        android:textSize="16dip"
        android:padding="5dip"
        android:text="Title"
        android:textColor="#001a90" />

    <TextView
        android:id="@+id/txtDescription"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:textSize="18dip"
        android:padding="5dip"
        android:text="Description"
        android:textColor="#000000"
        android:textIsSelectable="false" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:onClick="myClickHandler" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:id="@+id/separator1"
        android:visibility="visible"
        android:background="@android:color/darker_gray"/>

</LinearLayout>

The below Layout is the XML which contains the list:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/wallpaper2a"
    android:id="@+id/rlMain">

    <Button
        android:layout_width="30dp"
        android:layout_height="50dp"
        android:text="A-"
        android:id="@+id/btn20"
        android:textSize="20dp"
        android:background="@android:color/transparent"
        android:textColor="#000000"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:textStyle="bold"
        android:nestedScrollingEnabled="false" />

    <Button
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="A+"
        android:id="@+id/btn30"
        android:textSize="30dp"
        android:onClick="setTextSizeUp"
        android:background="@android:color/transparent"
        android:textColor="#000000"
        android:layout_gravity="center_horizontal"
        android:layout_alignParentTop="true"
        android:layout_toStartOf="@+id/btn20"
        android:textStyle="bold" />

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@android:id/list"
        android:layout_alignEnd="@+id/btn20"
        android:layout_below="@+id/btn20"
        android:layout_above="@+id/adView" />

    <ImageButton
        android:layout_width="25dp"
        android:layout_height="50dp"
        android:id="@+id/imageButton2"
        android:background="@android:color/transparent"
        android:src="@drawable/up"
        android:onClick="scrollListUp"
        android:layout_above="@android:id/list"
        android:layout_toStartOf="@+id/imageButton3" />

    <ImageButton
        android:layout_width="25dp"
        android:layout_height="50dp"
        android:id="@+id/imageButton3"
        android:background="@android:color/transparent"
        android:src="@drawable/down"
        android:onClick="scrollListDown"
        android:layout_alignParentTop="true"
        android:layout_toStartOf="@+id/imageButton6" />

    <ImageButton
        android:layout_width="40dp"
        android:layout_height="50dp"
        android:id="@+id/imageButton6"
        android:background="@android:color/transparent"
        android:onClick="setTextColor"
        android:layout_above="@android:id/list"
        android:layout_toStartOf="@+id/btn30"
        android:src="@drawable/t" />

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="@string/banner_ad_unit_id">
    </com.google.android.gms.ads.AdView>
</RelativeLayout>

The list is populated from rss feed, which the below code will show and what I need to be able to do is share the text when a button is clicked. I want to use the button so I can add multiple share options such as facebook, email or whatsapp.

private void retrieveRSSFeed(String urlToRssFeed,ArrayList<RSSItem> list)
    {
        try
        {
            URL url = new URL(urlToRssFeed);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            XMLReader xmlreader = parser.getXMLReader();
            srcRSSParser theRssHandler = new srcRSSParser(list);

            xmlreader.setContentHandler(theRssHandler);

            InputSource is = new InputSource(url.openStream());

            xmlreader.parse(is);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private class RetrieveRSSFeeds extends AsyncTask<Integer, Void, Void>
    {
        private ProgressDialog progress = null;

        @Override
        protected Void doInBackground(Integer... params) {
            retrieveRSSFeed("..........................",itemlist);

            rssadaptor = new RSSListAdaptor(rssfeedFragment.this.getActivity(), R.layout.rssitemview,itemlist,params[0]);

            return null;
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        @Override
        protected void onPreExecute() {
            progress = ProgressDialog.show(
                    rssfeedFragment.this.getActivity(), null, "...");

            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(Void result) {
            setListAdapter(rssadaptor);

            progress.dismiss();

            super.onPostExecute(result);
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }

    private class RSSListAdaptor extends ArrayAdapter<RSSItem> {
        private List<RSSItem> objects = null;
        private Integer txtSize;

        public RSSListAdaptor(Context context, int textviewid, List<RSSItem> objects,Integer txtSize) {
            super(context, textviewid, objects);

            this.objects = objects;
            this.txtSize = txtSize;
        }

        @Override
        public int getCount() {
            return ((null != objects) ? objects.size() : 0);
        }

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

        @Override
        public RSSItem getItem(int position) {
            return ((null != objects) ? objects.get(position) : null);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;

            if(null == view)
            {
                LayoutInflater vi = (LayoutInflater)rssfeedFragment.this.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = vi.inflate(R.layout.rssitemview, null);
            }

            RSSItem data = objects.get(position);

            if(null != data)
            {
                TextView title = (TextView) view.findViewById(R.id.txtTitle);
                //TextView date = (TextView)view.findViewById(R.id.txtDate);
                TextView description = (TextView) view.findViewById(R.id.txtDescription);

                title.setText(data.title);
                //date.setText("on " + data.date);
                description.setText(data.description);
                description.setTextSize(txtSize);
                if (txtColor == 0)
                {
                    description.setTextColor(Color.BLACK);
                }else
                {
                    description.setTextColor(Color.WHITE);
                }
            }

            return view;
        }
    }

解决方案

One way would be, to create a custom list adapter. Therefor you must extend your adapter class with an ArrayAdapter (for example).

Then in your getView(...) you can assign a onClickListener to the button of each row:

public class EventListAdapter extends ArrayAdapter<EventEntry> {

Context context;
List<EventEntry> itemList;
int layoutResID;

public EventListAdapter(Context context, int layoutResourceID, List<EventEntry> listItems) {
    super(context, layoutResourceID, listItems);
    this.context = context;
    this.itemList = listItems;
    this.layoutResID = layoutResourceID;
}

public void setCourseView(boolean courseView) {
    this.courseView = courseView;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    ItemHolder itemHolder;

    if (convertView == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        itemHolder = new ItemHolder();

        convertView = inflater.inflate(layoutResID, parent, false);
        itemHolder.button = (Button) convertView.findViewById(R.id.button);
    } else {
        itemHolder = (ItemHolder) convertView.getTag();
    }
    EventEntry item = (EventEntry) this.itemList.get(position);

    itemHolder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
//your stuff goes here. Maybe a callback to your activity
        }
    });
...

For more information about Custom Adapters: http://www.vogella.com/tutorials/AndroidListView/article.html#adapterown

Also see section 9.4 for the view holder pattern, as used in my sample code.

这篇关于如何从列表项调用按钮?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆