2014-12-22 23 views
0

我有三個viewholder一個圖像一個視頻一個音頻 在videholder我有listview我在其中顯示視頻的縮略圖,如果它下載。它工作正常,但當我滾動然後該縮略圖也設置在另一個圖像視圖上。android listview視頻縮略圖滾動問題

mConvertView = convertView; 
     chatMessage=chatMessages.get(position); 

     final TextViewHolder mTextViewHolder; 
     final ImageViewHolder mImageViewHolder; 
     final AudioViewHolder mAudioViewHolder; 

     Object object=chatMessages.get(position); 
//  mHandler = new Handler(); 
     disply = new DisplayImageOptions.Builder().cacheInMemory(true) 
       .cacheOnDisk(true) 
       .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) 
       .displayer(new RoundedBitmapDisplayer(20)).build(); 

     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
       context).defaultDisplayImageOptions(disply).build(); 

     ImageLoader.getInstance().init(config); 

     rd = new RecordBaseHandler(context); 



    if(chatMessage.getAssetsId() != null) 
     { 

      if(chatMessage.getType().equalsIgnoreCase("audio")) 

      { 

       Log.d("Node", "Item position is "+chatMessages.get(position)); 

      mAudioViewHolder = getAudioViewHolder(mConvertView); 
      mAudioViewHolder.mChatmessage=chatMessage; 

      // TODO change below code 
      if(chatMessage.getSenderId() != null) 
       setAlignment(mAudioViewHolder, chatMessage.getSenderId().intValue() != ((SMBChatApp) context.getApplication()).getQbUser().getId().intValue()); 
      else 
       setAlignment(mAudioViewHolder, false); 


      mAudioViewHolder.play.setTag(position); 

      mAudioViewHolder.txtInfo.setText(getTimeText(chatMessage.getDate_sent())); 

      mycontent = chatMessage.getProperty("content-type"); 

      try { 
       Cursor rs = rd.getData(chatMessage.getAssetsId()); 
       rs.moveToFirst(); 

       filepath = rs.getString(rs.getColumnIndex("file_path")); 

       Log.d("Node", "FINALLY FILE PATH IS " + filepath); 

       if (!rs.isClosed()) { 
        rs.close(); 
       } 


       if (filepath != null) { 

        mAudioViewHolder.download.setVisibility(View.GONE); 


       } else { 
        mAudioViewHolder.play.setVisibility(View.GONE); 
        mAudioViewHolder.download.setVisibility(View.VISIBLE); 
       } 
      } catch (Exception e) { 
       // TODO: handle exception 
       Log.d("Node", "EXECPTIOn " + e); 
      } 


       mAudioViewHolder.download.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Log.d("Node: ", "Reading all contacts.."); 
        List<RecordModel> contacts = rd.getAllContacts(); 

        for (RecordModel cn : contacts) { 

         String log = "Id: "+ cn.getId()+ " ,Name: "+ cn.getAttch_id()+ " ,Phone: " + cn.getFile_path(); 

         Log.d("Node: ",log); 

        } 



        // File tempMp3 = File.createTempFile("record", ".mp3", f); 

        new Thread() 
        { 
         public void run() { 
          File tempMp3 = null; 
          try { 
           tempMp3 = File.createTempFile("record", ".mp3",Environment.getExternalStorageDirectory()); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 

          //We are creating folder first using mkdir 
          File f = new File(Environment.getExternalStorageDirectory()+ "/smbchat/");       
          if(!f.exists()){ 
           f.mkdirs(); 
          } 

          //then we want to store downloded file in that folder 
          File output = new File(f, "smb_" + System.currentTimeMillis() + "_audio.mp3"); 

          Log.d("Node", "URL VALUE "+chatMessage.getUrl()); 
          HttpRequest.get(chatMessage.getUrl()).receive(output); 

          audioFileName=String.valueOf(output); 


          Log.d("Node", "FILE SAVED SUCCESSFULLY"+tempMp3); 
          Log.d("Node", "FILE SAVED SUCCESSFULLY AUDIOFILENAME " + audioFileName); 
          context.runOnUiThread(new Runnable() { 

           @Override 
           public void run() { 
            // TODO Auto-generated method stub 
            Toast.makeText(context, "file downloaded successfully", Toast.LENGTH_LONG).show(); 
            mAudioViewHolder.download.setVisibility(View.GONE); 
           } 
          }); 



          rd.addContact(new RecordModel(chatMessage.getAssetsId(), audioFileName)); 

         }; 

        }.start(); 

       } 
      }); 








      mAudioViewHolder.play.setOnClickListener(new View.OnClickListener() { 

       public void onClick(View v) { 


        mAudioViewHolder.play.setVisibility(View.GONE); 
        mAudioViewHolder.pause.setVisibility(View.VISIBLE); 



        Log.d("DATA", "currently playing " + position); 
        playingAudioPosition = position; 


        Object tag = mAudioViewHolder.play.getTag(); 

        // Here we get the position that we have set for the checkbox using setTag. 



        String str=chatMessage.getAssetsId(); 

        Cursor rs = rd.getData(str); 
        rs.moveToFirst(); 
        try 
        { 
         filepath = rs.getString(rs.getColumnIndex("file_path")); 
        } 
        catch(Exception e) 
        { 
         Toast.makeText(mConvertView.getContext(), "File is not downloaded", Toast.LENGTH_LONG).show(); 
        } 

        Log.d("Node", "file path for id "+ str + "is "+ filepath); 

        if (!rs.isClosed()) { 
         rs.close(); 
        } 
        if(filepath==null) //we check whether file is present or not 
        { 
         Toast.makeText(mConvertView.getContext(), "File is Not downloaded", Toast.LENGTH_SHORT).show(); 

         ((View)v.getParent()).findViewById(R.id.btndn).setVisibility(View.VISIBLE); 
         //          mAudioViewHolder.download.setVisibility(mConvertView.VISIBLE); 
        } 
       else { 
           ((View) v.getParent()).findViewById(
             R.id.chat_audio_progress_bar) 
             .setVisibility(View.VISIBLE); 
           // mAudioViewHolder.progressBar.setVisibility(mConvertView.VISIBLE); 
           mediaPlayer = new MediaPlayer(); 

           String yofile = "file://" + filepath; 
           mediaPlayer 
             .setAudioStreamType(AudioManager.STREAM_MUSIC); 
           try { 

            mediaPlayer.setDataSource(yofile); 

           } catch (IllegalArgumentException 
             | SecurityException 
             | IllegalStateException | IOException e) { 
            // TODO Auto-generated catch block 
            Log.e("Node", "ERRORSS Part 1 is" + e); 

            mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 

               @Override 
          public void onCompletion(MediaPlayer mp) 


               { 
                mAudioViewHolder.isPlaying = false; 

                /** 
                * since audio is stop 
                * playing, remove its 
                * position value 
                * */ 
                playingAudioPosition = -1; 
               } 
              }); 
           } 
           try { 
            mediaPlayer.prepare(); 
           } catch (IllegalStateException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
            Log.e("Node", "ERRORSS is Part 2 " + e); 
           } catch (IOException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
           mediaPlayer.start(); 
           isMediaReleased = false; 
           mAudioViewHolder.progressBar.setMax(mediaPlayer.getDuration()); 
           updateSeekBar(); 

          } 

         } 



        }); 


      mAudioViewHolder.pause 
        .setOnClickListener(new View.OnClickListener() { 

         @Override 
         public void onClick(View v) { 
          mAudioViewHolder.play.setVisibility(View.VISIBLE); 
          mAudioViewHolder.pause.setVisibility(View.GONE); 
          mediaPlayer.stop(); 

         } 
        }); 


     } 

    if (chatMessage.getType().equalsIgnoreCase("image") || chatMessage.getType().equalsIgnoreCase("photo")) 
    { 
     mImageViewHolder = getImageViewHolder(mConvertView); 
     mImageViewHolder.mChatmessage=chatMessage; 
     Log.d("Node", "this is Image position is "+chatMessages.get(position)); 

     // TODO change below code 
     if(chatMessage.getSenderId() != null) 
      setAlignment(mImageViewHolder, chatMessage.getSenderId().intValue() != ((SMBChatApp) context.getApplication()).getQbUser().getId().intValue()); 
     else 
      setAlignment(mImageViewHolder, false); 

      mImageViewHolder.txtInfo.setText(getTimeText(chatMessage.getDate_sent())); 

      if (chatMessage.getProperty("localfile") != null) { 

       imageUri1 = chatMessage.getProperty("localfile"); 
       String status = chatMessage.getProperty("isUpload"); 

       imageUri2 = "file://" + imageUri1; 

       Log.d("Node", "This time from local"); 

       ImageLoader.getInstance().displayImage(chatMessage.getUrl(), 
         mImageViewHolder.myimageview, disply); 

       // 
       // Log.d("Node", "IMAGEURI is : " + imageUri2 
       // + "And status is " + status); 

      } else { 

       Log.d("Node", "Here we are now else"); 
       ImageLoader.getInstance().displayImage(chatMessage.getUrl(), 
         mImageViewHolder.myimageview, disply); 
      } 

      mImageViewHolder.myimageview.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Toast.makeText(context, "This is Image", 
          Toast.LENGTH_LONG).show(); 
        Intent intent = new Intent(context, 
          ShowImgActivity.class); 

        String urll = chatMessage.getUrl(); 

        Bitmap bitmap = mImageViewHolder.myimageview.getDrawingCache(); 
        intent.putExtra("URL", urll); 

        intent.putExtra("BitmapImage", bitmap); 
        context.startActivity(intent); 
       } 
      }); 
     } 


     //if aatchmnet is video then do this 
     else if (chatMessage.getType().equalsIgnoreCase("video")) { 



      mImageViewHolder = getImageViewHolder(mConvertView); 
      mImageViewHolder.mChatmessage=chatMessage; 

      // TODO change below code 
      if(chatMessage.getSenderId() != null) 
       setAlignment(mImageViewHolder, chatMessage.getSenderId().intValue() != ((SMBChatApp) context.getApplication()).getQbUser().getId().intValue()); 
      else 
       setAlignment(mImageViewHolder, false); 

      mImageViewHolder.txtInfo.setText(getTimeText(chatMessage.getDate_sent())); 

      // Log.d("Node1", "This time from local videos"); 
      if (chatMessage.getVideo_thumb() != null) { 

       Log.i("Node", "Yes this video has thumbnail"); 
       Bitmap bitmp = StringToBitMap(chatMessage.getProperty("video_thumb")); 
       if (bitmp != null) { 
        mImageViewHolder.myimageview.setImageBitmap(bitmp); 
       } else { 
        mImageViewHolder.myimageview 
        .setImageResource(R.drawable.vids); 
       } 

      } else { 
       Log.i("Node", "Yes this dont have thumbanil"); 
       ImageLoader.getInstance().displayImage(chatMessage.getUrl(), 
         mImageViewHolder.myimageview, disply); 
      } 

      mImageViewHolder.myimageview.setOnClickListener(new View.OnClickListener() { 

       public void onClick(View v) { 
        final ImageView imageThumbnail = (ImageView)v; 

        final Handler handler=new Handler() { 
         public void handleMessage(Message msg) { 

          Log.e("", "handeler bmVideoThumbnail"+bmVideoThumbnail); 

          if (bmVideoThumbnail!=null) { 
           imageThumbnail.setImageBitmap(bmVideoThumbnail); 
          } 

         }; 
        }; 

        new Thread() 
        { 
         public void run() { 
          //We are creating folder first using mkdir 
          File f = new File(Environment.getExternalStorageDirectory()+ "/smbchat/");       
          if(!f.exists()){ 
           f.mkdirs(); 
          } 

          //then we want to store downloded file in that folder 
          File output = new File(f, "VID_" + System.currentTimeMillis() + "_video.mp4"); 

          Log.d("Node", "URL VALUE "+chatMessage.getUrl()); 
          HttpRequest.get(chatMessage.getUrl()).receive(output); 

          audioFileName=String.valueOf(output); 



          Log.d("Node", "FILE SAVED SUCCESSFULLY AUDIOFILENAME " + audioFileName); 

          donloadedVideoUri= "file://" + audioFileName; 

          Log.e("Node", "donloadedVideoUri INSIDE THREAD------"+donloadedVideoUri); 

          bmVideoThumbnail=ThumbnailUtils.createVideoThumbnail(audioFileName, android.provider.MediaStore.Video.Thumbnails.MICRO_KIND);  

          Log.e("Node",  "bmVideoThumbnail---------"+bmVideoThumbnail); 
          if(bmVideoThumbnail !=null) 
           handler.sendEmptyMessage(0); 


          }; 

        }.start(); 























//     String uriString = chatMessage.getUrl(); 
//     Uri intentUri = Uri.parse(uriString); 
// 
//     Intent intent2 = new Intent(); 
//     intent2.setAction(Intent.ACTION_VIEW); 
//     intent2.setDataAndType(intentUri, "video/*"); 
//     context.startActivity(intent2); 
       } 
      }); 





    } 




} 






     else { 

       mTextViewHolder = getTextViewHolder(mConvertView); 
       mTextViewHolder.mChatmessage=chatMessage; 

       Log.d("Node", "this is text position is "+chatMessages.get(position)); 
      //TODO redo following logic 
      if(chatMessage.getSenderId() != null) 
       setAlignment(mTextViewHolder, chatMessage.getSenderId().intValue() != ((SMBChatApp) context.getApplication()).getQbUser().getId().intValue()); 
      else 
       setAlignment(mTextViewHolder, false); 

      mTextViewHolder.txtInfo.setText(getTimeText(chatMessage.getDate_sent())); 

      mTextViewHolder.txtMessage.setText(chatMessage.getBody()); 

      mTextViewHolder.message = chatMessage; 


     } 

    return mConvertView; 

回答

0

使用一個ViewHolder並定義三個字段並根據狀態顯示隱藏視圖。 維護列表中的狀態不在適配器中。 因爲列表項目在列表視圖滾動上重新創建。

+0

如何維護項目的狀態,不管縮略圖是否被下載 – OmD

+0

創建一個枚舉並定義不同的字段(開始,錯誤,下載,完成)。並根據此枚舉值顯示隱藏項目.. –

0

您可以在多個列表項中看到與Android重用列表項目視圖相同的縮略圖。 如果您沒有爲列表項目的位置顯示正確的圖像,則需要注意使縮略圖不可見或使用「圖標不顯示圖像」。此檢查必須在列表的適配器的getView方法中進行。