Как работать с динамическим списком, реализуя функциональность отложенного списка в Android? - PullRequest
1 голос
/ 14 марта 2011

Я занимаюсь разработкой приложения для чата.У меня есть около 4500 записей в моей базе данных, в этой базе данных отображаются изображения пользователей и сообщения чата.Я реализован ниже код файла больше времени отображения всей информации любое предложение загружено в список.

Код файла:

    // 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);
        }

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Вы можете сохранить изображение в кэш-памяти и получить к нему доступ. Проверьте этот образец:

Изображения в кэш-памяти

0 голосов
/ 14 марта 2011

Если я правильно понимаю ваш код, вы используете LinearLayout для показа сообщений, воссоздая весь макет каждый раз, когда вы получаете новое сообщение.Это очень неэффективный способ.

Вы должны использовать ListView для отображения списка сообщений, загружая их с помощью специального адаптера.Android обрабатывает элементы прокрутки вне поля зрения: они используются повторно для повышения эффективности памяти.Нет необходимости вручную перезагружать каждый элемент при получении нового сообщения, вы просто добавляете новый элемент в свою коллекцию и вызываете notifyDatasetChanged () на адаптере.

См. Статьи руководства по Android для ListView и с использованием адаптеров .

...