2017-02-16 10 views
0

맨 아래 목록에서 클릭 한 행에서 커서를 가져 와서 커서를 맨 위에 병합합니다. 첫 번째로 클릭 한 행에 대해 올바르게 작동합니다. 그러나 다른 행을 클릭하면 다른 행을 대체하여 계속 추가하지 않습니다. MergeCursor를 반복 할 수 있는지 또는 커서를 대체하지 않고 계속 추가하는 방법이 확실하지 않습니다.커서 병합 유지

public class TopFragment extends Fragment { 
    public Cursor mTopCursor; 
    EmployeeDBHandler dbHandler; 
    ListView mTopListView; 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_top_list, container, false); 
     String table = "employees"; 
     int mStartingEmployeeID = mStartingNumber; 
     dbHandler = new EmployeeDBHandler(getContext()); 
     SQLiteDatabase db = dbHandler.getWritableDatabase(); 
     mTopCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null); 
     mTopListView = (ListView) view.findViewById(R.id.mTopList); 
     TopListCursorAdapter topAdapter = new TopListCursorAdapter(getContext(), mTopCursor); 
     mTopListView.setAdapter(topAdapter); 
     return view; 
    } 


    public void update(Cursor cursor) { 
     while (cursor.moveToNext()) { 
      MergeCursor mergeCursor = new MergeCursor(new Cursor[]{cursor, mTopCursor}); 
      TopListCursorAdapter topAdapter = new TopListCursorAdapter(getContext(), mergeCursor); 
      mTopListView.setAdapter(topAdapter); 
     } 
    } 
} 

나는 항상 병합 그래서 그냥 mTopCursor을 복용하고 업데이트 방법으로 전달되는 새로운 커서로 병합되어있는 mTopCursor을 추가하고 이해합니다. 두 커서를 병합하는 방법에 대해 분실 했으므로 새 커서를 가져 와서 커서를 업데이트 메소드에 전달하여 병합합니다.

public class TopListCursorAdapter extends CursorAdapter { 

    public interface TopListClickListener { 
     void onTopListClick(Cursor cursor); 
    } 

    private TopListClickListener mCallback; 

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

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     return LayoutInflater.from(context).inflate(R.layout.contact_cardview_top, 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.mTopCardView = (CardView) view.findViewById(R.id.mTopHomeScreenCV); 

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

     holder.mTopCardView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(mCallback != null) { 
        mCallback.onTopListClick(cursor); 
       } 
      } 
     }); 
    } 

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


public class MainActivity extends AppCompatActivity implements BottomListCursorAdapter.BottomListClickListener, 
     TopListCursorAdapter.TopListClickListener { 
    private ProgressBar mProgressBar; 
    EmployeeDBHandler dbHandler; 
    private TopListCursorAdapter topAdapter; 
    private BottomListCursorAdapter bottomAdapter; 
    private ArrayList<Employee> 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) { 
     dbHandler.addEmployee(e); 
     Log.i("EMPLOYEE", e.toString()); 
     TopFragment topFragment = (TopFragment) getSupportFragmentManager().findFragmentById(R.id.topFragment); 
     SQLiteDatabase db = dbHandler.getWritableDatabase(); 
     final Cursor clickedEmployee = db.rawQuery("SELECT * FROM " + "employees" + " WHERE " + 
       "Employee_number" + "=" + e.getEmployee_number(), null); 
     // change the adapter's Cursor 
     topFragment.update(clickedEmployee); 
    } 

    @Override 
    public void onTopListClick(Cursor cursor) { 
     do{ 
      BottomFragment bottomFragment = (BottomFragment) getSupportFragmentManager().findFragmentById(R.id.bottomFragment); 
      bottomFragment.refreshList(cursor); 
     } while (cursor.moveToNext()); 
    } 
} 
+0

, 달성하고자하는 것이 무엇인지 알려 주실 수 있습니까? – Deepesh

+0

