Android 如何从ListView行中单击的按钮显示AlertDialog?

Android 如何从ListView行中单击的按钮显示AlertDialog?,android,listview,android-alertdialog,Android,Listview,Android Alertdialog,我用一个基本适配器填充ListView,这样除了最后一个项目外,所有项目都将是复选框,最后一个项目将是带有按钮的TextView 下面是XML文件 最后一项: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layou

我用一个基本适配器填充ListView,这样除了最后一个项目外,所有项目都将是复选框,最后一个项目将是带有按钮的TextView

下面是XML文件

最后一项:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView 
    android:id="@+id/tv_newitem"
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:layout_weight="3"
    android:text="@string/new_account_text"
    />
<Button 
    android:id="@+id/b_newitem"
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:layout_weight="2"
    android:text="@string/add_button_text"
    android:onClick="showNewAccountDialog"
    />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 >
<CheckBox 
    android:focusable="true" 
    android:id="@+id/account_item_cb" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
 ></CheckBox>       
</LinearLayout>
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;


public class AccountListAdapter extends BaseAdapter{

private static final int TYPE_ACCOUNT = 0;
private static final int TYPE_NEW_ACCOUNT = 1;
private static final int TYPE_MAX_COUNT = 2;


private LayoutInflater mInflator;
private ArrayList<String> mStrings;
private ArrayList<String> mSelectedStrings;


public AccountListAdapter(Context context, ArrayList<String> array)
{
    mInflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mStrings = array;

    mSelectedStrings = new ArrayList<String>();
}

public void addNewAccount(final String accountName)
{
    mStrings.add(mStrings.size()-2, accountName);
    notifyDataSetChanged();
}


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

@Override
public String getItem(int position)
{
    return mStrings.get(position);
}

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

@Override
public int getViewTypeCount()
{
    return TYPE_MAX_COUNT;
}

@Override
public int getItemViewType(int position)
{

    return position == mStrings.size()-1 ? TYPE_NEW_ACCOUNT : TYPE_ACCOUNT;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    int type = getItemViewType(position);
    System.out.println(position + ": " + type);
    switch (type) {
    case TYPE_ACCOUNT:
        convertView = mInflator.inflate(R.layout.account_item, null);
        CheckBox tv = (CheckBox) convertView.findViewById(R.id.account_item_cb);
        tv.setText(getItem(position));
        tv.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked)
                {
                    mSelectedStrings.add(buttonView.getText().toString());
                }else {
                    mSelectedStrings.remove(buttonView.getText().toString());
                }   
            }
        });
        break;
    case TYPE_NEW_ACCOUNT:
        convertView = mInflator.inflate(R.layout.list_new_item_add_button, null);
        break;
    default:
        break;
    }

    return convertView;

}


public ArrayList<String> getSelectedStrings()
{
    return mSelectedStrings;
}
}

复选框:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView 
    android:id="@+id/tv_newitem"
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:layout_weight="3"
    android:text="@string/new_account_text"
    />
<Button 
    android:id="@+id/b_newitem"
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:layout_weight="2"
    android:text="@string/add_button_text"
    android:onClick="showNewAccountDialog"
    />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 >
<CheckBox 
    android:focusable="true" 
    android:id="@+id/account_item_cb" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
 ></CheckBox>       
</LinearLayout>
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;


public class AccountListAdapter extends BaseAdapter{

private static final int TYPE_ACCOUNT = 0;
private static final int TYPE_NEW_ACCOUNT = 1;
private static final int TYPE_MAX_COUNT = 2;


private LayoutInflater mInflator;
private ArrayList<String> mStrings;
private ArrayList<String> mSelectedStrings;


public AccountListAdapter(Context context, ArrayList<String> array)
{
    mInflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mStrings = array;

    mSelectedStrings = new ArrayList<String>();
}

public void addNewAccount(final String accountName)
{
    mStrings.add(mStrings.size()-2, accountName);
    notifyDataSetChanged();
}


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

@Override
public String getItem(int position)
{
    return mStrings.get(position);
}

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

@Override
public int getViewTypeCount()
{
    return TYPE_MAX_COUNT;
}

@Override
public int getItemViewType(int position)
{

    return position == mStrings.size()-1 ? TYPE_NEW_ACCOUNT : TYPE_ACCOUNT;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    int type = getItemViewType(position);
    System.out.println(position + ": " + type);
    switch (type) {
    case TYPE_ACCOUNT:
        convertView = mInflator.inflate(R.layout.account_item, null);
        CheckBox tv = (CheckBox) convertView.findViewById(R.id.account_item_cb);
        tv.setText(getItem(position));
        tv.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked)
                {
                    mSelectedStrings.add(buttonView.getText().toString());
                }else {
                    mSelectedStrings.remove(buttonView.getText().toString());
                }   
            }
        });
        break;
    case TYPE_NEW_ACCOUNT:
        convertView = mInflator.inflate(R.layout.list_new_item_add_button, null);
        break;
    default:
        break;
    }

    return convertView;

}


public ArrayList<String> getSelectedStrings()
{
    return mSelectedStrings;
}
}

这是基本适配器的类文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView 
    android:id="@+id/tv_newitem"
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:layout_weight="3"
    android:text="@string/new_account_text"
    />
<Button 
    android:id="@+id/b_newitem"
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:layout_weight="2"
    android:text="@string/add_button_text"
    android:onClick="showNewAccountDialog"
    />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 >
<CheckBox 
    android:focusable="true" 
    android:id="@+id/account_item_cb" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
 ></CheckBox>       
