【问题标题】:Getting Next and Previous Detail Data from listview从列表视图获取下一个和上一个详细数据
【发布时间】:2013-02-28 21:31:22
【问题描述】:

我不知道如何通过单击基于列表视图的下一个/上一个按钮来显示下一个/上一个详细数据的功能。

这是我想做的截图

My listview Activity

My Detail data Activity,显示列表视图中的下一个/上一个数据

编辑:我有一个列表视图数据(使用 xml 解析器),并将数据传递给名为“Detail_toko.class”的新活动:

                List<NameValuePair> paramemeter = new ArrayList<NameValuePair>();
                paramemeter.add(new BasicNameValuePair("keyword", "a"));  
                // paramemeter.add(new BasicNameValuePair("kategori",Category.getSelectedItem().toString()));

                XMLParser parser = new XMLParser();
                String xml = parser.getXmlFromUrl(URL, paramemeter); // getting XML from URL
                Document doc = parser.getDomElement(xml); // getting DOM element
                NodeList nl = doc.getElementsByTagName(TAG_DETAIL);
                // looping through all song nodes <song>
                for (int i = 0; i < nl.getLength(); i++) {
                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();
                    Element e = (Element) nl.item(i);
                    // adding each child node to HashMap key => value
                    map.put(TAG_ID, parser.getValue(e, TAG_ID));
                    map.put(TAG_NAMATOKO, parser.getValue(e, TAG_NAMATOKO));
                    map.put(TAG_KATEGORI, parser.getValue(e, TAG_KATEGORI));
                    map.put(TAG_EMAIL, parser.getValue(e, TAG_EMAIL));
                    map.put(TAG_ICON, parser.getValue(e, TAG_ICON));


                    // adding HashList to ArrayList
                    PremiumList.add(map);



                        } 

            return null;

           }


            /**
             * Updating parsed JSON data into ListView
             * */
            list=(ListView)findViewById(R.id.listview);

            if(PremiumList.size() > 0)
                    {

                adapter=new LazyAdapterStore(ListPerusahaan.this, PremiumList);        
                list.setAdapter(adapter);
            }

            else
                    {
                Toast toast= Toast.makeText(getApplicationContext(), "No data found, enter another keyword", Toast.LENGTH_SHORT);  
                    toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
                    toast.show();
                    }

                // Click event for single list row
                    list.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {

                            // getting values from selected ListItem
                            String nama_toko = ((TextView) view.findViewById(R.id.nama_toko)).getText().toString();
                            String kategori = ((TextView) view.findViewById(R.id.kategori)).getText().toString();
                            String email = ((TextView) view.findViewById(R.id.email)).getText().toString();



                         PremiumList = new ArrayList<HashMap<String, String>>();
                         Intent in = new Intent(ListPerusahaan.this, Detail_toko.class); 
                         in.putExtra("PremiumList", PremiumList);
                         //in.putStringArrayListExtra( "PremiumList", PremiumList );
                         in.putExtra("position", position);
                         in.putExtra("TotalData", TotalData);
                         in.putExtra(TAG_NAMATOKO, nama_toko);
                         in.putExtra(TAG_KATEGORI, kategori);
                         in.putExtra(TAG_EMAIL, email);
                         startActivity(in);

这是我的 LazyAdapterStore 代码:

  public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_data_store, null);

    TextView nama_toko = (TextView)vi.findViewById(R.id.nama_toko); // title
    TextView kategori = (TextView)vi.findViewById(R.id.kategori); // title
    ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image
    TextView email = (TextView)vi.findViewById(R.id.email); // artist name


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


    // Setting all values in listview
    nama_toko.setText(detail.get(ListPerusahaan.TAG_NAMATOKO));
    kategori.setText(detail.get(ListPerusahaan.TAG_KATEGORI));
    email.setText(detail.get(ListPerusahaan.TAG_EMAIL));
    imageLoader.DisplayImage(detail.get(ListPerusahaan.TAG_ICON), thumb_image);
    return vi;

}

