将对象传递给CursorAdapter获取null [英] Passing object to CursorAdapter getting null

查看:68
本文介绍了将对象传递给CursorAdapter获取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上不需要一堆putExtragetExtra方法.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