自定义列表视图,SQLite

时间:2018-04-06 17:14:04

标签: android sqlite listview custom-adapter

所以我有两个活动:Main是将对象(Image和两个字符串)添加到Custom List,第二个是显示此列表。

我有两个班:

public class Activity_4 extends AppCompatActivity {

ListView listView;
myAdapter mAdapter = null;
ArrayList<Object> objectList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_4);

    listView = (ListView)findViewById(R.id.listView4);
    objectList = new ArrayList<>();

    mAdapter = new myAdapter(this,R.layout.list_row,objectList);
    listView.setAdapter(mAdapter);

    Cursor cursor = Activity_3.sqLiteHelper.getData("SELECT * FROM OBJECT");
    objectList.clear();
    while (cursor.moveToNext()) {
        int id = cursor.getInt(0);
        String main = cursor.getString(1);
        String desc = cursor.getString(2);
        byte[] image = cursor.getBlob(3);
        objectList.add(new Object(image,main,desc, id));
    }
    mAdapter.notifyDataSetChanged();

}

public class Object {
    byte[] imageID;
    String mainText;
    String description;
    int id;

    public Object(byte[] imageID, String mainText, String description, int id) {
        this.imageID = imageID;
        this.mainText = mainText;
        this.description = description;
        this.id = id;

      //getters and setters

    }
public class myAdapter extends BaseAdapter {

    private Context mContext;
    private List<Object> objectList;
    private int layout;

    public myAdapter(Context context,int layout, ArrayList<Object> objectList) {
        this.mContext = context;
        this.layout = layout;
        this.objectList = objectList;
    }

    @Override
    public int getCount() {
        return objectList.size();
    }

    @Override
    public Object getItem (int position) {
        return objectList.get(position);
    }

    @Override
    public long getItemId (int position) {
        return position;
    }


    private class ViewHolder {
        ImageView imageView;
        TextView main,desc;
    }

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

        View row = view;
        ViewHolder holder = new ViewHolder();

        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(layout,null);

            holder.main = (TextView)row.findViewById(R.id.editText);
            holder.desc = (TextView)row.findViewById(R.id.editText2);
            holder.imageView = (ImageView)row.findViewById(R.id.imageView);
            row.setTag(holder);

        } else {
            holder = (ViewHolder) row.getTag();
        }

        Object object = objectList.get(position);
        holder.main.setText(object.getMainText());
        holder.desc.setText(object.getDescription());

        byte[] image = object.getImageID();
        Bitmap bitmap = BitmapFactory.decodeByteArray(image,0,image.length);
        holder.imageView.setImageBitmap(bitmap);

        return row;
    }

}
}

public class Activity_3 extends AppCompatActivity {

        int imageID = R.drawable.row_img;
        int imageID2 = R.drawable.row_img2;

        EditText ed1, ed2;
        RadioButton rb1, rb2;

        Button add, view, choose;

        ImageView imageView;

        final int REQUEST_CODE_GALLERY = 999;
        public static SQLiteHelper sqLiteHelper;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_3);

    ed1 = (EditText) findViewById(R.id.editText);
    ed2 = (EditText) findViewById(R.id.editText2);

    rb1 = (RadioButton) findViewById(R.id.radioButton);
    rb2 = (RadioButton) findViewById(R.id.radioButton2);

    add = (Button) findViewById(R.id.buttonadd);
    view = (Button) findViewById(R.id.buttonview);

    choose = (Button) findViewById(R.id.buttonchoose);
    imageView = (ImageView) findViewById(R.id.imageView);

    sqLiteHelper = new SQLiteHelper(this,"List.sqlite", null,1);
    sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS OBJECT (Id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, desc VARCHAR, image BLOB) ");

    choose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ActivityCompat.requestPermissions(
                    Activity_3.this,
                    new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_GALLERY
            );
        }
    });


    add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {

                sqLiteHelper.insertData(
                        ed1.getText().toString().trim(),
                        ed2.getText().toString().trim(),
                        imageViewToByte(imageView)
                );

                Toast.makeText(getApplicationContext(), "Added successfully!", Toast.LENGTH_SHORT).show();
                ed1.setText("");
                ed2.setText("");
                imageView.setImageResource(R.mipmap.ic_launcher);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent (Activity_3.this,Activity_4.class);
            startActivity(intent);
        }
    });
}

private byte[] imageViewToByte(ImageView image) {
    Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress (Bitmap.CompressFormat.JPEG, 50,stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    if (requestCode == REQUEST_CODE_GALLERY) {
        if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Intent intent = new Intent (Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, REQUEST_CODE_GALLERY);
        } else {
            Toast.makeText(getApplicationContext(), "You don't have permission to access file location!", Toast.LENGTH_SHORT ).show();
        }
        return;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_CODE_GALLERY && resultCode == RESULT_OK && data != null) {
        Uri uri = data.getData();
        try {
            InputStream inputStream = getContentResolver().openInputStream(uri);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            imageView.setImageBitmap(bitmap);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}
}

他们将对象(图片和两个文字说明)添加到自定义列表视图中并保存/打开已添加的数据。但是当我想要进入列表视图活动时,我遇到了问题,应用程序正在崩溃。这是日志:

Process: com.example.charles.cwiczenie3, PID: 6072
                                                                        Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                                            at com.example.karol.cwiczenie3.Activity_4$myAdapter.getView(Activity_4.java:172)

有谁知道如何解决它? 谢谢:))

1 个答案:

答案 0 :(得分:0)

请检查R.layout.list_row是否包含带有Id = editText的TextView

我认为R.layout.list_row中没有带有id:editText的TextView,因此发生了NullPointerException。