编辑:,这是我的新活动“Detail_Toko”,用于显示来自列表视图项目的详细数据:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

  //this must be called BEFORE setContentView
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.detail_toko);

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title);

    call_btn=(Button)findViewById(R.id.call);

    email_btn=(Button)findViewById(R.id.email);

    sms_btn=(Button)findViewById(R.id.sms);

    Next_btn=(Button)findViewById(R.id.Next);

    Prev_btn=(Button)findViewById(R.id.Prev);

    phonenumber=(TextView)findViewById(R.id.telpon);


    // getting intent data
    Intent in = getIntent();

   // @SuppressWarnings("unchecked")
    //ArrayList<HashMap<String, String>> PremiumList = (ArrayList<HashMap<String, String>>) getIntent().getSerializableExtra("PremiumList");


    // Get String values from previous intent
    final String nama_toko = in.getStringExtra(TAG_NAMATOKO);
    final String kategori = in.getStringExtra(TAG_KATEGORI);
    final String email = in.getStringExtra(TAG_EMAIL);

    // Get Int values from previous intent
    final int posisi =  in.getExtras().getInt("position");
    final int Total_data =  in.getExtras().getInt("TotalData");

   /*
    Bundle bundle = in.getExtras(); 
    HashMap<String, String> list = (HashMap<String, String>) bundle.getSerializable("PremiumList");
    list = data.get(currentposition);
    */

    Bundle bundle = in.getExtras();
    HashMap<String, String> list =  (HashMap<String, String>) bundle.getSerializable("PremiumList");
    list = data.get(currentposition);

    // Displaying all values on the screen
    lblPosisi = (TextView) findViewById(R.id.namatoko);
    lbltotaldata = (TextView) findViewById(R.id.nama);
    lblNamatoko = (TextView) findViewById(R.id.nama_toko);
    lblKategori = (TextView) findViewById(R.id.kategori);
    lblEmail = (TextView) findViewById(R.id.textemail);

    lblPosisi.setText(String.valueOf(posisi));
    lbltotaldata.setText(String.valueOf(Total_data));
    lblNamatoko.setText(nama_toko);
    lblKategori.setText(kategori);
    lblEmail.setText(email);


    // Set the int value of currentposition from previous selected listview item
    currentposition = posisi;

    Next_btn.setOnClickListener(new Button.OnClickListener(){
      public void onClick(View v){  

          if(currentposition >= Total_data - 1)
          {
              Toast toast= Toast.makeText(getApplicationContext(), "Last Record", Toast.LENGTH_SHORT);  
              toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
              toast.show();
          }
          else
          {

              currentposition++;
              lblPosisi.setText(String.valueOf(currentposition));
              lblNamatoko.setText(list.get(nama_toko));
              lblKategori.setText(list.get(kategori));
              lblEmail.setText(list.get(email));


          }
        }
      });


    Prev_btn.setOnClickListener(new Button.OnClickListener(){
      public void onClick(View v){  

          if(currentposition <= 0)
          {
              Toast toast= Toast.makeText(getApplicationContext(), "First Record", Toast.LENGTH_SHORT);  
              toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
              toast.show();
          }
          else
          {
              currentposition--;
              lblPosisi.setText(String.valueOf(currentposition));
              lblNamatoko.setText(list.get(nama_toko));
              lblKategori.setText(list.get(kategori));
              lblEmail.setText(list.get(email));
          }


          }
     });

问题是,我不知道如何通过单击“Detail_toko”活动中的下一个/上一个按钮来创建一个函数来显示列表视图中的下一个/上一个详细数据。 请有人帮助我...

提前致谢

