Android 如何从ListItem内部调用按钮?
我已经使用以下XML代码为列表项创建了一个Android 如何从ListItem内部调用按钮?,android,android-listview,rss,share,listadapter,Android,Android Listview,Rss,Share,Listadapter,我已经使用以下XML代码为列表项创建了一个LinearLayout <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="10di
LinearLayout
<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>
一种方法是创建自定义列表适配器。因此,必须使用ArrayAdapter扩展适配器类(例如) 然后,在getView(…)中,可以为每行的按钮分配一个onClickListener:
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
}
});
...
公共类EventListAdapter扩展了ArrayAdapter{
语境;
清单项目清单;
int layoutResID;
public EventListAdapter(上下文上下文、int-layoutResourceID、列表项){
超级(上下文、布局资源ID、列表项);
this.context=上下文;
this.itemList=列表项;
this.layoutResID=layoutResourceID;
}
public void setCourseView(布尔courseView){
this.courseView=courseView;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
项目持有人项目持有人;
if(convertView==null){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
itemHolder=新的itemHolder();
convertView=充气机。充气(layoutResID,父项,false);
itemHolder.button=(button)convertView.findViewById(R.id.button);
}否则{
itemHolder=(itemHolder)convertView.getTag();
}
EventEntry item=(EventEntry)this.itemList.get(position);
itemHolder.button.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//你的东西放在这里,也许是回拨你的活动
}
});
...
有关自定义适配器的详细信息:
另请参见查看我的示例代码中使用的视图保持器模式
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;
}
}
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
}
});
...