2017-02-14 1 views
0

Я получаю обратный вызов в своем основном действии, который передает объект значений из клика ListView. Если я бросаю тост, тост отображает пары ключей, значений. Я хочу взять это и добавить его в TopListCursorAdapter, чтобы заполнить новую строку. Я получаю null на topAdapter.notifyDataSetChanged();Передача объекта в CursorAdapter получение null

Не знаете, как добавить 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 хочет один. Я просто хочу добавить mEmployee в существующий список в 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

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 хочет один

Конечно. У вас есть DBHandler, который может дать вам Cursor.

dbHandler = new EmployeeDBHandler(getApplicationContext()); 

И у вас есть метод addEmployee.

dbHandler.addEmployee(e); 

Таким образом, вопрос - как же вы создаете TopListCursorAdapter без уже имея Cursor, так как это требуется ??


В любом случае, вы не должны придерживаться в адаптере 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 
    } 

И вы никогда не должны создавать 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 объектов, вам не нужна куча putExtra и getExtra методы намерений.


Кроме того, вы можете сохранить объект Employee как часть ViewHolder для более простого управления данными. Таким образом, вам нужно только извлечь данные из Cursor в Employee, тогда ViewHolder может поддерживать это, поскольку вы дублируете усилие в пределах onClick, чтобы получить данные Cursor.

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

У меня есть курсор, который передается адаптеру из фрагмента, в котором rawQuery получает строку для добавления в TopListView. Это добавление сотрудника в существующую базу данных. Сотрудник уже существует в БД. –

+0

Я просто пытался указать, что 'new TopListCursorAdapter();' не то, что вы хотите.Вместо этого вы должны называть 'changeCursor', и, тем не менее, вы получаете, что Cursor необходимо запросить из базы данных. –

+0

Попытка выяснить, как getEmployees, поскольку у меня есть getEmployee, чтобы принять номер employee и получить getAllEmployees, который принимает ArrayList. Я могу просто передать getEmployee employeeNumber из Employee e, чтобы добавить только строку в toplist? –

Смежные вопросы