【问题讨论】:

    标签: android listview button next


    【解决方案1】:

    刚刚在上一篇文章中看到了您的请求。

    Parvaz 给出的解决方案是完美的,你只需要弄清楚代码。 您有一个数组列表“PremiumList”,它负责您的列表视图行数据。 您只需将位置和此列表传递给 Detail_toko.class(通过意图使用 parceable 或将 arraylist 声明为静态(不推荐)等),您的解决方案将离您几步之遥。

    在 Detail_toko.class 中创建一个全局变量 currentPosition,它将从过去的活动中获取其值,例如来自意图的 TAG_NAMATOKO。 然后在 NEXT 按钮的 onClickListener 中将 1 增加到 currentPosition 并从您刚刚从上一个活动传输的数组列表中获取详细信息,就像您在 getView 方法中所做的那样。

     HashMap<String, String> detail = new HashMap<String, String>();
        detail = data.get(currentPosition);
    
    
    // Setting all values in listview
    nama_toko = detail.get(ListPerusahaan.TAG_NAMATOKO);
    kategori = detail.get(ListPerusahaan.TAG_KATEGORI);
    email = detail.get(ListPerusahaan.TAG_EMAIL);
    

    设置这些值,您的新视图将相应更新。

    在 PREVIOUS 按钮的 onClickListener 中,从 currentPosition 减 1,后跟相同的代码(这意味着您必须创建一个方法并调用它,没有代码重复)。

    试试看。这是我们无需实际做功课就可以解释的详细信息!

    编辑:

    首先从 OnItemClick 中删除这一行

     PremiumList = new ArrayList<HashMap<String, String>>();
    

    您正在清除此行中 PremiumList 中的所有数据,这样您将在下一个活动中获得空白列表。所以摆脱这条线。 一旦您在下一个活动中获得 PremiumList,您所需要的只是 position 和 totalData 以及它的 intent extra。 您可以从您的 Intent extra 中删除 TAG_NAMATOKO、TAG_KATEGORI、TAG_EMAIL。

    我告诉过你不要重复代码,因为你是初学者,所以遵循它对你来说非常重要,因为它会让你的生活变得轻松 考虑这些因素并养成你的习惯。

    现在您在 "Detail_Toko" 中的代码将变为:

     HashMap<String, String> list = null;
     int currentposition = 0;
     int  Total_data =0;
    
     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
      //this must be called BEFORE setContentView
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    
        setContentView(R.layout.detail_toko);
    
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title);
    
        call_btn=(Button)findViewById(R.id.call);
    
        email_btn=(Button)findViewById(R.id.email);
    
        sms_btn=(Button)findViewById(R.id.sms);
    
        Next_btn=(Button)findViewById(R.id.Next);
    
        Prev_btn=(Button)findViewById(R.id.Prev);
    
        phonenumber=(TextView)findViewById(R.id.telpon);
    
    // Displaying all values on the screen
        lblPosisi = (TextView) findViewById(R.id.namatoko);
        lbltotaldata = (TextView) findViewById(R.id.nama);
        lblNamatoko = (TextView) findViewById(R.id.nama_toko);
        lblKategori = (TextView) findViewById(R.id.kategori);
        lblEmail = (TextView) findViewById(R.id.textemail);
    
        // getting intent data
       Bundle bundle = getIntent().getExtras();
    // Get Int values from previous intent
        currentposition =  bundle.getInt("position");
          Total_data =  bundle.getInt("TotalData");
        list =  (HashMap<String, String>) bundle.get("PremiumList");
        setView();
        Next_btn.setOnClickListener(new Button.OnClickListener(){
          public void onClick(View v){  
            if(currentposition >= Total_data - 1)
              {
                  Toast toast= Toast.makeText(getApplicationContext(), "Last Record", Toast.LENGTH_SHORT);  
                  toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
                  toast.show();
              }
              else
              {
                 currentposition++;
                 setView();
              }
            }
          });
    
    
        Prev_btn.setOnClickListener(new Button.OnClickListener(){
          public void onClick(View v){  
    
              if(currentposition <= 0)
              {
                  Toast toast= Toast.makeText(getApplicationContext(), "First Record", Toast.LENGTH_SHORT);  
                  toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
                  toast.show();
              }
              else
              {
                  currentposition--;
                  setView();
              }
            }
         });
    
         private void setView()
         {
         if(list != null && list.size() > currentposition)
         {
         HashMap<String, String> detail = new HashMap<String, String>();
        detail = list.get(currentposition);
         lblPosisi.setText(String.valueOf(currentposition));
        lbltotaldata.setText(String.valueOf(Total_data));
        lblNamatoko.setText(detail.get(ListPerusahaan.TAG_NAMATOKO));
        lblKategori.setText(detail.get(ListPerusahaan.TAG_KATEGORI));
        lblEmail.setText(detail.get(ListPerusahaan.TAG_EMAIL));
        }
        }
    

    建议: 在getView 方法中使用ViewHolder 填充视图,它会让你的适配器成为“一个高效的适配器”。 (搜索示例) 遵循命名约定和所有。 在使用它们之前检查 anyObject != null ,它们的大小或长度以及 bundle.containKey 等东西以避免像 nullPointerException 这样的致命异常。

    【讨论】:

    • 嗨,Sourab Sharma 先生,我过去四天都在学习如何解决有关列表视图中下一个/上一个详细数据的问题。我按照你的指示做了一些功能,我从 listview 获得了 currentposition、totaldata 和 Arraylist “PremiumList”,所以当我按下下一个/上一个按钮时,索引/位置的值将相应更新,当我们按下最后一个索引中的按钮,它将显示吐司“最后一条记录”。我做了这个功能,但我的详细数据仍然没有改变......:(我做错了什么?我错过了什么?我已经编辑了我的代码,请查看 Mr.Sourab Sharma
    • 首先,非常感谢您的回答和建议 Mr.Sourab Sharma,对您的帮助无言以对。你是我在 android 编程方面的好老师...:) 但是,“Detail_toko”活动中有一个错误......在“detail = list.get(currentposition);”行中编辑说“类型不匹配:无法从 String 转换为 HashMap”我缺少什么?
    • 感谢上帝...感谢 Sourab Sharma 先生...我的问题已解决...错误在“HashMap list = null;”中应该是“Arraylist HashMap list = null;”上帝保佑你,Sourab Sharma 先生...:)
    • 谢谢 :) 但是请记住,任何时候您提出关于 SO 的问题时,您必须在此之前完成所有相关的研发,并且必须尽最大努力解决问题。这样只有你会成为优秀的开发者,否则任何人都将变得只依赖老年人。 TC。
    • 嗨@SourabSharma,你能帮我解决这个问题吗link 请...
    【解决方案2】:

    只需将 PremiumList ArrayList 传递给您的 Detail_toko Activity...通过 Intent 传递或直接从 getter 方法获取。然后在每个下一个/上一个按钮上的 Detail_toko 活动中单击递增 arraylist 的位置以获取数据,然后进行相应的填充。

    这就是你将如何传递你的数组列表 Passing ArrayList through Intent

    而不是从意图中获取其余数据,而是从数组列表中获取数据。

    类似于 arraylist.get(index)。

    就这样

      /********Instead of getting your values like this*******************/
    String nama_toko = in.getStringExtra(TAG_NAMATOKO);
    String kategori = in.getStringExtra(TAG_KATEGORI);
    String email = in.getStringExtra(TAG_EMAIL);
    

    /************************使用这里给出的方法How to do the next button action?****************** ***************/

      //The  method setvalue would be quite useful for you where you will pass the int j parameter to get appropriate values. If next button is clicked increment the j if previous button is clicked decrement it. and then display your values asusual.
    // Displaying all values on the screen
    lblNamatoko = (TextView) findViewById(R.id.namatoko);
    lblKategori = (TextView) findViewById(R.id.kategori);
    lblEmail = (TextView) findViewById(R.id.textemail);
    
    lblNamatoko.setText(nama_toko);
    lblKategori.setText(kategori);
    lblEmail.setText(email);
    

    【讨论】:

    • 感谢@Parvaz 的回答,但我是 android 的新手.....我仍然很困惑......你能告诉我代码......:)
    • 好的....我明白了,如何将“PremiumList”从活动 1 传递到活动 2,但是,如何使下一个/上一个按钮功能显示数据......对不起...... .:(
    • 嗨@Parvaz,我的列表视图数据使用hashmap...将“PremiumList”传递给另一个活动时出现问题使用“Intent i = getIntent(); PremiumList = i.getStringArrayListExtra("PremiumList" );"如何解决这个问题呢? :D
    • 如果你想传递你创建的哈希图本身,你可以参考这个stackoverflow.com/questions/4992097/…
    • 感谢@Parvaz,但您能否在我的“Detail_toko”活动中向我展示“Next_btn”按钮单击侦听器的示例代码...所以,我可以在单击“下一步”按钮后显示来自列表视图的下一个数据。 ..老实说,对于像我这样的新手来说,您的解释仍然很复杂..:D
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多