2013-05-06 27 views
0

我已經是一個下拉刷新列表視圖卻是露出一種奇怪的錯誤的自定義列表視圖的工作,每當我試圖在我的銀河S3運行它,它開始說與列表視圖三星S3錯誤

我/編舞(698):跳過了340幀!應用程序可能在其主線程上做了太多工作。

和滾動的listview是痛苦的緩慢。附件是測試s3和HTC設備的視頻,它在HTC上完美運行。任何指針,爲什麼會發生這種情況?

HTC:http://www.youtube.com/watch?v=9o1UXv_-Uco S3:http://www.youtube.com/watch?v=YjjC07M70Gk

編輯:代碼添加

public class MainActivity extends ListActivity implements OnScrollListener { 
private LinkedList<String> mListItems; 
TmbResultListViewAdapter adapter; 
Button editButton; 
public static boolean refreshOnDrag = true; 
private boolean isloading = false; 
private MyTask task; 
PullToRefreshListView lv; 
private ProgressBar footer; 
private TextView statusBar; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRefreshOnPull(true); 
    setContentView(R.layout.activity_main); 

    statusBar = (TextView) findViewById(R.id.statusbar); 

    editButton = (Button) findViewById(R.id.editButton); 
    lv = (PullToRefreshListView) getListView(); 
    lv.setOnRefreshListener(new OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      // Do work to refresh the list here. 
      if (refreshOnDrag) { 
       new GetDataTask().execute(); 
      } 
     } 
    }); 
    lv.setOnScrollListener(this); 
    lv.setScrollingCacheEnabled(false); 
    LayoutInflater inflater = (LayoutInflater)  getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    footer = (ProgressBar) inflater.inflate(R.layout.footer, null); 

    mListItems = new LinkedList<String>(); 
    mListItems.addAll(Arrays.asList(mStrings)); 

    // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    // android.R.layout.simple_list_item_1, mListItems); 

    adapter = new TmbResultListViewAdapter(this); 
    setListAdapter(adapter); 
} 

public void edit(View v) { 
    if (!adapter.showEditControlls) { 
     adapter.showEditControlls = true; 
     adapter.notifyDataSetChanged(); 
     editButton.setText("Done"); 
    } else { 
     adapter.showEditControlls = false; 
     adapter.notifyDataSetChanged(); 
     editButton.setText("Edit"); 
    } 
} 

public void setRefreshOnPull(boolean val) { 
    this.refreshOnDrag = val; 
} 

private class GetDataTask extends AsyncTask<Void, Void, String[]> { 

    @Override 
    protected String[] doInBackground(Void... params) { 
     // Simulates a background job. 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      ; 
     } 
     adapter.resetItems(); 
     return mStrings; 
    } 

    @Override 
    protected void onPostExecute(String[] result) { 
     mListItems.addFirst("Added after refresh..."); 

     // Call onRefreshComplete when the list has been refreshed. 
     ((PullToRefreshListView) getListView()).onRefreshComplete(); 
     super.onPostExecute(result); 
    } 
} 

private String[] mStrings = { "Abbaye de Belloc", 
     "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi", 
     "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", 
     "Airag", "Airedale", "Aisy Cendre", "Allgauer Emmentaler" }; 

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 

    int loadedItems = firstVisibleItem + visibleItemCount; 
    int offSet = (((int) ((firstVisibleItem - 1)/adapter.getItemPerPage())) * adapter 
      .getItemPerPage()) + 1; 
    statusBar.setText(offSet + " of " 
      + (offSet + adapter.getItemPerPage() - 1)); 
    if ((loadedItems == totalItemCount) && !isloading) { 
     if (task == null || (task.getStatus() == AsyncTask.Status.FINISHED)) { 
      task = new MyTask(); 
      task.execute(); 
     } 
    } 

} 

@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 
    // TODO Auto-generated method stub 

} 

class MyTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     ((PullToRefreshListView) getListView()).addFooterView(footer); 
     // adapter.notifyDataSetChanged(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     isloading = true; 
     adapter.loadMoreData(); 
     // ProgressBar pb = new ProgressBar(getApplicationContext(), null, 
     // android.R.attr.progressBarStyleHorizontal); 
     // LinearLayout linLayout = (LinearLayout) 
     // findViewById(R.id.linearLayout); 
     // linLayout.addView(pb); 
     Log.d("*****", "Loading..."); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // adapter.notifyDataSetChanged(); 
     isloading = false; 
     adapter.notifyDataSetChanged(); 
     ((PullToRefreshListView) getListView()).removeFooterView(footer); 
    } 
} 

@Override 
public void onBackPressed() { 
    finish(); 

} 
} 

適配器代碼添加 我已經看到,當過我嘗試滾動跳幀變得更糟。 所以可能是我做了很多工作,在getview方法

