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;
}
無論你相信什麼,只要閱讀該消息即可。您必須在後臺線程中執行大量負載,即任何數據獲取都會進入異步任務。 HTC設備上你只是幸運。三星做了很多錯事,但你對這種行爲負有明確的責任。另外:HTC設備上的滾動效果也非常糟糕。 – stefan 2013-05-06 15:06:40
如果您可以顯示代碼會更容易。你是否在UI線程上進行任何後臺操作(如調用webservices等)?查看每個供應商定製的android,這可能是三星的問題,獲取錯誤的門檻比HTC低 – Shrikant 2013-05-06 15:07:35
三星設備似乎對UI線程的工作非常敏感。你是從web服務加載圖像/數據? (如果是這樣,在UI線程?) – Johannes 2013-05-06 15:11:49