如何在安卓弹出框中添加自定义列表视图

6
我有一个场景,在这个场景中,当我点击按钮时,我希望AlertDialog弹出。AlertDialog是一个自定义的警报对话框,因为它有自定义的Listview。
我正在使用以下代码将AlertDialog分配给按钮的OnClick:
 top.setOnClickListener(new OnClickListener() {
 Context mcontext;
 @Override
 public void onClick(View arg0) {
 // TODO Auto-generated method stub
 LayoutInflater li = LayoutInflater.from(getActivity());
 View view= li.inflate(R.layout.topingslist, null);

 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
 alertDialogBuilder.setView(view);
 ListView lv2 = (ListView) getActivity().findViewById(R.id.toplist);
 ArrayList<SearchResultsToping> results1 = new ArrayList<SearchResultsToping>();
 SearchResultsToping sr1;                                               
 sr1 = new SearchResultsToping();
 sr1.setToppingname("cheese");
 results1.add(sr1);
 MyCustomBaseAdapterTop arrayAdapter=new MyCustomBaseAdapterTop(getActivity(), results1);
 lv2.setAdapter(arrayAdapter);
 lv2.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
    // TODO Auto-generated method stub
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub

    }

    });

   alertDialogBuilder
        .setCancelable(false)
        .setPositiveButton("OK",new DialogInterface.OnClickListener() 
                  public void onClick(DialogInterface dialog,int id) {
                      })
        .setNegativeButton("Cancel",  new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog,int id) {
                    dialog.cancel()
               }
            });

        // create alert dialog
        AlertDialog alertDialog = alertDialogBuilder.create();
        // show it
        alertDialog.show();
    }
  });

这是我的自定义Baseadapter用于自定义listview。
public class MyCustomBaseAdapterTop extends BaseAdapter {
    private static ArrayList<SearchResultsToping> searchArrayListtop;
    private LayoutInflater mInflater;
     Context ctx=null;

     public MyCustomBaseAdapterTop(Activity activty, ArrayList<SearchResultsToping> results1) {
          searchArrayListtop = results1;

          this.ctx=activty;
          mInflater = activty.getLayoutInflater();  

    }


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
    //  return 0;
        return searchArrayListtop.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;

        //return searchArrayListtop.get(arg0);
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int arg0, View convertView, ViewGroup arg2) {
        // TODO Auto-generated method stub

        final ViewHolder holder;
        if (convertView == null) {

            Log.d("base", "listbase");
       convertView = mInflater.inflate(R.layout.each_toping, null);
       holder = new ViewHolder();


      holder.txttopname = (TextView) convertView.findViewById(R.id.topname);


       convertView.setTag(holder);
      } else {
       holder = (ViewHolder) convertView.getTag();
      }

      holder.txttopname.setText(searchArrayListtop.get(arg0).getToppingname());
      return convertView;

}
static class ViewHolder {
        TextView txttopname;
        }

}

这是topinglist.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="vertical" >
      <ListView 
            android:id="@+id/toplist" 
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:cacheColorHint="#0000"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp" />        
</LinearLayout>

我在将 Adapter 设置到 Listview 上的这一行代码中 lv2.setAdapter(arrayAdapter); 遇到了 NullPointerException,请帮助我解决。


请发布您的 R.layout.topingslist 布局代码。 - SathishKumar
我已经添加了代码。 - Ankita Deshmukh
你有加入我下面的代码 ListView lv2 = (ListView) view.findViewById(R.id.toplist); 吗? - SathishKumar
2个回答

5
在警告对话框构建器中更改以下行:
ListView lv2 = (ListView) getActivity().findViewById(R.id.toplist);

使用

ListView lv2 = (ListView) view.findViewById(R.id.toplist);

0

使用DialogFragment

将ListView添加到其中并设置适配器。 然后做任何你想做的事情。


我不希望我的主活动发生任何变化,因为它已经包含了片段。这个对话框片段会替换当前的片段吗?还是像警报对话框一样弹出? - Ankita Deshmukh
DialogFragment fragment = new DialogFragment(); fragment.show(getSupportFragmentManager(), "MAGICAL_TAG");这是一个比AlertDialog更好的生命周期和自定义控制替代方案。如果您认为有帮助,请接受答案。 - Rajiv yadav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接