public View getView(final int position, View convertView, ViewGroup parent) { 
    //View convertView = convertView; 
    // TmbJSON eventDetail; 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.tmb_result_listitem, null); 
     mViewHolder = new viewHolder(); 

     mViewHolder.resultTitle = (TextView) convertView 
       .findViewById(R.id.resultTitle); 
     mViewHolder.resultPeriod = (TextView) convertView 
       .findViewById(R.id.resultPeriod); 
     mViewHolder.resultVenue = (TextView) convertView 
       .findViewById(R.id.resultVenue); 
     mViewHolder.resultDescription = (TextView) convertView 
       .findViewById(R.id.resultDescription); 
     mViewHolder.resultIcon = (ImageView) convertView 
       .findViewById(R.id.resultIcon); 
     mViewHolder.checkUnCheckIcon = (ImageView) convertView 
       .findViewById(R.id.checkuncheckicon); 
     mViewHolder.layout = (LinearLayout) convertView.findViewById(R.id.linearLayout); 
     mViewHolder.headerTextView = (TextView) convertView.findViewById(R.id.itemheader); 

     convertView.setTag(mViewHolder); 
    } else { 
     mViewHolder = (viewHolder) convertView.getTag(); 
    } 
    try { 

     mViewHolder.checkUnCheckIcon.setVisibility(showEditControlls ? ImageView.VISIBLE : ImageView.GONE); 
     mViewHolder.checkUnCheckIcon.setImageResource(mCheckedState.get(position) ? R.drawable.starschecked : R.drawable.starsunchecked); 
     mViewHolder.checkUnCheckIcon.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       if (mCheckedState.get(position)) { 
        mViewHolder.checkUnCheckIcon 
          .setImageResource(R.drawable.starsunchecked); 
        mCheckedState.set(position, false); 
       } else if (!mCheckedState.get(position)) { 

        mViewHolder.checkUnCheckIcon 
          .setImageResource(R.drawable.starschecked); 
        mCheckedState.set(position, true); 
       } 
       theAdapter.notifyDataSetChanged(); 
       Toast.makeText(activity.getApplicationContext(), position+"th Event un/checked", Toast.LENGTH_LONG).show(); 
      } 
     }); 


     String name = masterList.get(position).name;// eventDetail.smartStringWithPath(TmbJSON.arrayListObjectWithStrings("name")); 
     String detail = masterList.get(position).detail;// eventDetail.smartStringWithPath(TmbJSON.arrayListObjectWithStrings("detail")); 
     String venue = masterList.get(position).venue;// ((JSONObject)eventDetail.object).getJSONArray("prs").getJSONObject(0).getJSONObject("loc").getString("name"); 
     String period = masterList.get(position).period;// ((JSONObject)eventDetail.object).getJSONArray("prs").getJSONObject(0).getString("ts_z"); 

     mViewHolder.resultTitle.setText(name); 
     mViewHolder.resultPeriod.setText(period); 
     mViewHolder.resultVenue.setText(venue); 
     mViewHolder.resultDescription.setText(detail); 
     if((position) % (itemPerPage) == 0 && position!=0) 
     { mViewHolder.headerTextView.setText((position+1)+" of "+(int)(position+20)); 
      mViewHolder.headerTextView.setVisibility(TextView.VISIBLE); 
     } 
     else 
     { 
      mViewHolder.headerTextView.setVisibility(TextView.GONE); 

     } 
     int forthPos = getCount() - itemPerPage + 4; 
     int tenthPos = getCount() - itemPerPage + 10; 
     int sixteenthPos = getCount() - itemPerPage + 16; 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 




    return convertView; 
} 
+0

無論你相信什麼,只要閱讀該消息即可。您必須在後臺線程中執行大量負載,即任何數據獲取都會進入異步任務。 HTC設備上你只是幸運。三星做了很多錯事,但你對這種行爲負有明確的責任。另外:HTC設備上的滾動效果也非常糟糕。 – stefan 2013-05-06 15:06:40

+0

如果您可以顯示代碼會更容易。你是否在UI線程上進行任何後臺操作(如調用webservices等)?查看每個供應商定製的android,這可能是三星的問題,獲取錯誤的門檻比HTC低 – Shrikant 2013-05-06 15:07:35

+0

三星設備似乎對UI線程的工作非常敏感。你是從web服務加載圖像/數據? (如果是這樣,在UI線程?) – Johannes 2013-05-06 15:11:49

回答

0

對於任何其他人,面臨着同樣的還挺發給你將不得不尋找一些你在哪裏使用大量的內存,在我的情況它是造成這個問題的列表視圖中的圖像,我已經用一個質量較低的圖像取代了圖像,現在它的工作正常,但它仍然超出了我,那麼相同的列表視圖如何在較低端設備上更好地工作,設備。超越我 。