2017-02-14 3 views
0

ListViewのクリックから値のオブジェクトを渡す主なアクティビティでコールバックが発生します。トーストを投げるとトーストはキー、バリューのペアを表示しています。私はそれを取って、それをTopListCursorAdapterに追加して新しい行を設定したいと思います。私はtopAdapter.notifyDataSetChanged()でnullを取得しています。nullを取得するCursorAdapterにオブジェクトを渡す

アダプタにmEmployeeを追加する方法をわからないが、私は

@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は1を望んでいます。 TopListCursorAdapterの既存のListにmEmployeeを追加したいだけです。

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

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

答えて

0

私は、カーソルを渡したくないとTopListCursorAdapterは1

確かに望んでいます。あなたはCursorを与えるDBHandlerを持っています。

dbHandler = new EmployeeDBHandler(getApplicationContext()); 

あなたはaddEmployeeメソッドを持っています。

dbHandler.addEmployee(e); 

そこで質問です - どのようにそれが必要とされているので、すでにCursorを持たずにTopListCursorAdapterを作成しましたの?


とにかく、EmployeeDBHandlerをアダプターに貼ってはいけません。
Cursorがほしいだけです。加えて、そこではそのクラスを使用していないようです。

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 
    } 

そして、あなたは1の最初の作成後にnew TopListAdapterを作成する必要はありません、あなたは、既存のアダプタに直接changeCursorを呼び出すことができます。

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

注:use ParcelableEmployeeオブジェクトの場合は、束にインテントにputExtragetExtra方法を必要としません。


さらに、より簡単なデータ管理のために、EmployeeオブジェクトをViewHolderの一部として格納することができます。そうすれば、CursorからEmployeeにデータを抽出するだけで、onClickのデータをコピーしてCursorのデータを取得するので、ViewHolderはそれを維持できます。

public static class ViewHolder { 
    Employee employee; // See here 
    TextView tvFirstName; 
    TextView tvLastName; 
    TextView tvTitle; 
    ImageView mPeepPic; 
    ImageButton mDetailsButton; 
    CardView mCardView; 
} 
+0

カーソルが、TopListViewに追加する行を取得するrawQueryを持つフラグメントからアダプタに渡されています。これは従業員を既存のデータベースに追加することです。従業員はすでにDBに存在しています。 –

+0

私はちょうど '新しいTopListCursorAdapter();'があなたが望むものではないことを指摘しようとしていました。代わりに 'changeCursor'を呼び出す必要がありますが、そのCursorをデータベースから照会する必要があります。 –

+0

getEmployeeがemployeeNumberを受け入れ、getListenerを持つgetAllEmployeesを持つようにgetEmployeesを取得する方法を試してみましょう。私はちょうどtoplistに行を追加するにはEmployee eからgetEmployee employeeNumberを渡すことができますか? –

関連する問題