简体   繁体   English

如何在Android中自定义适配器?

[英]How to customize an adapter in Android?

I am making a simple Android app that takes the name, email and contact number of a user and saves these (including an id) in the phone's memory (via sqlite). 我正在创建一个简单的Android应用程序,它接收用户的姓名,电子邮件和联系号码,并将这些(包括id)保存在手机的内存中(通过sqlite)。 A "Show All" page displays the details of all the user in the database in a ListView using a custom adapter. “全部显示”页面使用自定义适配器显示ListView数据库中所有用户的详细信息。 It runs like this: 它运行如下:

“全部显示”页面

It leaves these spaces in between the rows. 它将这些空间留在行之间。 How do I remove these spaces? 如何删除这些空格? Also, the details get mixed up while retrieving from the database. 此外,从数据库中检索时,细节会混淆。 Like the first row is displayed in the correct format (as I wanted) . 就像第一行以正确的格式显示(如我所愿)。 But the second's details got mixed up. 但是第二个细节变得混乱了。 How do I correct this? 我该如何纠正?

MyDBHandler.java MyDBHandler.java

public class MyDBHandler extends SQLiteOpenHelper{

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME= "user.db";
    public static final String TABLE_NAME = "data";
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_email = "email";
    public static final String COLUMN_phno = "phno";

    public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, DATABASE_NAME, factory, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String query = "CREATE TABLE "+TABLE_NAME+"("+
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+
                COLUMN_NAME + " VARCHAR(20),"+
                COLUMN_email + " VARCHAR(20),"+
                COLUMN_phno + " VARCHAR(20)"+
                ");";

        db.execSQL(query);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public void addData(Data d){
        ContentValues values = new ContentValues();
        //values.put(COLUMN_ID, d.getId());
        values.put(COLUMN_NAME, d.getName());
        values.put(COLUMN_email, d.getEmail());
        values.put(COLUMN_phno, d.getPhno());

        SQLiteDatabase db = getWritableDatabase();
        db.insert(TABLE_NAME, null, values);
        db.close();
    }

    public ArrayList<String> retrieveData(){

        ArrayList<String> al = new ArrayList<>();

        SQLiteDatabase db = getWritableDatabase();
        String query = "SELECT * FROM "+TABLE_NAME+";";

        Cursor c = db.rawQuery(query,null);

        c.moveToFirst();

        while(!c.isAfterLast()){
            if(c.getString(c.getColumnIndex("id"))!=null){

                al.add(c.getString(c.getColumnIndex("id")));
                al.add(c.getString(c.getColumnIndex("name")));
                al.add(c.getString(c.getColumnIndex("email")));
                al.add(c.getString(c.getColumnIndex("phno")));

            }
            c.moveToNext();
        }
        db.close();
        return al;

    }

}

CustomAdapter.java CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<String>{


    ArrayList<String>a = new ArrayList<>();


    public CustomAdapter(Context context,   ArrayList<String>a ){
        super(context,R.layout.custom_row,a);
    }

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

        LayoutInflater harshitsInflator = LayoutInflater.from(getContext());
        View customView = harshitsInflator.inflate(R.layout.custom_row, parent, false);

        TextView textView3 = (TextView) customView.findViewById(R.id.textView3);
        TextView textView4 = (TextView) customView.findViewById(R.id.textView4);
        TextView textView5 = (TextView) customView.findViewById(R.id.textView5);
        Button button4 = (Button) customView.findViewById(R.id.button4);

        String Sid = getItem(position);

        if(position%4==0 && position>0)
        {
            textView3.setText(a.get(1));
            textView4.setText(a.get(2));
            textView5.setText(a.get(3));
            button4.setText(a.get(0));
            a.clear();
            customView.setVisibility(View.VISIBLE);
        }
        else {
            a.add(Sid);
            customView.setVisibility(View.GONE);
        }
        return customView;
    }
}

listView.java listView.java

