ListView très lent lors du défilement (à l'aide de ViewHolder/recyclage)

Mise à JOUR 2011-08-29
Si je supprime l'image dans le NodePickup, le lagginess est allé.

La question est pourquoi?

----

Je suis de retour à l'essai de certaines Android dev de nouveau. J'ai un "vieux" téléphone HTC Hero qui traînent, j'ai donc démarré que l'on fait des mises à jour et sont maintenant n cours d'exécution à nouveau avec Eclipse et le reste.

J'ai Android 2.1 en cours d'exécution sur l'appareil.

J'ai fait une épreuve très simple application qui ne marche pas à faire quoi que ce soit, sauf pour montrer certaines Activités, par exemple. Même si il n'y a pas de connexion de base de données, pas de données lues à partir de n'importe quel réseau, l'application est très lente. TRÈS lent.

Par exemple, j'ai une ListView avec quelques éléments de mise en page. Lors de l'ajout de seulement 6 à 7 éléments (de sorte que je reçois le défilement) il est incroyablement lent lors du défilement. Aussi, j'ai quelques boutons qui modifie l'Activité et aussi, c'est très très lent:

mButtonListenerUPP = new OnClickListener() {
    @Override
    public void onClick(View v)
    {
        Intent myIntent = new Intent(BaseActivity.this, ActivityMain.class);
        BaseActivity.this.startActivity(myIntent);
    }
};

Je ne peux pas comprendre pourquoi, donc, Im juste de poster le code ici et espère que quelqu'un a quelque astuce pour moi =)

Thx!

La Carte, NodeRowAdapter

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.view.*;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class NodeRowAdapter extends ArrayAdapter 
{
private Activity context;
private ArrayList<Node> mList;
private LayoutInflater inflater;
NodeRowAdapter(Activity context, ArrayList<Node> objects) 
{
super(context, R.layout.nodepickup, objects);
this.context=context;
mList = objects;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
class ViewHolder 
{
TextView name;
TextView time;
TextView road;
Node node;
}
public Node getNode(int position)
{
if (mList != null && mList.size() > position)
return mList.get(position);
else
return null;
}
public View getView(int position, View convertView, ViewGroup parent) 
{
View view = convertView;
ViewHolder holder;
if (view == null)
{
view = inflater.inflate(R.layout.nodepickup, parent, false);
holder = new ViewHolder();
holder.name =(TextView)view.findViewById(R.id.name);
holder.time =(TextView)view.findViewById(R.id.time);
holder.road =(TextView)view.findViewById(R.id.road);
view.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
Node node = mList.get(position);
holder.name.setText(node.name);
holder.time.setText(node.time);
holder.road.setText(node.road);
return(view);
}
}

L'activité principale de ActivityMain

public class ActivityMain extends BaseActivity 
{
private NodeRowAdapter _nodeRowAdapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SICApplication._myContext = this;
SICApplication._myContext = this;
_nodeRowAdapter = new NodeRowAdapter(this, SICApplication.dataHolder_activityMain._nodes);
ListView listView1 = (ListView) findViewById(R.id.ListViewNodes);
listView1.setOnItemClickListener(new OnItemClickListener() 
{
public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{
Node node = _nodeRowAdapter.getNode(position);
Log.v("MyApp", "Node=" + node.name);
} 
});
listView1.setAdapter(_nodeRowAdapter);  
}
/* Handles item selections */
public boolean onOptionsItemSelected(MenuItem item) 
{
switch (item.getItemId()) 
{
case R.id.add_item:
addNodeItem();
return true;
}
return false;
}
private void addNodeItem()
{
_nodeRowAdapter.add(new Node("Test", "asd asd ", "14:00", 1));
}
}

La coutume élément de la liste, NodePickup

public class NodePickup extends LinearLayout
{
public NodePickup(Context context, AttributeSet attributeSet)
{
super(context, attributeSet);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.nodepickup, this);
this.setOnClickListener(new OnClickListener() 
{
@Override
public void onClick(View v)
{
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMessage("Ajabaja!")
.setCancelable(true)
.setPositiveButton("JA!", new DialogInterface.OnClickListener() 
{
public void onClick(DialogInterface dialog, int id) 
{
dialog.cancel();
}
});
builder.show();
}
});
}
}

Et enfin, la NodePickup XML de mise en page

<LinearLayout 
android:id="@+id/LinearLayout01" 
android:layout_width="fill_parent" 
android:layout_height="64dip"
android:orientation="horizontal" 
android:background="@drawable/stateful_background"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView 
android:id="@+id/ImageView01" 
android:layout_width="40dip" 
android:layout_height="40dip"
android:src="@drawable/arrow_up_green"
android:background="@android:color/transparent">
</ImageView>
<LinearLayout 
android:id="@+id/LinearLayout02"
android:background="@android:color/transparent"
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:text="14:46 (15 min)"
android:id="@+id/time"
android:textSize="12dip"
android:textColor = "#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
</TextView>
<TextView
android:text="test"
android:id="@+id/road"
android:textSize="12dip"
android:textColor = "#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
</TextView>
<TextView
android:text="test test"
android:id="@+id/name"
android:textSize="12dip"
android:textColor = "#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
</TextView>
</LinearLayout>
</LinearLayout>
Utilisation Traceview pour déterminer où votre temps est en train d'être prises.
Thx, j'ai essayé. Na pas me dire quoi que ce soit. Peut-être que je suis absent de somethuing. Cependant, il semble que c'est l'ImageView qui le fait. Si je supprime que de NodePickup, sa rapidité de nouveau

OriginalL'auteur Ted | 2011-08-28