我在申请中使用了fragemnts。该片段包含有关我从web中获取的对象的一些详细信息。因此布局有很多项目,我需要对它们进行全面设置以设置数据。我使用asynchtask
从Web加载数据,然后使视图的主片段可见。这是我的片段oncreate
方法的代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_app_detail,
container, false);
final LayoutInflater inflaterFinal = inflater;
// Rating View --------------------------------------
final LinearLayout diagramContainers = (LinearLayout) rootView
.findViewById(R.id.lyt_app_details_rating_container_diagrams);
diagramContainers.post(new Runnable() {
public void run() {
try {
// initialize helper variables------------
int width_fiveStartRateBar = 0;
int maxRateCount = 0;
for (int i = 0; i < 5; i++) {
maxRateCount = Math.max(maxRateCount,
app.getRateCounts()[i]);
}
int width_rateCountTxt = 0;
// initialize layout objects--------------
for (int j = 4; j >= 0; j--) {
LinearLayout diagramLyt = (LinearLayout) inflaterFinal
.inflate(
R.layout.lyt_app_details_rating_diagram,
null, false);
// star rate bar
RatingBar starRateBar = (RatingBar) diagramLyt
.findViewById(R.id.lyt_app_details_rating_diagram_rb_starbar);
starRateBar.setNumStars(j + 1);
starRateBar.setRating(j + 1);
starRateBar.measure(0, 0);
if (j == 4)
width_fiveStartRateBar = starRateBar
.getMeasuredWidth();
else {
int p = width_fiveStartRateBar
- starRateBar.getMeasuredWidth();
diagramLyt.setPadding(p, 0, 0, 0);
}
// rate Count txt
TextView rateCountTxt = (TextView) diagramLyt
.findViewById(R.id.lyt_app_details_rating_digram_txt_count);
rateCountTxt.setText(String.valueOf(app
.getRateCounts()[j]));
rateCountTxt.measure(0, 0);
width_rateCountTxt = rateCountTxt
.getMeasuredWidth();
// color bar
int totalWidth_colorBar = diagramContainers
.getWidth()
- (width_fiveStartRateBar + dpToPixel(5)
+ dpToPixel(5) + width_rateCountTxt);
float barWith = (totalWidth_colorBar * app
.getRateCounts()[j]) / maxRateCount;
LinearLayout bar = (LinearLayout) diagramLyt
.findViewById(R.id.lyt_app_details_rating_diagram_linear_colorbar);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
(int) barWith, dpToPixel(12));
lp.setMargins(dpToPixel(5), 0, dpToPixel(5), 0);
bar.setLayoutParams(lp);
if (j == 4)
bar.setBackgroundResource(R.drawable.bg_colorbar_five);
else if (j == 3)
bar.setBackgroundResource(R.drawable.bg_colorbar_four);
else if (j == 2)
bar.setBackgroundResource(R.drawable.bg_colorbar_three);
else if (j == 1)
bar.setBackgroundResource(R.drawable.bg_colorbar_two);
else
bar.setBackgroundResource(R.drawable.bg_colorbar_one);
diagramContainers.addView(diagramLyt);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
// Thumb-nail Images Gallery ------------------------
LinearLayout gallery = (LinearLayout) rootView
.findViewById(R.id.gallery1);
//gallery.post(new Runnable() {
// @Override
// public void run() {
for (int i = 0; i < app.getThumbShotsLink().size(); i++) {
// get URL
final String tURL = app.getThumbShotsLink().get(i);
final String rURL = app.getScreenShotsLinks().get(i);
// create image view
ImageView v = new ImageView(getActivity());
// add layout parameters
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
dpToPixel(115), dpToPixel(175));
lp.setMargins(0, 0, dpToPixel(3), 0);
v.setLayoutParams(lp);
// set image
if (i % 2 == 0)
v.setImageResource(R.color.light_green);
else
v.setImageResource(R.color.dark_green);
// listen to click
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO: OPEN FULL SCREEN IMAGE PAGE
Toast.makeText(getActivity(), tURL, Toast.LENGTH_LONG)
.show();
}
});
// add to view
gallery.addView(v);
}
// }
//});
// Similar Apps -----------------------------------
LinearLayout v = (LinearLayout) rootView
.findViewById(R.id.app_details_llyt_similars);
GridView similarGrid = (GridView) v
.findViewById(R.id.lyt_app_similar_grid);
similarGrid.setAdapter(new AppGridAdapter(app.getSimilarApps(),
getActivity()));
// Developer Apps ----------------------------------
View v2 = (View) rootView
.findViewById(R.id.app_details_llyt_developer_apps);
GridView developerGrid = (GridView) v2
.findViewById(R.id.lyt_app_similar_grid);
developerGrid.setAdapter(new AppGridAdapter(app.getDeveloperApps(),
getActivity()));
return rootView;
}
问题是应用程序加载布局并将数据设置为大约需要5秒。我正在寻找一种方法,我如何膨胀布局并将数据设置为它们,以便应用程序不会锁定5秒钟。
答案 0 :(得分:0)
我不确定完全理解您的代码。 你想用以下几行做什么?
diagramContainers.post(new Runnable() { ...
此调用不会创建新线程以在后台执行作业。它只会在onCreate()结束后执行。 Maibe您的一些性能问题来自于此。
您创建新视图以将其添加到父布局的方式对我来说似乎也是错误的。你应该永远不必创建这么多的视图。您应该使用ViewGroup / Adapter模式(参见this链接)。适配器将在内部管理视图,并在必要时重用视图。这可以大大提高你的表现。
编辑:
您可以使用多个listview。你可以拥有每种类型的项目(一个用于图表,一个用于缩略图等...)。 无论如何,它似乎在您的diagramContainers部分中,您总是在膨胀相同数量的视图。在这种情况下,为什么不在xml中创建这些视图。这样可以证明你的表现。
尝试发布你的R.layout.fragment_app_detail布局,以便我能更好地理解你在做什么。