Android listview和Performance中的3个支架
我有三张票。1件物品1个支架。 方法getView看起来:Android listview和Performance中的3个支架,android,performance,listview,Android,Performance,Listview,我有三张票。1件物品1个支架。 方法getView看起来: public View getView(int position, View convertView, ViewGroup parent) { mCursor.moveToPosition(position); int type = checkDialogType(mCursor); Holder holder = null; if (convertView != null){ holde
public View getView(int position, View convertView, ViewGroup parent) {
mCursor.moveToPosition(position);
int type = checkDialogType(mCursor);
Holder holder = null;
if (convertView != null){
holder = (Holder)convertView.getTag(type);
if (holder == null){
holder = createHolderByType(type, parent);
}
} else {
holder = createHolderByType(type, parent);
}
return holder.fillView(mCursor, position); //convertView
}
其中createHolderByType()的内容:
它可以正常工作,但对于listView中的39个项,createHolderByType方法被调用了19次。为了创建一个支架,我需要膨胀xml。它很贵。若我尝试使用相同的视图来保存或将保存在内存中,那个么它是不起作用的。我可以用一些技巧来提高性能吗
UPD:
有一个持有人:
public class InHolder extends Holder {
private View baseView;
private TextView fio;
private TextView message;
private TextView date;
private ImageView isOnline;
private int type;
private ImageView senderIMG;
public InHolder(View v, Cursor dialogCursor, Context context, DialogCurAdapter adapter, int type){
super(dialogCursor, context, adapter);
fio = (TextView)v.findViewById(R.id.fio);
senderIMG = (ImageView)v.findViewById(R.id.sender_image);
message = (TextView)v.findViewById(R.id.message_preview);
date = (TextView)v.findViewById(R.id.date);
isOnline = (ImageView)v.findViewById(R.id.isonline);
this.type= type;
baseView = v;
baseView.setTag(type, this);
}
@Override
public View fillView(Cursor dialogCursor, final int position) {
try{
int ownerID = dialogCursor.getInt(ownerIndex);
User usr = mDButils.getUserByID(ownerID);
String messageText = Html.fromHtml(dialogCursor.getString(bodyIndex)).toString();
date.setText(DateUtils.getTime(dialogCursor.getInt(dateIndex), mContext));
message.setText(messageText);
if (messageText == null || messageText.equals("")){
if (dialogCursor.getInt(hasAttIndex) == 1){
message.setText(mContext.getResources().getString(R.string.attachment));
message.setTextColor(getColor(R.color.date_blue_to_white_selector));
}
}
if (dialogCursor.getInt(hasAttIndex) == 1){
String[] attaches = dialogCursor.getString(attTypeIndex).split(",");
}
if (dialogCursor.getInt(readstateIndex) == 0){
baseView.setBackgroundDrawable(getDrawable(R.drawable.lightblue_to_transparent_selector));
} else baseView.setBackgroundDrawable(getDrawable(R.drawable.white_to_blue_selector));
if (usr != null){
mImageLoader.displayImage(usr.getImageURL(), senderIMG);
fio.setText(usr.getFirstName() + " " + usr.getLastName());
isOnline.setVisibility(usr.isOnLine() == 1 ? View.VISIBLE : View.INVISIBLE);
} else {
AsyncUserLoader userLoader = new AsyncUserLoader(mContext) {
@Override
protected void onPostExecute(User user) {
if (user != null){
mDialogAdapter.updateItem(position);
}
}
};
userLoader.execute(Integer.parseInt(ownerID + ""));
}
}catch (Exception e){
e.printStackTrace();
}
return baseView;
}
@Override
public int getType() {
return type;
}
}
您可以为BaseAdapter实现多个布局,如和中所示
注意:在getItemViewType(int位置)中,可以使用checkDialogType(mCursor);查找要使用的布局类型。但是getItemViewType(int位置)应该返回0到2之间的值(当计数为3时)。我找到了一个解决方案。我制作了一个复杂的容器,其中包含了我需要的所有视图。取决于我使它们可见或不可见的视图类型。因此,当convertView与类型不匹配时,我不需要膨胀xml。是否确实将holder as标记添加到视图中?是的。它位于holder的构造函数内部,fillView返回该特定视图?是的,我发布了一个holder。请参阅upd。在您给出的示例中,我们可以看到以下内容:mInflater.inflate(R.layout.item1,null);如果型号不匹配,他会给物品充气。我也这么做。我将尝试使用基本适配器
public class InHolder extends Holder {
private View baseView;
private TextView fio;
private TextView message;
private TextView date;
private ImageView isOnline;
private int type;
private ImageView senderIMG;
public InHolder(View v, Cursor dialogCursor, Context context, DialogCurAdapter adapter, int type){
super(dialogCursor, context, adapter);
fio = (TextView)v.findViewById(R.id.fio);
senderIMG = (ImageView)v.findViewById(R.id.sender_image);
message = (TextView)v.findViewById(R.id.message_preview);
date = (TextView)v.findViewById(R.id.date);
isOnline = (ImageView)v.findViewById(R.id.isonline);
this.type= type;
baseView = v;
baseView.setTag(type, this);
}
@Override
public View fillView(Cursor dialogCursor, final int position) {
try{
int ownerID = dialogCursor.getInt(ownerIndex);
User usr = mDButils.getUserByID(ownerID);
String messageText = Html.fromHtml(dialogCursor.getString(bodyIndex)).toString();
date.setText(DateUtils.getTime(dialogCursor.getInt(dateIndex), mContext));
message.setText(messageText);
if (messageText == null || messageText.equals("")){
if (dialogCursor.getInt(hasAttIndex) == 1){
message.setText(mContext.getResources().getString(R.string.attachment));
message.setTextColor(getColor(R.color.date_blue_to_white_selector));
}
}
if (dialogCursor.getInt(hasAttIndex) == 1){
String[] attaches = dialogCursor.getString(attTypeIndex).split(",");
}
if (dialogCursor.getInt(readstateIndex) == 0){
baseView.setBackgroundDrawable(getDrawable(R.drawable.lightblue_to_transparent_selector));
} else baseView.setBackgroundDrawable(getDrawable(R.drawable.white_to_blue_selector));
if (usr != null){
mImageLoader.displayImage(usr.getImageURL(), senderIMG);
fio.setText(usr.getFirstName() + " " + usr.getLastName());
isOnline.setVisibility(usr.isOnLine() == 1 ? View.VISIBLE : View.INVISIBLE);
} else {
AsyncUserLoader userLoader = new AsyncUserLoader(mContext) {
@Override
protected void onPostExecute(User user) {
if (user != null){
mDialogAdapter.updateItem(position);
}
}
};
userLoader.execute(Integer.parseInt(ownerID + ""));
}
}catch (Exception e){
e.printStackTrace();
}
return baseView;
}
@Override
public int getType() {
return type;
}
}