public class listView extends Activity {

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_view_layout);

        ArrayList<String> n;


        MyDBHandler db = new MyDBHandler(this, null, null, 1);

        n=db.retrieveData();

        ListAdapter harshitsAdapter = new CustomAdapter(this, n);

        ListView harshitsListView = (ListView) findViewById(R.id.harshitsListView);
        harshitsListView.setAdapter(harshitsAdapter);
        //((BaseAdapter)harshitsAdapter).notifyDataSetChanged();




    }

    public void backToMain(View view){

        Intent i = new Intent(this, MainActivity.class);
        startActivity(i);
        finish();
    }
}

This app also shows ArrayIndexOutOfBounds Exception: 此应用程序还显示ArrayIndexOutOfBounds异常:

Process: com.example.h8pathak.dilliheart, PID: 21258
    java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
            at java.util.ArrayList.get(ArrayList.java:308)

How do I also rectify this one? 我该如何纠正这个?

Ok, store all data in your model class Data and add Data object to ListView. 好的,将所有数据存储在模型类Data中,并将Data对象添加到ListView。 Change your database method to get all data like this 更改数据库方法以获取此类所有数据

public ArrayList<Data> retrieveData(){

        ArrayList<Data> al = new ArrayList<>();

        SQLiteDatabase db = getWritableDatabase();
        String query = "SELECT * FROM "+TABLE_NAME+";";

        Cursor c = db.rawQuery(query,null);

        c.moveToFirst();

        while(!c.isAfterLast()){
            if(c.getString(c.getColumnIndex("id"))!=null){

                Data dt = new Data();
                dt.setId(c.getString(c.getColumnIndex("id")));
                dt.setName(c.getString(c.getColumnIndex("name")));
                dt.setEmail(c.getString(c.getColumnIndex("email")));
                dt.setPhno(c.getString(c.getColumnIndex("phno")));

                al.add(dt);

            }
            c.moveToNext();
        }
        db.close();
        return al;

    }

Retrieve data using getter method. 使用getter方法检索数据。 hope may work for you. 希望可能对你有用。

First of all, I you should create a Value Object to work with. 首先,我应该创建一个值对象来使用。 For example: 例如:

public class UserVO {

    private long id;
    private String name,
                   email, 
                   contactNumber;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getContactNumber() {
        return contactNumber;
    }

    public void setContactNumber(String contactNumber) {
        this.contactNumber = contactNumber;
    }

}

Then you can use it into your classes like the following: 然后您可以将它用于您的类,如下所示:

public class CustomAdapter extends ArrayAdapter<UserVO>{

    private UserVO mUser;
    private Context mContext;
    private LayoutInflater mLayoutInflater;
    private ViewHolder mHolder;

    public CustomAdapter(Context context, UserVO user){

        mContext = context;
        mUser = user;

    }

    static class ViewHolder {

        private TextView textView3,
                         textView4,
                         textView5;

    }

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

        if (view == null) {

            view = layoutInflater.inflate(R.layout.custom_row, parent, false);

            mHolder = new ViewHolder();

            mHolder.textView3 = (TextView) view.findViewById(R.id.textView3);
            mHolder.textView4 = (TextView) view.findViewById(R.id.textView4);
            mHolder.textView5 = (TextView) view.findViewById(R.id.textView5);

            view.setTag(mHolder);

        }
        else {

            mHolder = (ViewHolder) view.getTag();

        }

        mUser = getItem(position);

        mHolder.textView3.setText(mUser.getId());
        mHolder.textView4.setText(mUser.getEmail());
        mHolder.textView5.setText(mUser.getContactNumber());

        return view;
    }

}

In your MyDBHandler you don't need to move cursor to the first position. MyDBHandler您不需要将光标移动到第一个位置。 That might be the exception error you said. 这可能是你说的异常错误。 Besides, you can also return a list of users like: 此外,您还可以返回以下用户列表:

