2017-02-13 7 views
-1

私は2つのListViewを持っています。 1つは別のものです。ユーザーがbottomListから行をクリックすると、Webサービスを起動して新しいカーソルを作成し、bottomListを再作成します。同時に、クリックした行をTopListViewに配置したいと思います。私は、インテントをcursorAdapterからMainActivityに渡そうとしましたが、そこにあったのと同じ値でbottomListViewを再投入しました。 Webサービスへの呼び出しもしません。 TopListViewに何も起こりません。CursorAdapterから別のCursorAdapterにonClickを渡す

onClickの位置をbottomCursorAdapterからtopCursorAdapterに渡すことはできますか?または、私はTopAdapterとswapCursorでそれを照会することができますemployee_numberのようないくつかの変数?もしそうなら、誰かがtopListView内のbottomListViewをクリックしたかどうかを知る方法がないので、どのようにカーソルを入れ替えるのか分からない。

私のほんの方法私はトーストに私はonRowClickを追加しようとしています

public void onRowClick(String mEmployeeNumber, String mFirstName) { 
     Toast.makeText(getApplicationContext(), "SEND TO TOP LIST " + mEmployeeNumber + " " + mFirstName, Toast.LENGTH_LONG).show(); 
    } 

マイTopAdapterを表示するには、アダプタからデータを取得するために作成した

public void displayTopList() { 
     SQLiteDatabase db = dbHandler.getWritableDatabase(); 
     mTopCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null); 
     ListView mTopListView = (ListView) findViewById(R.id.mTopList); 
     TopListCursorAdapter topAdapter = new TopListCursorAdapter(this, mTopCursor); 
     mTopListView.setAdapter(topAdapter); 
    } 

方法。

public class TopListCursorAdapter extends CursorAdapter { 
    public TopListCursorAdapter(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 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); 
     } 


     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

をそのインターフェイスを実装することができますが、「コールバック」の概念に精通していますか? –

+0

そうでなければ、あなたは本質的にこれをやろうとしています。マスター詳細フロー。 https://developer.android.com/training/basics/fragments/communicating.html –

+0

これはFragmentsで行う必要がありますか?私のonClickイベントを持つクラスはCursorAdaptersです。私はCursorAdapter内のonAttachメソッドをオーバーライドできません。 –

答えて

2

私が正しく理解していれば、あなたはコードを持っているしたいのクリックイベントが1つのアダプターで発生したときに知って、その後、他のものにいくつかのデータを送信します。

この場合、アダプタ間の「通信」をブリッジするインターフェイスを定義するだけで、両方を含むアクティビティクラスを使用することができます。

たとえば、ここにはインターフェイスが定義されたアダプタがあります。ボタンをクリックするとアクティブになります。

public class TopListCursorAdapter extends CursorAdapter { 

    public interface TopListClickListener { 
     void onTopListClick(int position); // Can add more parameters here 
    } 

    private TopListClickListener callback; 

    public TopListCursorAdapter(Context context, Cursor cursor) { 
     super(context, cursor, 0); 
     if (!(context instanceof TopListClickListener)) { 
      throw new ClassCastException("Context must implement TopListClickListener"); 
     } 
     this.callback = (TopListClickListener) context; 
    } 

    ... 

     holder.mDetailsButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cursor.moveToPosition(position); 
       ... 
       if (callback != null) { 
        callback.onTopListClick(position); // Can pass more parameters here 
       } 

と活動に、あなたは(あなたのコールバック別名)

public class MainActivity extends AppCompatActivity 
    implements TopListCursorAdapter.TopListClickListener // see here 

    // private ... topAdapter, bottomAdapter; 

    @Override 
    public void onTopListClick(int position) { 
     // Make sure parameters match the interface ^^^ 


     // TODO: Get data from topAdapter 
     // TODO: database update or arraylist.add to change bottomAdapter 
     bottomAdapter.notifyDataSetChanged(); // Update the UI 
    } 

    // Other code can remain the same 
+0

フラグメントであった場合と同じ方法で他のアダプタにデータを送信できますか? MainActivityのメソッドでAdapterとFragmentを呼び出さないでください。そのクリックに関するすべての行情報を渡して、別のアダプタに送信して、そこのリストに追加してください。 –

+0

他のフラグメントはアクティビティに添付する必要がありますが、なぜ動作しないのかわかりません。 –

+0

「すべての行情報を渡す」について。単一の 'Employee'オブジェクトを作成することができます。そして、あなたはそれを 'Parcelable'を実装することもできます。しかし、メソッドごとに個々のフィールドを渡すべきではありません。 –