我使用基本适配器填充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;
}
}
有一个Activity调用,填充此基本适配器将是String的String列表。我想在单击“添加”按钮时向用户显示一个对话框。但我无法证明这一点。我试过了:
在XML文件中添加android:onClick =方法并在主活动文件中编写相应的方法,但Eclipse无法找到该函数。我认为它正在寻找基本适配器类中的函数。但问题是我无法编写代码来在Base Adapter类中显示AlertBox,因为无法从那里访问 getSupportFragmentManager 。
使用findViewById将onClickListener添加到Button,但Eclipse在此处为我提供了 NullPointerException 。我认为这是因为按钮放在ListView中,而不是直接放在Activity中。
有人可以帮助我吗?
谢谢!
答案 0 :(得分:0)
您需要实施
OnItemClickListener
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
答案 1 :(得分:0)
检查this,按照示例在活动中实现接口,并在创建时将其传递给适配器。
您只需将打开的对话框代码放在活动的interface方法中,并在单击按钮时在适配器中调用它。
将此放置在您的活动中:(也可以通过使活动实现界面来完成)
public interface DialogCreatorInterface{
public void showDialog();
}
DialogCreatorInterface dialogCreatorInterface = new DialogCreatorInterface() {
@Override
public void showDialog() {
//Create and show the dialog code
}
};
更改适配器构造函数以包含接口:
AccountListAdapter(Context context, ArrayList<String> array, DialogCreatorInterface dialogCreatorInterface)
在TYPE_NEW_ACCOUNT
方法的getView
下添加此内容:
Button button = (Button) convertView.findViewById(R.id.b_newitem);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Call open AlerDialog in activity via the interface
dialogCreatorInterface.showDialog();
}
});