public ArrayList<UserVO> retrieveData(){

    ArrayList<UserVO> userList = new ArrayList<>();

    SQLiteDatabase db = getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_NAME + ";";

    Cursor c = db.rawQuery(query, null);

    while(c.moveToNext()) {

        if(c.getString(c.getColumnIndex("id")) != null) {

            UserVO _user = new UserVO();

            _user.setId(c.getLong(c.getColumnIndex("id")));
            _user.setName(c.getString(c.getColumnIndex("name")));
            _user.setEmail(c.getString(c.getColumnIndex("email")));
            _user.setContactNumber(c.getString(c.getColumnIndex("phno")));

            userList.add(_user);

        } 

    }

    db.close();

    return userList;

}

And finally you can load your ListView : 最后你可以加载你的ListView

public class listView extends Activity {

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_view_layout);

        ArrayList<UserVO> userList;


        MyDBHandler db = new MyDBHandler(this, null, null, 1);

        userList = db.retrieveData();

        ListAdapter harshitsAdapter = new CustomAdapter(this, userList);

        ListView harshitsListView = (ListView) findViewById(R.id.harshitsListView);

        harshitsListView.setAdapter(harshitsAdapter);

    }

    public void backToMain(View view){

        Intent i = new Intent(this, MainActivity.class);
        startActivity(i);
        finish();
    }

}

Those classes are just examples. 这些课程只是一些例子。 And you will have to edit something to make it works, of curse. 你必须编辑一些东西以使其有效,诅咒。 Anyway, feel free to ask whatever you want. 无论如何,随时随地问你想要什么。

Modify these two files of yours: 修改你的这两个文件:

CustomAdapter.java CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<String>{

    ArrayList<String> id, name, email, phno;
    Context c;


    public CustomAdapter(Context context,   ArrayList<String>id, ArrayList<String>name , ArrayList<String>email , ArrayList<String> phno ){
        super(context,R.layout.custom_row, id);

        this.c=context;
        this.id = id;
        this.name=name;
        this.email=email;
        this.phno=phno;

    }

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

        LayoutInflater harshitsInflator = LayoutInflater.from(getContext());
        View customView = harshitsInflator.inflate(R.layout.custom_row, parent, false);

        TextView textView3 = (TextView) customView.findViewById(R.id.textView3);
        TextView textView4 = (TextView) customView.findViewById(R.id.textView4);
        TextView textView5 = (TextView) customView.findViewById(R.id.textView5);
        Button button4 = (Button) customView.findViewById(R.id.button4);


            String Sid = id.get(position);
            String Sname = name.get(position );
            String Semail = email.get(position );
            String Sphno = phno.get(position);

            textView3.setText(Sname);
            textView4.setText(Semail);
            textView5.setText(Sphno);
            button4.setText(Sid);

        return customView;
    }
}

listView.java listView.java

public class listView extends Activity {

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_view_layout);

        ArrayList<String> n;
        ArrayList<String> id  = new ArrayList<>();
        ArrayList<String> name  = new ArrayList<>();
        ArrayList<String> email  = new ArrayList<>();
        ArrayList<String> phno  = new ArrayList<>();

        MyDBHandler db = new MyDBHandler(this, null, null, 1);

        n=db.retrieveData();

        for(int i =0; i<n.size();i++){
            if(i%4==0)
                id.add(n.get(i));
            else if (i%4==1)
                name.add(n.get(i));
            else if (i%4==2)
                email.add(n.get(i));
            else
                phno.add(n.get(i));
        }

        System.out.println(n);


        ListAdapter harshitsAdapter = new CustomAdapter(this, id, name, email, phno);

        ListView harshitsListView = (ListView) findViewById(R.id.harshitsListView);
        harshitsListView.setAdapter(harshitsAdapter);




    }

    public void backToMain(View view){

        Intent i = new Intent(this, MainActivity.class);
        startActivity(i);
        finish();
    }





}

Adapting this method would also not lead you to "ArrayIndexOutOfBounds" Exception 调整此方法也不会导致“ArrayIndexOutOfBounds”异常

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM