2015-04-22 78 views
1

我有3個片段與我,這是「家」,「商店」和「集合」。在我執行Collection片段中的DownloadTask後,進度條和文字視圖正在更新。但是,一旦我選擇了主頁選項卡(第1個選項卡)並選擇回收集選項卡(第3個選項卡),視圖將被重新創建而不是回收,這意味着進度和文本視圖會恢復到默認狀態。轉換視圖總是返回null而不是回收

原因可能是轉換視圖,因爲它保持返回空值並創建新視圖。但我不知道它爲什麼一直返回null。希望任何人都能幫忙。

package com.GempakStarz.GempakMagazine 

public class CollectionListAdapter extends BaseAdapter implements 
     OnClickListener { 

    private Context context; 
    private Activity parentActivity; 
    private String[] books; 
    private Map<String, Button> downloadbuttons = new HashMap<String, Button>(); 
    private Map<String, Button> deletebuttons = new HashMap<String, Button>(); 
    private Map<String, ProgressBar> progressbars = new HashMap<String, ProgressBar>(); 
    private Map<String, TextView> progress_texts = new HashMap<String, TextView>(); 

    public CollectionListAdapter(Context context, Activity parentActivity, 
           String[] books) { 
     this.context = context; 
     this.books = books; 
     this.parentActivity = parentActivity; 
    } 

    @Override 
    public int getCount() { 
     return books.length; 
    } 

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

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 

      Log.v("Check", "ConvertViewCreated!"); 
      String bookname = books[position]; 
      convertView = new View(context); 
      convertView = inflater.inflate(R.layout.collection_list_item, null); 

      TextView textView = (TextView) convertView.findViewById(R.id.title); 
      textView.setText(bookname.replace("gempak", "G")); 

      // set image based on selected text 
      ImageView imageView = (ImageView) convertView.findViewById(R.id.image); 
      imageView.setImageResource(R.drawable.ic_launcher); 

      Button download_button = (Button) convertView 
        .findViewById(R.id.download); 
      download_button.setTag(bookname); 
      download_button.setOnClickListener(this); 

      Button delete_button = (Button) convertView.findViewById(R.id.delete); 
      delete_button.setTag(bookname); 
      delete_button.setOnClickListener(this); 

      RelativeLayout view = (RelativeLayout) convertView 
        .findViewById(R.id.background); 
      view.setTag(bookname); 
      view.setOnClickListener(this); 

      ProgressBar progressbar = (ProgressBar) convertView 
        .findViewById(R.id.progressBar1); 
      TextView progress_text = (TextView) convertView 
        .findViewById(R.id.text_progress); 

      downloadbuttons.put(bookname, download_button); 
      deletebuttons.put(bookname, delete_button); 
      progressbars.put(bookname, progressbar); 
      progress_texts.put(bookname, progress_text); 

      if (DownloadCompleted(bookname)) { 
       downloadbuttons.get(bookname).setEnabled(false); 
       download_button.setText("Download"); 
       progressbars.get(bookname).setProgress(100); 
       progress_texts.get(bookname).setText("Download Complete"); 
      } else { 
       Log.v("LOL", "Not in Storage"); 
      } 

     } else { 
      Log.v("Check", "ConvertViewReused!!!"); 
     } 
     return convertView; 
    } 

    public boolean DownloadCompleted(String bookname) { 

     if (Book.getInstance() != null) { 

      int pagenumber = Book.getInstance().GetBookLibrary().get(bookname).max_page; 
      int saved_files = 0; 

      for (int i = 0; i < pagenumber; i++) { 

       String foldername = bookname; 
       String filename = "page" + i; 
       String filepath = Environment.getExternalStorageDirectory() 
         .getPath() + "/" + foldername + "/" + filename + ".jpg"; 
       File f = new File(Environment.getExternalStorageDirectory(), 
         foldername); 
       if (!f.exists()) { 
        f.mkdirs();// create new directory 
       } 

       File fpath = new File(filepath); 
       if (fpath.exists()) { 
        saved_files += 1; 
       } 

      } 

      if (saved_files == pagenumber) { 
       return true; 
      } else { 
       return false; 
      } 
     } 
     return false; 
    } 

    String checkInternetStatus() { 
     final ConnectivityManager connMgr = (ConnectivityManager) parentActivity 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     final android.net.NetworkInfo wifi = connMgr 
       .getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     final android.net.NetworkInfo mobile = connMgr 
       .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
     if (wifi.isAvailable()) { 
      return "Wifi"; 
     } else if (mobile.isAvailable()) { 
      return "Data"; 
     } else { 
      return "None"; 
     } 
    } 

    @Override 
    public void onClick(View v) { 

     final String bookname = v.getTag().toString(); 
     final DownloadTask task = new DownloadTask(context, v.getTag() 
       .toString(), progressbars.get(bookname), 
       downloadbuttons.get(bookname), deletebuttons.get(bookname), 
       progress_texts.get(bookname)); 

     switch (v.getId()) { 

      case R.id.download: 
       if (checkInternetStatus() == "Wifi") { 
        if (Book.getInstance() != null) { 
         Toast.makeText(
           context, 
           "Download : " 
             + Book.getInstance().GetBookLibrary() 
             .get(bookname).name, 
           Toast.LENGTH_SHORT).show(); 
         task.execute(Book.getInstance().GetDownloadLinks(bookname)); 

        } else { 
         Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show(); 
        } 
       } else if (checkInternetStatus() == "Data") { 
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
          parentActivity); 
        alertDialogBuilder 
          .setMessage("You are using mobile data right now, continue download with mobile data? "); 
        alertDialogBuilder.setTitle("" + bookname); 
        alertDialogBuilder.setPositiveButton("Yes", 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface arg0, int arg1) { 
            if (Book.getInstance() != null) { 
             Toast.makeText(
               context, 
               "Download : " 
                 + Book.getInstance() 
                 .GetBookLibrary() 
                 .get(bookname).name, 
               Toast.LENGTH_SHORT).show(); 
             task.execute(Book.getInstance() 
               .GetDownloadLinks(bookname)); 

            } else { 
             Toast.makeText(context, "Error", 
               Toast.LENGTH_SHORT).show(); 
            } 
           } 
          }); 
        alertDialogBuilder.setNegativeButton("No", 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, 
                int which) { 

           } 
          }); 
        AlertDialog alertDialog = alertDialogBuilder.create(); 
        alertDialog.show(); 
       } else { 

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
          parentActivity); 
        alertDialogBuilder.setMessage("No Internet Access "); 
        alertDialogBuilder.setTitle("System Message"); 
        AlertDialog alertDialog = alertDialogBuilder.create(); 
        alertDialog.show(); 
       } 
       break; 

      case R.id.delete: 

       AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
         parentActivity); 
       alertDialogBuilder.setMessage("Delete " + bookname + "?"); 
       alertDialogBuilder.setTitle("" + bookname); 
       alertDialogBuilder.setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface arg0, int arg1) { 
           Toast.makeText(context, bookname + " Deleted", 
             Toast.LENGTH_SHORT).show(); 
           task.cancel(true); 
           task.DeleteAll(bookname); 
          } 
         }); 
       alertDialogBuilder.setNegativeButton("No", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 

          } 
         }); 
       AlertDialog alertDialog = alertDialogBuilder.create(); 
       alertDialog.show(); 
       break; 

      case R.id.background: 
       if (DownloadCompleted(v.getTag().toString())) { 
        Intent read_view = new Intent(context, ReadViewPager.class); 
        read_view.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
          | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 
        read_view.putExtra("Bookname", v.getTag().toString()); 
        read_view.putExtra("PageNumber", 153); 
        context.startActivity(read_view); 
       } 
       break; 
     } 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

