【问题标题】:how to set a custom list view into a dialog box如何将自定义列表视图设置为对话框
【发布时间】:2013-12-20 16:40:20
【问题描述】:

我正在开发一个应用程序,它从 Web 服务获取一些数据并显示在列表视图中。我已经实现了一个由 BaseAdapter 扩展的自定义适配器。在getView() 方法中,我也给原始数据充气。这些工作完美。

我的问题是我已经实现了代码以在用户单击列表项时显示一个对话框,但现在我想显示另一个对话框,其中包含一个自定义列表(单击“是”按钮时)。我还想在该列表视图中显示一些数据。 [我有一个 ArrayList 填充了我想要的数据]。我正在我的适配器类中编写代码。谁能给我一些想法如何做到这一点?

这是我的代码:

public class NewsRowAdapter extends BaseAdapter  {


private Context mContext;
private Activity activity;
private static LayoutInflater inflater=null;
private ArrayList<HashMap<String, String>> data;
int resource;
    //String response;
    //Context context;
    //Initialize adapter
    public NewsRowAdapter(Context ctx,Activity act, int resource,ArrayList<HashMap<String, String>> d) {
        super();
        this.resource=resource;
        this.data = d;
        this.activity = act;
        this.mContext = ctx;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }


    public void dialogshow(final String Date,final String Start,final String End){

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
        alertDialogBuilder.setTitle("Confirm your Action!");

        // set dialog message
        alertDialogBuilder
            .setMessage("Click yes to exit!")
            .setCancelable(false)
            .setPositiveButton("Yes",new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int id) {
                    // if this button is clicked, close
                    // current activity
                    //MainActivity.this.finish();

                //  Toast.makeText(mContext, "Yes clicked", Toast.LENGTH_LONG).show();

                    //check similer records

                //  ShortList sh = new ShortList();

                //  ArrayList<HashMap<String, String>> duplicateList; 
                //  duplicateList=sh.getDuplicated(Date, Start, End);


                    //if duplicates > 1 then show the popup list
            //      if(duplicateList.size()>1){
                    AlertDialog.Builder alertDialogBuilder2 = new AlertDialog.Builder(activity);

                    LayoutInflater infl = activity.getLayoutInflater();




                    //View vi = infl.inflate(id, root)





                    alertDialogBuilder2.setView(infl.inflate(R.layout.dialog_row, null))
                    .setPositiveButton("Accept", new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // TODO Auto-generated method stub
                                    Toast.makeText(mContext, "Accepted", Toast.LENGTH_LONG).show();
                                }
                            })
                            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // TODO Auto-generated method stub
                                    dialog.dismiss();
                                }
                            });

                    alertDialogBuilder2.show();


                //  }



                }
              })
              .setNegativeButton("No",new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,int id) {
                        // if this button is clicked, just close
                        // the dialog box and do nothing
                        dialog.cancel();
                    }
                });
        alertDialogBuilder.show();

    }



@Override
public View getView(final int position, View convertView, final ViewGroup parent) {


    View vi = convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.row,null);


        final TextView firstname = (TextView) vi.findViewById(R.id.fname);
        final TextView lastname = (TextView) vi.findViewById(R.id.lname);
        final TextView startTime = (TextView) vi.findViewById(R.id.stime);
        final TextView endTime = (TextView) vi.findViewById(R.id.etime);
        final TextView date = (TextView) vi.findViewById(R.id.blank);
        final ImageView img = (ImageView) vi.findViewById(R.id.list_image);


        HashMap<String, String> song = new HashMap<String, String>();
        song =data.get(position);

        firstname.setText(song.get(MainActivity.TAG_PROP_FNAME));
        lastname.setText(song.get(MainActivity.TAG_PROP_LNAME));
        startTime.setText(song.get(MainActivity.TAG_STIME));
        endTime.setText(song.get(MainActivity.TAG_ETIME));
        date.setText(song.get(MainActivity.TAG_DATE));
        //imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), img);

        Button accept = (Button) vi.findViewById(R.id.button1);
        accept.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                final int x = (int) getItemId(position);
                /*Intent zoom=new Intent(mContext, Profile.class);
                zoom.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                zoom.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                mContext.startActivity(zoom);*/

                // get the intent from the hashmap check if there is similar date and time.
                //then store them in a list or array.

                String getDate = (String) date.getText();
                String getStartTime = startTime.getText().toString();
                String getEndTime = endTime.getText().toString();

                dialogshow(getDate,getStartTime,getEndTime);
            }
    });


        vi.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                String getFname = firstname.getText().toString();
                Toast.makeText(parent.getContext(), "view clicked: "+getFname , Toast.LENGTH_SHORT).show();

                //get the id of the view
                //check the id of the request
                //call the web service acording to the id

                Intent zoom=new Intent(parent.getContext(), Profile.class);   
                parent.getContext().startActivity(zoom);



            }
        });

        return vi;


}

