使用CursorAdapter

时间:2017-02-10 15:48:46

标签: android listview android-cursoradapter startactivityforresult

我真的被困住了,不知道该怎么做。我查看了startActivityForResult和内容提供商,我不知道如何为这个应用程序实现任何一个。

我没有看到如何从数据库获取数据并使用相同的displayBottomList更新listview,因此我不必将用户重定向到新的布局/活动。不确定我是否可以调用新查询并将其设置为不同的游标并在它们之间切换。我见过swapCursor但是在使用同一个适配器时它是如何工作的?

当用户点击列表中的行时,我想要使用来自Web服务调用的新数据刷新ListView。我使用的是CursorAdapter。我可以正确地获取行的onClick数据。

我遇到困难时,如何更新listView以重新填充数据库/响应中的新信息,而不会将我发送到另一个活动。我希望用户保持在同一屏幕上,但只需使用新数据更新listView

ListView在适配器中时,不知道如何让适配器通知适配器更新并填充新的onClick,但ListView正在{ {1}}。

MainActivity的适配器,是我想在点击一行时更新的适配器。

BottomListView

调用适配器的我的MainActivity

public class BottomListViewAdapter extends CursorAdapter {

    private String mEmployeeNumber;
    private EmployeeDBHandler dbHandler;

    public BottomListViewAdapter(Context context, Cursor cursor) {
        super(context, cursor, 0);
    }

    @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 mTitle = cursor.getString(cursor.getColumnIndexOrThrow("Payroll_title"));
        String mThumbnail = cursor.getString(cursor.getColumnIndexOrThrow("ThumbnailData"));

        holder.tvFirstName.setText(mFirstName);
        holder.tvLastName.setText(mLastName);
        holder.tvTitle.setText(mTitle);

        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);
        }

        final int position = cursor.getPosition();

        holder.mDetailsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                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);
                view.getContext().startActivity(mIntent);
            }
        });

        holder.mCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cursor.moveToPosition(position);
                mEmployeeNumber = cursor.getString(1);
                Toast.makeText(context, mEmployeeNumber, Toast.LENGTH_SHORT).show();
                callNewDirectReport();
                notifyDataSetChanged();

            }
        });
    }

    public static class ViewHolder {
        TextView tvFirstName;
        TextView tvLastName;
        TextView tvTitle;
        ImageView mPeepPic;
        ImageButton mDetailsButton;
        CardView mCardView;
    }

    private void callNewDirectReport() {
        String mDirectReportUrl = "mURL";

        HttpUrl.Builder urlBuilder = HttpUrl.parse(mDirectReportUrl).newBuilder();
        urlBuilder.addQueryParameter("manager_employee_number", mEmployeeNumber);
        String url = urlBuilder.build().toString();


        OkHttpClient client = getUnsafeOkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, 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);
                    }
            }
        });
    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用startActivityForResult从活动接收回调,在这里您有一个教程解释如何使用它:https://developer.android.com/training/basics/intents/result.html

当您在onActivityResult中收到回调时,您可以更新您的数据并调用notifyDatasetChanged。

你不能从另一个活动中调用代码,因为活动是由android处理的。 Android可能已经杀死了您要调用的活动,并且会在必要时重新创建它。

答案 1 :(得分:1)

正如我在评论中所说,现在callNewDirectReport()中的代码发出api请求并将结果存储在数据库中。这不会更新适配器以显示新项目,而是需要重新查询数据库并获取更新的Cursor。以下是有关如何执行此操作的示例:

public class BottomListViewAdapter extends CursorAdapter {

private String mEmployeeNumber;
private EmployeeDBHandler dbHandler;
private Activity activityRef;   

public BottomListViewAdapter(Context context, Cursor cursor) {
    super(context, cursor, 0);
    // keep a reference to the activity
    activityRef = (Activity) context;
}

//...

private void callNewDirectReport() {
    //...
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, 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);
                }
                // the new items are in the database so requery the database to get a new fresher Cursor:
                SQLiteDatabase db = dbHandler.getWritableDatabase();
                Cursor fresherCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " +
                    "Employee_number" + "!=" + mStartingEmployeeID + " AND " +
                    "Manager_employee_number" + "=" + mStartingEmployeeID + " ORDER BY " +
                    "Last_name" + " ASC", null);
                //change the adapter's Cursor
                activityRef.runOnUiThread(new Runnable() {
                    public void run() {
                        swapCursor(freshedCursor);            
                    }
                });                    
        }
    });
}
}