回答

0

但是,一旦我選擇主頁選項卡(1片),並選擇回 集合選項卡(第三個標籤)的意見是重新創建的,而不是回收 這意味着進步和TextView的恢復到默認狀態。

你錯了。你總是返回相同的convertView,這是你第一次初始化的時候,當convertView爲null,而不改變值。值的分配必須在if/else警衛之外執行。例如。

if (convertView == null) { 
    // inflate convertView 
} 

// convertView.findViewById 
// retrieve it the item at position in your dataset 
// assign values to the views 
+0

感謝您的回答。我現在會試一試:) –

0

剛剛更新此:

convertView = inflater.inflate(R.layout.collection_list_item, parent, false); 

,並刪除此:

convertView = new View(context); 

,並呼籲:

LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

if(convertView==null){...

0

對於你的情況,你需要改變你的getView這樣:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     Log.v("Check", "ConvertViewCreated!"); 
     LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.collection_list_item, null); 
    } else { 
     Log.v("Check", "ConvertViewReused!!!"); 
    } 
    String bookname = books[position]; 
    TextView textView = (TextView) convertView.findViewById(R.id.title); 
    textView.setText(bookname.replace("gempak", "G")); 

     // set image based on selected text 
    ImageView imageView = (ImageView) convertView.findViewById(R.id.image); 
     imageView.setImageResource(R.drawable.ic_launcher); 

    Button download_button = (Button) convertView 
       .findViewById(R.id.download); 
    download_button.setTag(bookname); 
    download_button.setOnClickListener(this); 

    Button delete_button = (Button) convertView.findViewById(R.id.delete); 
    delete_button.setTag(bookname); 
    delete_button.setOnClickListener(this); 

    RelativeLayout view = (RelativeLayout) convertView 
       .findViewById(R.id.background); 
    view.setTag(bookname); 
    view.setOnClickListener(this); 

    ProgressBar progressbar = (ProgressBar) convertView 
       .findViewById(R.id.progressBar1); 
    TextView progress_text = (TextView) convertView 
       .findViewById(R.id.text_progress); 

    downloadbuttons.put(bookname, download_button); 
    deletebuttons.put(bookname, delete_button); 
    progressbars.put(bookname, progressbar); 
    progress_texts.put(bookname, progress_text); 

    if (DownloadCompleted(bookname)) { 
      downloadbuttons.get(bookname).setEnabled(false); 
      download_button.setText("Download"); 
      progressbars.get(bookname).setProgress(100); 
      progress_texts.get(bookname).setText("Download Complete"); 
     } else { 
      Log.v("LOL", "Not in Storage"); 
     } 
    return convertView; 
} 

然後,我不認爲這些代碼是最好的編碼規則。我向你推薦ViewHolder的方式。