</LinearLayout>
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;


public class AccountListAdapter extends BaseAdapter{

private static final int TYPE_ACCOUNT = 0;
private static final int TYPE_NEW_ACCOUNT = 1;
private static final int TYPE_MAX_COUNT = 2;


private LayoutInflater mInflator;
private ArrayList<String> mStrings;
private ArrayList<String> mSelectedStrings;


public AccountListAdapter(Context context, ArrayList<String> array)
{
    mInflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mStrings = array;

    mSelectedStrings = new ArrayList<String>();
}

public void addNewAccount(final String accountName)
{
    mStrings.add(mStrings.size()-2, accountName);
    notifyDataSetChanged();
}


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

@Override
public String getItem(int position)
{
    return mStrings.get(position);
}

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

@Override
public int getViewTypeCount()
{
    return TYPE_MAX_COUNT;
}

@Override
public int getItemViewType(int position)
{

    return position == mStrings.size()-1 ? TYPE_NEW_ACCOUNT : TYPE_ACCOUNT;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    int type = getItemViewType(position);
    System.out.println(position + ": " + type);
    switch (type) {
    case TYPE_ACCOUNT:
        convertView = mInflator.inflate(R.layout.account_item, null);
        CheckBox tv = (CheckBox) convertView.findViewById(R.id.account_item_cb);
        tv.setText(getItem(position));
        tv.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked)
                {
                    mSelectedStrings.add(buttonView.getText().toString());
                }else {
                    mSelectedStrings.remove(buttonView.getText().toString());
                }   
            }
        });
        break;
    case TYPE_NEW_ACCOUNT:
        convertView = mInflator.inflate(R.layout.list_new_item_add_button, null);
        break;
    default:
        break;
    }

    return convertView;

}


public ArrayList<String> getSelectedStrings()
{
    return mSelectedStrings;
}
}
import java.util.ArrayList;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.CheckBox;
导入android.widget.CompoundButton;
导入android.widget.CompoundButton.OnCheckedChangeListener;
公共类AccountListAdapter扩展了BaseAdapter{
私有静态最终整数类型_帐户=0;
私有静态最终整数类型\新\帐户=1;
私有静态最终整数类型_MAX_COUNT=2;
私人公寓;
私有数组列表mStrings;
私有ArrayList mSelectedStrings;
公共AccountListAdapter(上下文上下文,ArrayList数组)
{
mInflator=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
mStrings=数组;
mSelectedStrings=newarraylist();
}
public void addNewAccount(最终字符串accountName)
{
添加(mStrings.size()-2,accountName);
notifyDataSetChanged();
}
@凌驾
public int getCount()
{
返回mStrings.size();
}
@凌驾
公共字符串getItem(int位置)
{
返回mStrings.get(位置);
}
@凌驾
公共长getItemId(int位置)
{
返回位置;
}
@凌驾
public int getViewTypeCount()
{
返回类型\最大\计数;
}
@凌驾
public int getItemViewType(int位置)
{
返回位置==mStrings.size()-1?类型\新\科目:类型\科目;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
int type=getItemViewType(位置);
系统输出打印项次(位置+“:”+类型);
开关(类型){
案例类型\u账户:
convertView=mInflator.inflate(R.layout.account\u项目,空);
复选框tv=(复选框)convertView.findViewById(R.id.account\u item\u cb);
tv.setText(getItem(position));
setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//TODO自动生成的方法存根
如果(已检查)
{
mSelectedStrings.add(buttonView.getText().toString());
}否则{
mSelectedStrings.remove(buttonView.getText().toString());
}   
}
});
打破
案例类型新账户:
convertView=mInflator.充气(R.layout.list\u new\u item\u add\u按钮,空);
打破
违约:
打破
}
返回视图;
}
公共ArrayList getSelectedStrings()
{
返回mSelectedStrings;
}
}
有一个活动调用将填充此基本适配器,它将包含一个字符串数组列表。我试图在单击“添加”按钮时向用户显示一个对话框。但是我不能展示它。我试过:

  • 在XML文件中添加android:onClick=method并在主活动文件中写入相应的方法,但Eclipse找不到该函数。我认为它正在基类适配器中寻找函数。但问题是我无法编写代码来在基本适配器类中显示AlertBox,因为无法从那里访问getSupportFragmentManager

  • 使用findViewById将onClickListener添加到按钮,但Eclipse在这里给了我NullPointerException。我认为这是因为按钮放在ListView中,而不是直接放在活动中

有人能帮我吗

谢谢

您需要实施

麦克利克监听器

@覆盖
public void onItemClick(适配器视图arg0、视图arg1、内部位置、长arg3)
检查,按照示例在活动中实现接口,并在创建接口时将其传递给适配器

您只需将打开的对话框代码放在活动的接口方法中,并在单击按钮时在适配器中调用它

将其放在活动中的某个地方:(这也可以通过使活动实现接口来实现)

更改适配器构造函数以包括接口:

AccountListAdapter(Context context, ArrayList<String> array, DialogCreatorInterface dialogCreatorInterface)

我必须在基本适配器类中实现它?我如何才能显示我的警报对话框?不,您需要在获取此列表的活动中实现它。您需要将侦听器添加到列表中。我尝试将onAttach方法添加到我的适配器中,但它表示BaseAdapter的onAttach未定义。是否因为我从BaseAdapter扩展ListAdapter而出现问题?您不需要,只需创建接口,在活动中实现它,并将其传递给构造函数中的适配器,以便可以调用在活动中实现的方法。