Android 带视窗夹的ListView

Android 带视窗夹的ListView,android,listview,cursor,simplecursoradapter,Android,Listview,Cursor,Simplecursoradapter,伙计们 我的listview有问题。我使用了ViewHolder来优化性能,但仍然有一些listview滞后。你能给我一些建议吗 这是我的ListView XML <ListView android:id="@+id/list1" android:layout_width="fill_parent" android:layout_height="f

伙计们

我的listview有问题。我使用了ViewHolder来优化性能,但仍然有一些listview滞后。你能给我一些建议吗

这是我的ListView XML

<ListView
                        android:id="@+id/list1"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:divider="@android:color/transparent"
                        android:dividerHeight="10dp"
                        android:fadingEdge="none"
                        android:fastScrollEnabled="true"
                        android:headerDividersEnabled="false"
                        android:listSelector="@android:color/transparent"
                        android:scrollingCache="false" />
}

非常感谢你的帮助

每次需要填充列表中的新项时,都将调用
getView()
方法。您的做法是在该方法中获得更多的平滑性能。我会重构出设置布局所不需要的任何东西,并将其移动到其他地方,这样它就不会一直被调用。特别是侦听器和数据库调用。他们真的不需要在那里。每次创建一个新的列表项时,都会创建7个新的侦听器对象。。。哎哟

您可以覆盖
活动中的
onListItemClick()
Fragment
中的,因此当用户单击列表项时,您可以执行所需的工作。然后,您可以使用单击的项目的位置来确定用户单击的内容。我建议这样做


您可以尝试为您需要的每个侦听器创建一个内部类,并将它们存储在实例变量中,这样就不需要在每次显示新列表项时都实例化它们。然而,我不建议这样做。它有点臭,可能仍然无法完全解决性能问题。

谢谢Jason的帮助。我很想在我的活动中实现onlistitemclick(),但是如何在我的主类中的listview自定义布局中引用和实现行按钮呢?任何例子都将不胜感激!您可以使用传递到
onListItemClick
位置
来判断单击了哪一行,也可以使用
视图
id来确定单击了什么
public class AlternateRowCursorAdapter extends SimpleCursorAdapter {

int layoutn;
LayoutInflater mInflater;
SQLiteDatabase mDb;
MyDbHelper mHelper;
private final Cursor mCursor;
private final int mLayout;
private final LayoutInflater mLayoutInflater;
private final Context mContext;

public static final String TABLE_NAME = "MSGS";


public AlternateRowCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to) {

    super(context, R.layout.listtype, c, from, to);

    this.mContext = context;
    this.mCursor = c;
    this.mLayout = layout;
    this.mLayoutInflater = LayoutInflater.from(context);

}

private final class ViewHolder {

