2017-02-06 17 views
1

ユーザーがcardViewをクリックすると、その位置に関連付けられたemployeeNumberからWebサービスを呼び出しているというリストビューがあります。私はOkHttp3sエンキューから新しいWebサービスコールonResponseのデータを取得します。レスポンスから新しいデータを入力するためにlistViewを更新するにはどうすればよいですか?CursorAdapterからUIを更新するonClick

本当に私はリストビューが知っているので、クリックするとアダプタが使用されています。レスポンスが完了した後に、アダプタを生成するためにlistViewを呼び出す方法がわからない。

私のMainActivityは、最初のListViewが作成され、アダプタが接続されています。

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

たぶん、あなたはLoadersを使用しようとすることができ、ボタンの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

dbが更新される前にアダプタが更新されている可能性はありますか? – jak10h

+0

私はそうしていません。私はそれがどのようにしてonClickメソッドがUIを新しいレスポンスで更新するのに役立つか分からないかもしれません。 –

+0

私は理解しようとしています:基本的には、基礎となるデータベースの変更に合わせてUIを更新したいのですが?あなたはローダーを考えましたか? –

答えて

0

を持っているCursorAdapter。

これらは、データソース(コンテンツプロバイダなど)をアクティビティまたはフラグメントとバインドします。ローダーがアクティブな間は、データのソースを監視し、コンテンツが変更されたときに新しい結果を提供する必要があります。

ここでは、それらの実装方法(特にCursorLoader)について説明します。私は明確であることを願っています:

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

あなたはこのことについて、インターネット上で多くのことを読むことができ、良いスタートが例hereためです。

希望すると便利です。

+0

少しCONTENT_URIとプロジェクトが何を想定しているのかちょっと混乱しました。また、新しいデータがWebサービスから受信されたときに、これをボタンのクリックにどのように結びつけますか。 –

+0

SQLiteデータベースとやりとりするコンテンツプロバイダがありますか? –

+0

私は、私は1つ必要があることがわかります。私はあなたが提供したリンクに行きましたが、現在、ローダーのセットアップに役立つ手引きがあります。私はこれについて作業し、うまくいけば、私は別の質問を作成する場合は、何の助けも必要ない。ありがとうございました。 –

関連する問題