2017-02-06 5 views
1

Ich habe eine listView, dass, wenn ein Benutzer auf die cardView klickt ich einen Web-Service von einem Mitarbeiter anrufen an dieser Position gebunden. Ich bekomme die Daten des neuen Web-Service-Aufrufs onResponse von OkHttp3s enqueue. Wie aktualisiere ich das ListView, um die neuen Daten aus der Antwort zu füllen?Update UI von CursorAdapter onClick

Wirklich verloren, da ich weiß, dass das ListView den Adapter verwendet, der auf dem Klicken gemacht wird. So nicht sicher, wie die ListView aufgerufen wird, um den Adapter aufzufüllen, nachdem die Antwort abgeschlossen ist.

Meine MainActivity, wo das erste ListView aufgefüllt ist und der Adapter angeschlossen ist.

public class MainActivity extends AppCompatActivity { 

    private ProgressBar mProgressBar; 
    EmployeeDBHandler dbHandler; 
    private int mStartingEmployeeID = myStartingID; 
    private String table = "employees"; 
    private static final String DATABASE_NAME = "OneTeam"; 

    @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); 
     SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

     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() { 
     SQLiteDatabase db = dbHandler.getWritableDatabase(); 
     Cursor mTopListCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null); 
     ListView mTopListView = (ListView) findViewById(R.id.mTopList); 
     TopListCursorAdapter topAdapter = new TopListCursorAdapter(this, mTopListCursor); 
     mTopListView.setAdapter(topAdapter); 
    } 

    public void displayBottomList() { 
     SQLiteDatabase db = dbHandler.getWritableDatabase(); 
     Cursor mBottomListCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "!=" + mStartingEmployeeID, null); 

     ListView mBottomListView = (ListView) findViewById(R.id.mDirectReportList); 
     BottomListViewAdapter bottomAdapter = new BottomListViewAdapter(this, mBottomListCursor); 
     mBottomListView.setAdapter(bottomAdapter); 
    } 

    @Override 
    public void onBackPressed() { 
     moveTaskToBack(false); 
    } 
} 

Der Adapter Cursor, die die Schaltfläche OnClick

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) { 
     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(); 
       dbHandler = new EmployeeDBHandler(context); 
       callNewDirectReport(); 

      } 
     }); 
    } 

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

    private void callNewDirectReport() { 
     String mDirectReportUrl = "https://b2aproxy.supervalu.com/OneTeam/OneTeamService.asmx/GetDirectReportsWithPicture"; 

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


      } 
     }); 
    } 
} 
+0

Gibt es eine Möglichkeit, dass die Adapter aktualisiert werden, bevor die Datenbank aktualisiert wird? – jak10h

+0

Ich mache das nicht. Ich könnte mir aber nicht sicher sein, wie das der onClick-Methode hilft, die UI mit der neuen Antwort zu aktualisieren. –

+0

Ich versuche zu verstehen: im Grunde möchten Sie UI entsprechend Änderungen in Ihrer zugrunde liegenden Datenbank entsprechend aktualisieren? Haben Sie Lader in Betracht gezogen? –

Antwort

0

Vielleicht können Sie versuchen Loaders zu verwenden hat.

Sie können Sie die Datenquelle (Content Provider oder andere) mit der Aktivität oder Fragment binden. Solange Loader aktiv sind, sollten sie die Quelle ihrer Daten überwachen und neue Ergebnisse liefern, wenn sich die Inhalte ändern.

Ich gebe Ihnen einen allgemeinen Ansatz, wie Sie sie implementieren (insbesondere CursorLoader). Ich hoffe, klar zu sein:

public class MainActivity extends AppCompatActivity implements 
    LoaderManager.LoaderCallbacks<Cursor> { 

    private static final int LOADER_INTEGER = 1; 

    // ... existing code 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     getLoaderManager().initLoader(LOADER_INTEGER, null, this); 
     super.onActivityCreated(savedInstanceState); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     return new CursorLoader(
      this, 
      ContentProvider.CONTENT_URI, 
      projection, 
      null, 
      null, 
      sortOrder 
     ); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     mCursorAdapter.swapCursor(cursor); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     mCursorAdapter.swapCursor(null); 
    } 
} 

Sie viel im Internet über diesen lesen kann, ist ein guter Anfang zum Beispiel here.

Hoffe, das hilft!

+0

wenig verwirrt auf, was die CONTENT_URI und Projekt sein sollen. Wie bindet sich das in die Schaltfläche ein, wenn die neuen Daten vom Webdienst empfangen werden? –

+0

Haben Sie einen Inhaltsanbieter, über den Sie mit Ihrer SQLite-Datenbank interagieren? –

+0

Ich nicht, ich sehe, ich brauche eins. Ich ging zu dem Link, den Sie zur Verfügung gestellt haben, aber jetzt sehen Sie, es gibt eine Anleitung, die Ihnen beim Einrichten des Loaders hilft. Ich werde daran arbeiten und hoffentlich keine Hilfe brauchen, wenn ich eine andere Frage erstelle. Vielen Dank. –