如何从列表项调用按钮? [英] How to invoke button from inside ListItem?
问题描述
我创建一个的LinearLayout
与下面的XML code列表项
< LinearLayout中的xmlns:机器人=http://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:机器人=http://schemas.android.com/apk/res/android
的xmlns:广告=http://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_centerHorizontal =真
机器人: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屋!