나는 ListView를 클릭하면이 커서를 상위 ListView에 보내 ListView에 해당 행을 표시합니다. 사용자가 맨 아래의 ListView를 클릭하면 맨 위의 ListView는 이러한 행 클릭을 계속 추가해야합니다. –

+0

@Deepesh는 이것이 앱이 필요로하는 기능이기 때문에 이것을 수행 할 다른 방법이 있는지 확실하지 않습니다. 한 목록 뷰에서 다른 커서 뷰로 커서를 전달하는 방법 만 알고 있으므로 목록 뷰를 계속 작성하려면 커서를 상위 조각에 계속 추가해야한다고 가정합니다. 나는 내 문제가 무엇인지 알지, 그것을 바로 잡는 방법을 모르겠습니다. 그것은 mTopCursor입니다. 나는 항상 하단 목록 행을 클릭 할 때 병합 된 최신 커서가 아니라 그 것을 사용하고 있습니다. –

답변

0

난 그냥 당신의 필요 조건, 아래의 repo의 링크를 찾아주십시오을 달성하기 아주 기본적인 프로젝트를 만들었습니다 :

당신의 문제에 대한 더 나은 솔루션이있을 수 있습니다 보인다 https://github.com/deeps09/AdamGardner

public class TopFragment extends Fragment { 
    public Cursor mTopCursor; 
    EmployeeDBHandler dbHandler; 
    ListView mTopListView; 
    public static MatrixCursor customCursor1; 
    private int mStartingEmployeeID = mStartingNumber; 
    int flag = 0; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_top_list, container, false); 
     String table = "employees"; 

     customCursor1 = new MatrixCursor(new String[]{"_id", "Employee_number", "First_name", 
       "Last_name", "Payroll_title", "ThumbnailData"}); 
     dbHandler = new EmployeeDBHandler(getContext()); 
     SQLiteDatabase db = dbHandler.getWritableDatabase(); 
     mTopCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null); 
     mTopListView = (ListView) view.findViewById(R.id.mTopList); 
     TopListCursorAdapter topAdapter = new TopListCursorAdapter(getContext(), mTopCursor); 
     mTopListView.setAdapter(topAdapter); 
     return view; 
    } 

    public void update(Cursor cursor) { 
     if (cursor.moveToNext() && cursor.getCount() >= 1) { 
      do { 
       customCursor1.addRow(new Object[]{cursor.getInt(0), cursor.getString(1), cursor.getString(2), 
         cursor.getString(3), cursor.getString(6), cursor.getString(9)}); 
       if (flag == 0) { 
        customCursor1.addRow(new Object[]{mTopCursor.getInt(0), mTopCursor.getString(1), mTopCursor.getString(2), 
          mTopCursor.getString(3), mTopCursor.getString(6), mTopCursor.getString(9)}); 
        flag++; 
       } 
       TopListCursorAdapter topAdapter = new TopListCursorAdapter(getContext(), customCursor1); 
       mTopListView.setAdapter(topAdapter); 
      } while (cursor.moveToNext()); 
     } 
    } 
} 
+0

customCursor2.addRow (새 Object [], "Item Desc"+ l}); 이게 listView2 클릭을 listView1에 추가하는 것입니까? 대부분의 경우, 내 앱에서이를 수행하는 방법에 대해 100 % 명확하지 않은 일이 발생했음을 알 수 있습니다. 네트워크 호출, 데이터베이스, xml 파싱 다시 시도가 포함되어 있으므로이 응용 프로그램을 다시 작성할 수 없습니다. 그럴 시간이 없어. –

+0

또는 해당 onClickListener 이벤트를 사용자 지정 CursorAdapter에서 수행 할 수 있습니까? 그 다음 MergeCursor를하고있는 TopFragment에 전달하는 MainActivity에 커서를 전달하는 bottomList 용 CursorAdapter가 있습니다. –

+0

모든 코드 줄을 간략히 살펴보면 .. .. – Deepesh