    public TextView Title;
    public ImageView one, two, three, four, five, six, seven, zina;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (mCursor.moveToPosition(position)) {

         final ViewHolder viewHolder;

        if (convertView == null) {


            convertView = mLayoutInflater.inflate(mLayout, parent, false);

            viewHolder = new ViewHolder();

            viewHolder.Title = (TextView) convertView
                    .findViewById(R.id.Sandtit);
            viewHolder.one = (ImageView) convertView
                    .findViewById(R.id.imageView5);
            viewHolder.two = (ImageView) convertView
                    .findViewById(R.id.imageView4);
            viewHolder.three = (ImageView) convertView
                    .findViewById(R.id.ImageView03);
            viewHolder.four = (ImageView) convertView
                    .findViewById(R.id.ImageView02);
            viewHolder.five = (ImageView) convertView
                    .findViewById(R.id.imageView1);
            viewHolder.six = (ImageView) convertView
                    .findViewById(R.id.ImageView06);
            viewHolder.seven = (ImageView) convertView
                    .findViewById(R.id.ImageView01);
            viewHolder.zina = (ImageView) convertView
                    .findViewById(R.id.imageView2);

            convertView.setTag(viewHolder);
        }

        else {

            viewHolder = (ViewHolder) convertView.getTag();

        }

        final String Title, SandID, MsgID, MsgFav;

        Title = mCursor.getString(2);
        SandID = mCursor.getString(1);
        MsgID = mCursor.getString(0);
        MsgFav = mCursor.getString(4);

        Typeface tf = Typeface.createFromAsset(mContext.getAssets(),
            "fonts/khalaadsara.ttf");

        viewHolder.Title.setText(Title);
        viewHolder.Title.setTypeface(tf);


        try {
            mHelper = new MyDbHelper(mContext);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (MsgFav.contentEquals("YES")) {
            viewHolder.one.setImageResource(R.drawable.favorpress);
        } else {
            viewHolder.one.setImageResource(R.drawable.favornorm);
        }

        mDb = mHelper.getWritableDatabase();

        viewHolder.one.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                if (MsgFav.contentEquals("NO")) {
                    ContentValues args = new ContentValues();
                    args.put(mHelper.COL_MsgFavor, "YES");
                    mDb.update(TABLE_NAME, args, "_id = ?",
                            new String[] { MsgID });

                    viewHolder.one.setImageResource(R.drawable.favorpress);
                    Toast.makeText(
                            mContext,
                            "تم إضافة الرسالة إلي الرسائل المفضلة بنجاح...",
                            9000).show();

                    notifyDataSetChanged();
                    mCursor.requery();

                }

                else {
                    ContentValues args = new ContentValues();
                    args.put(mHelper.COL_MsgFavor, "NO");
                    mDb.update(TABLE_NAME, args, "_id = ?",
                            new String[] { MsgID });

                    viewHolder.one.setImageResource(R.drawable.favornorm);
                    Toast.makeText(mContext,
                            "تم حذف الرسالة من الرسائل المفضلة بنجاح...",
                            9000).show();

                    notifyDataSetChanged();
                    mCursor.requery();

                }

            }

        });


        viewHolder.two.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                Intent emailIntentt = new Intent(
                        android.content.Intent.ACTION_VIEW);

                emailIntentt.setData(Uri.parse("sms:"));

                String breaks = "\n";

                emailIntentt.putExtra("sms_body", Title);

                mContext.startActivity(emailIntentt);

            }
        });

        viewHolder.three.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                viewHolder.Title.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                        (viewHolder.Title.getTextSize() - 1f));

            }

        });

        viewHolder.four.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                Intent emailIntentt = new Intent(
                        android.content.Intent.ACTION_SEND);

                String breaks = "\n";

                String[] recipientss = new String[] {
                        "من فضلك...أدخل بريدك الأليكتروني", "", };

                emailIntentt.putExtra(android.content.Intent.EXTRA_EMAIL,
                        recipientss);

                emailIntentt.putExtra(android.content.Intent.EXTRA_SUBJECT,
                        "مسجات رمضان 2013");

                emailIntentt.putExtra(android.content.Intent.EXTRA_TEXT,
                        breaks + Title);

                emailIntentt.setType("text/plain");

                mContext.startActivity(Intent.createChooser(emailIntentt,
                        "مشاركة بواسطة..."));


            }
        });

        viewHolder.five.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                ClipboardManager ClipMan = (ClipboardManager) mContext
                        .getSystemService(Context.CLIPBOARD_SERVICE);
                ClipMan.setText(Title);

                Toast.makeText(mContext, "تم نسخ الرسالة بنجاح....", 9000)
                        .show();
            }
        });

        viewHolder.six.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                viewHolder.Title.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                        (viewHolder.Title.getTextSize() + 1f));
            }
        });

        viewHolder.seven.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                Intent waIntent = new Intent(Intent.ACTION_SEND);

                if (waIntent != null)

                {

                    waIntent.setType("text/plain");
                    String text = Title;
                    waIntent.setPackage("com.whatsapp");

                    waIntent.putExtra(Intent.EXTRA_TEXT, text);//
                    mContext.startActivity(Intent.createChooser(waIntent,
                            "مشاركة بواسطة..."));
                }

            }
        });

    }

    return convertView;
}