将对象传递给CursorAdapter获取null [英] Passing object to CursorAdapter getting null
问题描述
我在主要活动中收到了一个回调,该回调正在从ListView单击中传递值的对象.如果我举杯敬酒,则敬酒会显示键,值对.我想将其添加到TopListCursorAdapter中以填充新行.我在topAdapter.notifyDataSetChanged()上得到了空值.
I am getting a callback in my main activity that is passing an object of values from a ListView click. If I throw a toast the toast is displaying the key, value pairs. I want to take that and add it to the TopListCursorAdapter to populate a new row. I am getting null on the topAdapter.notifyDataSetChanged();
不确定如何将mEmployee添加到适配器,我尝试过
Not sure how to add mEmployee to the adapter, I have tried to
@Override
public void onBottomListClick(Employee e) {
mEmployee.add(e);
dbHandler.addEmployee(e);
SQLiteDatabase db = dbHandler.getWritableDatabase();
final Cursor clickedEmployee = db.rawQuery("SELECT * FROM " + "employees" + " WHERE " +
"Employee_number" + "=" + e.getEmployee_number(), null);
// change the adapter's Cursor
topAdapter.changeCursor(clickedEmployee);
}
但是我不想传递一个游标,并且TopListCursorAdapter想要一个游标.我只想将mEmployee添加到TopListCursorAdapter中的现有列表中.
But I do not want to pass a cursor and the TopListCursorAdapter wants one. I just want to add mEmployee to the existing List in TopListCursorAdapter.
public class MainActivity extends FragmentActivity implements BottomListViewAdapter.BottomListClickListener {
private ProgressBar mProgressBar;
EmployeeDBHandler dbHandler;
private TopListCursorAdapter topAdapter;
private BottomListViewAdapter bottomAdapter;
private ArrayList mEmployee;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
dbHandler = new EmployeeDBHandler(getApplicationContext());
mProgressBar.setVisibility(View.VISIBLE);
getXMLData();
//GUI for seeing android SQLite Database in Chrome Dev Tools
Stetho.InitializerBuilder inBuilder = Stetho.newInitializerBuilder(this);
inBuilder.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this));
Stetho.Initializer in = inBuilder.build();
Stetho.initialize(in);
}
public void getXMLData() {
OkHttpClient client = getUnsafeOkHttpClient();
Request request = new Request.Builder()
.url(getString(R.string.API_FULL_URL))
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String responseData = response.body().string();
final InputStream stream = new ByteArrayInputStream(responseData.getBytes());
final XMLPullParserHandler parserHandler = new XMLPullParserHandler();
final ArrayList<Employee> employees = (ArrayList<Employee>) parserHandler.parse(stream);
for (Employee e : employees) {
dbHandler.addEmployee(e);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setVisibility(View.GONE);
displayTopList();
displayBottomList();
}
});
}
});
}
public void displayTopList() {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.topFragment, new TopFragment());
fragmentTransaction.commit();
}
public void displayBottomList() {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.bottomFragment, new BottomFragment());
fragmentTransaction.commit();
}
@Override
public void onBottomListClick(Employee e) {
mEmployee.add(e);
dbHandler.addEmployee(e);
SQLiteDatabase db = dbHandler.getWritableDatabase();
final Cursor clickedEmployee = db.rawQuery("SELECT * FROM " + "employees" + " WHERE " +
"Employee_number" + "=" + e.getEmployee_number(), null);
// change the adapter's Cursor
topAdapter.changeCursor(clickedEmployee);
}
}
TopListCursorAdapter
TopListCursorAdapter
public class TopListCursorAdapter extends CursorAdapter {
private EmployeeDBHandler dbHandler;
private Activity activityRef;
public TopListCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
activityRef = (Activity) context;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.contact_cardview_layout, parent, false);
}
@Override
public void bindView(View view, final Context context, final Cursor cursor) {
dbHandler = new EmployeeDBHandler(context);
ViewHolder holder;
holder = new ViewHolder();
holder.tvFirstName = (TextView) view.findViewById(R.id.personFirstName);
holder.tvLastName = (TextView) view.findViewById(R.id.personLastName);
holder.tvTitle = (TextView) view.findViewById(R.id.personTitle);
holder.mPeepPic = (ImageView) view.findViewById(R.id.person_photo);
holder.mDetailsButton = (ImageButton) view.findViewById(R.id.fullDetailButton);
holder.mCardView = (CardView) view.findViewById(R.id.home_screen_cardView);
String mFirstName = cursor.getString(cursor.getColumnIndexOrThrow("First_name"));
String mLastName = cursor.getString(cursor.getColumnIndexOrThrow("Last_name"));
String mPayrollTitle = cursor.getString(cursor.getColumnIndexOrThrow("Payroll_title"));
String mThumbnail = cursor.getString(cursor.getColumnIndexOrThrow("ThumbnailData"));
holder.tvFirstName.setText(mFirstName);
holder.tvLastName.setText(mLastName);
holder.tvTitle.setText(mPayrollTitle);
if (mThumbnail != null) {
byte[] imageAsBytes = Base64.decode(mThumbnail.getBytes(), Base64.DEFAULT);
Bitmap parsedImage = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
holder.mPeepPic.setImageBitmap(parsedImage);
} else {
holder.mPeepPic.setImageResource(R.drawable.img_place_holder_adapter);
}
activityRef.runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
final int position = cursor.getPosition();
holder.mDetailsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cursor.moveToPosition(position);
String mEmployeeNumber = cursor.getString(1);
String mEmail = cursor.getString(8);
String mFirstName = cursor.getString(2);
String mLastName = cursor.getString(3);
String mPhoneMobile = cursor.getString(4);
String mPhoneOffice = cursor.getString(5);
String mCostCenter = cursor.getString(10);
String mHasDirectReports = cursor.getString(7);
String mTitle = cursor.getString(6);
String mPic = cursor.getString(9);
Intent mIntent = new Intent(context, EmployeeFullInfo.class);
mIntent.putExtra("Employee_number", mEmployeeNumber);
mIntent.putExtra("Email", mEmail);
mIntent.putExtra("First_name", mFirstName);
mIntent.putExtra("Last_name", mLastName);
mIntent.putExtra("Phone_mobile", mPhoneMobile);
mIntent.putExtra("Phone_office", mPhoneOffice);
mIntent.putExtra("Cost_center_id", mCostCenter);
mIntent.putExtra("Has_direct_reports", mHasDirectReports);
mIntent.putExtra("Payroll_title", mTitle);
mIntent.putExtra("ThumbnailData", mPic);
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
v.getContext().startActivity(mIntent);
}
});
}
public static class ViewHolder {
TextView tvFirstName;
TextView tvLastName;
TextView tvTitle;
ImageView mPeepPic;
ImageButton mDetailsButton;
CardView mCardView;
}
}
推荐答案
我不想传递游标,而TopListCursorAdapter想要一个游标
I do not want to pass a cursor and the TopListCursorAdapter wants one
好的.您有一个DBHandler
,可以给您一个Cursor
.
Sure. You have a DBHandler
which can give you a Cursor
.
dbHandler = new EmployeeDBHandler(getApplicationContext());
,您有一个addEmployee
方法.
dbHandler.addEmployee(e);
所以问题是-在没有Cursor
的情况下您是如何创建TopListCursorAdapter
的,因为它是必需的?
So the question is - how did you create the TopListCursorAdapter
without already having a Cursor
since it is required??
无论如何,您不应该在适配器中粘贴EmployeeDBHandler
.
它只需要一个Cursor
.另外,您似乎从来没有在那里使用过该类.
Anyways, you should not stick a EmployeeDBHandler
in the adapter.
It only wants a Cursor
. Plus, you never seem to use that class in there.
public class TopListCursorAdapter extends CursorAdapter {
// private EmployeeDBHandler dbHandler; // ** Not needed
private Context mContext; // Don't need an Activity
public TopListCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
mContext = context; // Just a Context, no Activity
}
并且您不必在第一次创建new TopListAdapter
之后创建new TopListAdapter
,您可以直接在现有适配器上调用changeCursor
.
And you should never need to create a new TopListAdapter
after the first creation of one, you can call changeCursor
directly on the existing adapter.
@Override
public void onBottomListClick(Employee e) {
mEmployee.add(e);
dbHandler.addEmployee(e);
// topAdapter = new TopListCursorAdapter(); // ** Nope
Cursor newCursor = dbHandler.getEmployees(); // TODO: Implement this
topAdapter.changeCursor(newCursor); // Updates the UI itself
Intent employeeDetail = new Intent(MainActivity.this, EmployeeFullInfo.class);
employeeDetail.putExtra("Employee_number", e.getNumber());
...
startActivity(employeeDetail);
}
注意:如果您使用Parcelable
Employee
对象,在Intent上不需要一堆putExtra
和getExtra
方法.
Note: If you use Parcelable
Employee
objects, you do not need a bunch putExtra
and getExtra
methods on the Intents.
此外,您可以将Employee对象存储为ViewHolder的一部分,以简化数据管理.这样,您只需要将数据从Cursor
提取到Employee
中,然后ViewHolder就可以保持该状态,因为您正在复制onClick
中的工作来获取Cursor
数据.
Additionally, you can store an Employee object as part of the ViewHolder for simpler data management. That way, you only need to extract data from the Cursor
into an Employee
, then the ViewHolder can maintain that since you are duplicating the effort within onClick
to get the Cursor
data.
public static class ViewHolder {
Employee employee; // See here
TextView tvFirstName;
TextView tvLastName;
TextView tvTitle;
ImageView mPeepPic;
ImageButton mDetailsButton;
CardView mCardView;
}
这篇关于将对象传递给CursorAdapter获取null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!