【问题讨论】:

    标签: android listview dialog


    【解决方案1】:

    你在正确的轨道上,这是我用来动态显示一个包含项目列表的对话框。

    这里提出了一个类似的问题作为参考:Android custom list dialog

        //String[] list_data; Preloaded with a String array
    
        final CharSequence[] items = new CharSequence[list_data.length];
    
                for (int i = 0; i < list_data.length; i++) {
                   items[i] = list_data[i];
                }
    
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Select the data you want");
        builder.setItems(items, new DialogInterface.OnClickListener() {
    
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //Get the id of the item
                diag_callback();
    
            }
    
        });
    
        AlertDialog alert = builder.create();
        alert.show();
    
    }
    
    public void diag_callback() {
        //Do someting when the user has made his selection
    }
    

    希望这能解决您的问题。

    【讨论】:

    • 嗨..在这里我有一个问题......因为我在适配器类的 getview 方法中膨胀了我的自定义列表,我该如何直接设置项目?我有这样的数据:[{Date=11/18/13, EndTime=09:00 AM, StartTime=08:00 AM}, {Date=11/18/13, EndTime=09:00 AM, StartTime= 08:00 AM}, {Date=11/18/13, EndTime=09:00 AM, StartTime=08:00 AM}] 我想在对话框中显示它们(在列表视图内)
    • 你在使用 SQLite 吗?如果您是,只需将数据保存在数据库中并使用查询对其进行编辑,这样您将始终可以直接访问您的数据,然后您可以编写一个方法来更新您的视图,以便反映数据库中的新数据。
    • 如果您不使用 SQLite,请考虑在您的应用中实现它。这是一个参考站点,有一个很棒的 android SQLite 教程Here
    • 您应该尝试将从服务器获取的数据存储在 SQLite 数据库中,它允许您在本地更改数据,并且对 android 设备内存的负担更少。一旦你设置了你想要的变量,你就可以使用 syncronize 方法来上传更改。它会让你的生活变得更轻松
    • 谢谢你..但根据我的客户需求,我只想在列表中显示它们..但我会尝试..因为我想成为一名优秀的程序员..
    【解决方案2】:

    为了您的关心,我希望您知道创建自定义列表视图。

    下面提到的代码包含带有自定义列表视图的自定义对话框。我希望你能用你的来执行适配器和模型部分

     final Dialog new_dialog = new Dialog(getParent());
     new_dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
     new_dialog.setContentView(R.layout.customize_dialog_list_view);
     new_dialog.setCancelable(false);
     cuc = new CommanUtilityClass();
     SharedPreferences sp = getSharedPreferences("provider",0);
       String services = sp.getString("services","");
       Log.i("Servicesss",bAllServices);
    
       TextView service = (TextView) new_dialog.findViewById(R.id.cdlv_service_provider);
       TextView hour = (TextView) new_dialog.findViewById(R.id.cdlv_working_hours);
    
       TextView appointment_time = (TextView) new_dialog.findViewById(R.id.cdlv_appoint_time);
       TextView appointment_date = (TextView) new_dialog.findViewById(R.id.cdlv_appoint_date);
    
       String[] ampm = myTiming[which].split(":");
    
       Log.d("xxxooo", ampm[0]);
    
       appointment_time.setText(Html.fromHtml("<b>Appointment time :</b>" + myTimingToShow[which].split("/")[0]));
       appointment_date.setText(Html.fromHtml("<b>Appointment date :</b>" + selected));
    
       service.setText(Html.fromHtml("<b>Service provider :</b>"+ cuc.toTheUpperCase(bsp_name)));
    
       hour.setText(Html.fromHtml("<b>Working hours :</b>"+ cuc.toTheUpperCase(bsp_availability)));
    
       lv = (ListView) new_dialog.findViewById(R.id.cdlv_list);
    
       CustomDialogArrayAdapter cdaa = new CustomDialogArrayAdapter(getApplicationContext(),m_ArrayList);
    
       lv.setAdapter(cdaa);
    
       new_dialog.show();
    
       ImageButton btn_cdlv_cancel = (ImageButton) new_dialog.findViewById(R.id.cdlv_cancel);
    
       btn_cdlv_cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new_dialog.dismiss();
                }
            });
    
       lv.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(
                AdapterView<?> arg0,
                View arg1,
                int arg2,
                long arg3) {
    
            Log.d("checkforbookedslots", booked_slots);
    
            final_time_selected = myTiming[which];
            String final_duration = m_ArrayList.get(arg2).provider_service_duration;
            Log.d("adiadicheck", check_for_booking_list);
            if (checkOverlapSlot(final_time_selected,final_duration)) {
                Log.d("gp","seven12aa");
                SharedPreferences sp = getSharedPreferences("booking_detail",0);
                SharedPreferences.Editor editor = sp.edit();
                editor.putString("provider_service",m_ArrayList.get(arg2).provider_service);
                editor.putString("provider_service_duration",m_ArrayList.get(arg2).provider_service_duration);
                editor.putString("provider_service_price",m_ArrayList.get(arg2).provider_service_price);
                editor.putString("service_id",m_ArrayList.get(arg2).provider_service_id);
                editor.commit();
    
                SessionManagement sm = new SessionManagement(getParent());
                // sm.checkLogin();
    
                if (sm.isLoggedIn()) {
                    Log.d("viv2","1");
                    Intent edit = new Intent(SelectedService.this,UserLoggedActivity.class);
                    TabGroupActivity parentActivity = (TabGroupActivity) getParent();
                    parentActivity.startChildActivity("UserLoggedActivity",edit);
                } else {
                    Log.d("viv2","2");
                    Intent edit = new Intent(SelectedService.this,UserNoLoggedActivity.class);
                    TabGroupActivity parentActivity = (TabGroupActivity) getParent();
                    parentActivity.startChildActivity("UserNoLoggedActivity",edit);
                }
                new_dialog.dismiss();
            }
        }
       });
    

    【讨论】:

      【解决方案3】:

      带有自定义列表视图的自定义对话框 ::: 公共类 MainActivity 扩展 Activity {

      private Button btnOpenDialog;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          final ArrayList<String> strArrlst = new ArrayList<String>();
          for (int i = 0; i < 15; i++) {
              strArrlst.add("Number: " + i);
          }
      
          btnOpenDialog = (Button) findViewById(R.id.btn_open_dialog);
          btnOpenDialog.setOnClickListener(new OnClickListener() {
      
              @Override
              public void onClick(View v) {
                  // TODO Auto-generated method stub
                  Log.d("Dialog box is btn click", "");
                  final Dialog dialog = new Dialog(MainActivity.this);
                  Toast.makeText(getApplicationContext(), "btn is click", Toast.LENGTH_SHORT).show();
                  // tell the Dialog to use the dialog.xml as it's layout
                  // description
                  dialog.setContentView(R.layout.custom_dailog_box);
                  dialog.setTitle("Android Custom Dialog Box");
                  TextView txt = (TextView) dialog.findViewById(R.id.txt);
                  txt.setText("This is an Android custom Dialog Box Example! Enjoy!");
      
                  ListView dialogLIst = (ListView) dialog.findViewById(R.id.lstvw_open_custom_dialog);
                  // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                  // android.R.layout.simple_list_item_1, android.R.id.text1,
                  // values);
                  // dialogLIst.setAdapter(adapter);
                  AdapterListC adapListC = new AdapterListC(getApplicationContext(), strArrlst);
                  dialogLIst.setAdapter(adapListC);
      
                  dialogLIst.setOnItemClickListener(new OnItemClickListener() {
      
                      @Override
                      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                          // TODO Auto-generated method stub
                          dialog.dismiss();
                          Toast.makeText(getApplicationContext(), "This is click position is" + position, Toast.LENGTH_SHORT).show();
                      }
      
                  });
                  dialog.show();
              }
          });
      }
      
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.main, menu);
          return true;
      }
      

      }

      适配器类::: 公共类 AdapterListC 扩展 BaseAdapter {

      public AdapterListC(Context context_, ArrayList<String> arrlstString) {
          super();
          this.context_ = context_;
          this.arrlstString = arrlstString;
          mInflater = (LayoutInflater) context_.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      
      }
      
      Context context_;
      ArrayList<String> arrlstString;
      private LayoutInflater mInflater;
      
      @Override
      public int getCount() {
          // TODO Auto-generated method stub
          return arrlstString.size();
      }
      
      @Override
      public Object getItem(int position) {
          // TODO Auto-generated method stub
          return arrlstString.get(position);
      }
      
      @Override
      public long getItemId(int position) {
          // TODO Auto-generated method stub
          return position;
      }
      
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          // TODO Auto-generated method stub
          Viewolder holder = null;
          if (convertView == null) {
              convertView = mInflater.inflate(R.layout.listitem, null);
              holder = new Viewolder();
              holder.txtName = (TextView) convertView.findViewById(R.id.txt_listitem);
      
              convertView.setTag(holder);
          } else {
              holder = (Viewolder) convertView.getTag();
          }
          holder.txtName.setText(arrlstString.get(position).toString());
      
          return convertView;
      }
      
      class Viewolder {
          TextView txtName;
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 2011-09-03
        • 2013-05-16
        • 1970-01-01
        相关资源
        最近更新 更多