Android 单击按钮时的ListView自定义
我有一个自定义listview和一个自定义适配器。布局如下: 现在,我有一个默认隐藏的复选框(在customlistlayout中定义)。我希望它在用户按下删除按钮时出现 我尝试设置Android 单击按钮时的ListView自定义,android,listview,Android,Listview,我有一个自定义listview和一个自定义适配器。布局如下: 现在,我有一个默认隐藏的复选框(在customlistlayout中定义)。我希望它在用户按下删除按钮时出现 我尝试设置setVisibility(View.VISIBLE)在按钮onclicklistener中,但应用程序崩溃。 我怎样才能做到这一点。谢谢你的帮助 Log Cat`12-23 22:27:54.236: E/AndroidRuntime(18681): FATAL EXCEPTION: main 12-23 22:
setVisibility(View.VISIBLE)代码>在按钮onclicklistener中,但应用程序崩溃。
我怎样才能做到这一点。谢谢你的帮助
Log Cat`12-23 22:27:54.236: E/AndroidRuntime(18681): FATAL EXCEPTION: main
12-23 22:27:54.236: E/AndroidRuntime(18681): Process: com.testing.callreminder, PID: 18681
12-23 22:27:54.236: E/AndroidRuntime(18681): java.lang.NullPointerException
12-23 22:27:54.236: E/AndroidRuntime(18681): at com.testing.callreminder.MainActivity.onClick(MainActivity.java:130)
12-23 22:27:54.236: E/AndroidRuntime(18681): at android.view.View.performClick(View.java:4633)
12-23 22:27:54.236: E/AndroidRuntime(18681): at android.view.View$PerformClick.run(View.java:19330)
12-23 22:27:54.236: E/AndroidRuntime(18681): at android.os.Handler.handleCallback(Handler.java:733)
12-23 22:27:54.236: E/AndroidRuntime(18681): at android.os.Handler.dispatchMessage(Handler.java:95)
12-23 22:27:54.236: E/AndroidRuntime(18681): at android.app.ActivityThread.main(ActivityThread.java:5356)
12-23 22:27:54.236: E/AndroidRuntime(18681): at java.lang.reflect.Method.invokeNative(Native Method)
12-23 22:27:54.236: E/AndroidRuntime(18681): at java.lang.reflect.Method.invoke(Method.java:515)
12-23 22:27:54.236: E/AndroidRuntime(18681): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
12-23 22:27:54.236: E/AndroidRuntime(18681): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
布局的OnClickListener实现:
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId())
{
case R.id.btn_add :
Intent next = new Intent("com.testing.callreminder.ADDITEM");
startActivity(next);
break;
case R.id.btn_delete:
chk.setVisibility(View.VISIBLE);
break;
default:
chk.setVisibility(View.GONE);
break;
}
}
自定义适配器
public class MenuListAdapter extends BaseAdapter {
boolean i;
Context c;
ArrayList<MenuListItems> menuList;
public MenuListAdapter(Context context, ArrayList<MenuListItems> list){
c=context;
menuList=list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return menuList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return menuList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public void setCheckBoxVisibility(boolean visible) {
i = visible;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
MenuListItems menuListItems = menuList.get(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) c
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.customlist, parent, false);
}
if(i){
CheckBox ck = (CheckBox) convertView.findViewById(R.id.delBox);
ck.setVisibility(View.VISIBLE);
notifyDataSetChanged();
}
TextView id = (TextView) convertView.findViewById(R.id.tvhide);
id.setText(menuListItems.getSlno());
TextView title = (TextView) convertView.findViewById(R.id.tvtitle);
title.setText(menuListItems.getTitle());
TextView phone = (TextView) convertView.findViewById(R.id.tvpnumber);
phone.setText(menuListItems.getPhone());
return convertView;
}
}
公共类MenuListAdapter扩展BaseAdapter{
布尔i;
上下文c;
ArrayList menuList;
公共MenuListAdapter(上下文、ArrayList列表){
c=上下文;
menuList=列表;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回menuList.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回menuList.get(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
public void setCheckBoxVisibility(布尔可见){
i=可见;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
MenuListItems MenuListItems=menuList.get(位置);
if(convertView==null){
LayoutInflater充气机=(LayoutInflater)c
.getSystemService(上下文布局\充气机\服务);
convertView=充气机。充气(R.layout.customlist,父项,false);
}
如果(i){
复选框ck=(复选框)convertView.findViewById(R.id.delBox);
ck.setVisibility(View.VISIBLE);
notifyDataSetChanged();
}
TextView id=(TextView)convertView.findViewById(R.id.tvhide);
id.setText(menuListItems.getSlno());
TextView title=(TextView)convertView.findViewById(R.id.tvtitle);
title.setText(menuListItems.getTitle());
TextView电话=(TextView)convertView.findViewById(R.id.tvpnumber);
setText(menuListItems.getPhone());
返回视图;
}
}
在适配器上创建一个方法,如“setCheckBoxVisibility(boolean visible)”;在该方法中,您将布尔值保存到一个私有字段中,并调用notifyDataSetChanged();在getView方法中,您将检查此字段并设置可见性
public class MenuListAdapter extends BaseAdapter {
boolean i;
boolean showCheckbox;
Context c;
ArrayList<MenuListItems> menuList;
public MenuListAdapter(Context context, ArrayList<MenuListItems> list){
c=context;
menuList=list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return menuList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return menuList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public void setCheckBoxVisibility(boolean visible) {
i = visible;
notifyDataSetChanged(); //notify dataset changed here
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
MenuListItems menuListItems = menuList.get(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) c
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.customlist, parent, false);
}
if(i){
CheckBox ck = (CheckBox) convertView.findViewById(R.id.delBox);
if(i)
ck.setVisibility(View.VISIBLE);
else
ck.setVisibility(View.GONE);
}
TextView id = (TextView) convertView.findViewById(R.id.tvhide);
id.setText(menuListItems.getSlno());
TextView title = (TextView) convertView.findViewById(R.id.tvtitle);
title.setText(menuListItems.getTitle());
TextView phone = (TextView) convertView.findViewById(R.id.tvpnumber);
phone.setText(menuListItems.getPhone());
return convertView;
}
}
公共类MenuListAdapter扩展BaseAdapter{
布尔i;
布尔显示复选框;
上下文c;
ArrayList menuList;
公共MenuListAdapter(上下文、ArrayList列表){
c=上下文;
menuList=列表;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回menuList.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回menuList.get(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
public void setCheckBoxVisibility(布尔可见){
i=可见;
notifyDataSetChanged();//此处更改了notify数据集
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
MenuListItems MenuListItems=menuList.get(位置);
if(convertView==null){
LayoutInflater充气机=(LayoutInflater)c
.getSystemService(上下文布局\充气机\服务);
convertView=充气机。充气(R.layout.customlist,父项,false);
}
如果(i){
复选框ck=(复选框)convertView.findViewById(R.id.delBox);
如果(i)
ck.setVisibility(View.VISIBLE);
其他的
ck.setVisibility(View.GONE);
}
TextView id=(TextView)convertView.findViewById(R.id.tvhide);
id.setText(menuListItems.getSlno());
TextView title=(TextView)convertView.findViewById(R.id.tvtitle);
title.setText(menuListItems.getTitle());
TextView电话=(TextView)convertView.findViewById(R.id.tvpnumber);
setText(menuListItems.getPhone());
返回视图;
}
}
请提供一些代码和堆栈跟踪(应用程序崩溃的原因)张贴日志猫错误trace@sockeqweRohit在MainActivity.java中发布了检查行130。。。我猜变量chk是空的@sockeqwe 130是chk.setVisibility(View.VISIBLE),我不知道它为什么会抛出一个错误我是新来的,你能不能用一个片段来进一步解释一下?请?我会努力的,对不起,我的英语不好。该复选框不在活动中,但在ListViewItem中,您需要循环查看listview中的所有项目并逐个进行更改。使我显示的方式更简单,因为您只对listview重新充电,getView方法负责更改;打破还有一个问题,现在如果我选择first listitem并向下滚动下一个集合,下一个集合中的第一个项目将被自动检查。如何解决?是的,为了提高性能,重新使用相同的视图,最好的方法是将检查的值存储在MenuListItems实例中。创建一个属性并像ck.setChecked(menuListItems.getChecked())那样使用您的值;