简体   繁体   中英

How to handle dynamic list implementing lazy list functionality in Android?

I am developing a chat related application. I have some 4500 entries in my database, this database I am getting user images and chat messages displaying. I am implemented below code file more time taken display the all information any suggestion loaded in list.

Code file:

    // Handle the messages and post messages to list view

    private void handlerMessage(final String messageType, final int dis) 
    {
         myProgressDialog = ProgressDialog.show(Shout1.this,"","Loading...",true);
         new Thread() 
         {

         public void run()
         {
             try {
                String xml;
                 Userid=getSharedPreferences("MyLoginInfo", 0).getString("user_id", "");
                if(messageType.length()==0)
                {   
                    xml="<spGetUserMessages><SearchLocation></SearchLocation><LoginUserID>"+Userid+"</LoginUserID></spGetUserMessages>";
                    messages =parse.GetGetUserMessages(dataparsing.ILGetUserMessages(xml)); 
                    Message msg = myHandler.obtainMessage();                   
                     myHandler.sendMessage(msg);
                }  
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        myProgressDialog.dismiss();
      } 
    }.start();
  }

  // Handle the messages

    private Handler myHandler = new Handler() 
    {
        public void handleMessage(Message msg) 
        {
            Log.v("Shout=====","inhandleMessage  ======="+messages.size());
            if(messages.size()==0)
            {((LinearLayout)findViewById(R.id.LinearlayoutMessage)).removeAllViews();
                Toast.makeText(Shout1.this, "No messages in that Location", Toast.LENGTH_SHORT).show();
            }
            else
            {
            ((LinearLayout)findViewById(R.id.LinearlayoutMessage)).removeAllViews();
           addElements(messages);
            }
        }

    };
    //add messagess to List
    protected void addElements(final List<MessageClass> messages2) 
    {
        ((LinearLayout)findViewById(R.id.LinearlayoutMessage)).removeAllViews();
        LinearLayout ll5=new LinearLayout(this);
        ll5.setBackgroundColor(Color.WHITE);
        ll5.setOrientation(1);

        for(int i=0;i<messages2.size();i++)
        {
                LinearLayout ll1=new LinearLayout(this);
            ll1.setPadding(0, 3, 0, 0);
            ll1.setBackgroundResource(R.drawable.tabmessage);
            ll1.setGravity(Gravity.CENTER);

            final TextView messageid = new TextView(this);
            messageid.setText(messages2.get(i).getmessageId());

            final TextView targetid = new TextView(this);
            targetid.setText(messages2.get(i).getUserid());

            final TextView targetMessage = new TextView(this);
            targetMessage.setText(messages2.get(i).getmessage());

            LinearLayout layoutmsg=new LinearLayout(this);
            layoutmsg.setClickable(true);
            layoutmsg.setOrientation(1);
            layoutmsg.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
            ImageView msgImage=new ImageView(this);
            final TextView msgimageInfo=new TextView(this);
            try
              {
                    String photoXml="<spGetMessagePhoto><MessageID>"+messages2.get(i).getmessageId()+"</MessageID></spGetMessagePhoto>";
                    String photoInfoFromDB1=new DataParsingComm().ILGetMessageImage(photoXml);
                    msgimageInfo.setText(photoInfoFromDB1);
                    if(photoInfoFromDB1.equalsIgnoreCase("anytype{}")|| photoInfoFromDB1==null)
                    {
                        msgImage.setVisibility(8);
                    }
                    else
                    {

                    byte[] imgArry= Base64.decode(photoInfoFromDB1);                    
                    Bitmap bit=BitmapFactory.decodeByteArray(imgArry,0,imgArry.length);
                    msgImage.setImageBitmap(bit);
                    }
                    }catch (Exception ee) {
                        // TODO: handle exception
                        ee.printStackTrace();
                    }

        final TextView msg=new TextView(this);
        msg.setText(messages2.get(i).getmessage());

        final TextView msg1=new TextView(this); 
        if(messages2.get(i).getmessage().length()>60)
        msg1.setText(messages2.get(i).getmessage().substring(0, 60)+"...");

        else

        msg1.setText(messages2.get(i).getmessage());
        msg1.setTextColor(Color.BLACK); 
        msg1.setTypeface(Typeface.MONOSPACE);
        msg1.setTextSize(13);
        msg1.setWidth(250);
        layoutmsg.addView(msgImage);
        layoutmsg.addView(msg1);

        ImageView PersonImage=new ImageView(this);
        final TextView imageInfo=new TextView(this);
          try{
            //get the image based on user ID
            String photoXml="<spGetUserPhoto><UserID>"+messages2.get(i).getUserid()+"</UserID></spGetUserPhoto>";
            Log.v("check","photoXml.."+photoXml);   
            String photoInfoFromDB=new DataParsingComm().ILGetImage(photoXml);
            Log.v("photoInfoFromDB","photoInfoFromDB.."+photoInfoFromDB);
            imageInfo.setText(photoInfoFromDB);
            if(photoInfoFromDB.equalsIgnoreCase("anytype{}")||photoInfoFromDB.equals(null) )
            {
              PersonImage.setImageResource(R.drawable.person);
            }
            else
            {
            byte[] imgArry= Base64.decode(photoInfoFromDB);
            Bitmap bit=BitmapFactory.decodeByteArray(imgArry,0,imgArry.length);
            Log.v("Shout","Image Lengthhhhhhhhhhhhh"+imgArry.length);
            PersonImage.setImageBitmap(bit);
            }
            }catch (Exception ee) {
                ee.printStackTrace();
            }

        final TextView personName=new TextView(this);
        if(messages2.get(i).getUname().equalsIgnoreCase("noname"))
            personName.setText("");
        else                
        personName.setText(messages2.get(i).getUname());
        personName.setTextColor(Color.rgb(0, 102, 51));
        LinearLayout layoutPersonImage=new LinearLayout(this);
        layoutPersonImage.setOrientation(1);
        layoutPersonImage.setGravity(Gravity.CENTER);
        layoutPersonImage.addView(PersonImage); 
        layoutPersonImage.addView(personName); 
        ll1.addView(layoutPersonImage);
        ll1.addView(layoutmsg);
                ll5.addView(ll1);
        }
        ((LinearLayout)findViewById(R.id.LinearlayoutMessage)).addView(ll5);
        }

You can store the image in Cache memory and access it. Check out this sample:

Images in cache Memory

If I understand your code right, you are using a LinearLayout to show messages, recreating the whole layout every time if you receive a new message. This is a very inefficient way.

You should use a ListView to display the list of messages, loading them by using a custom Adapter. Android handles the recycling of items scrolled out of view: they are reused to increase memory efficiency. There's no need to manually reload every item on receiving a new message, you just add the new item to your collection and call notifyDatasetChanged() on the adapter.

See the Android Dev Guide articles about ListView and using Adapters .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM