2017-02-16 31 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,并与正在传递到更新方法新的光标合并。我迷失在如何将两个游标合并在一起,然后采用新的游标并将其与任何传递给update方法的游标合并。

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

我做了一个非常基本的项目只是为了达到你的要求,请找回购下面的链接:

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(新的对象[] {我,“产品说明” + 1});这是什么将listView2点击添加到listView1?大部分情况下,我看到发生了什么,但没有100%清楚地说明如何在我的应用程序中执行此操作。我不能重写这个应用程序,因为这将包括重做网络调用,数据库,XML解析。只是没有时间。 –

+0

或者是onClickListener事件可能在自定义CursorAdapter中执行?我有一个CursorAdapter的bottomList,它将光标传递给MainActivity,然后将它传递给我在做MergeCursor的TopFragment。 –

+0

给你短暂的每一行代码,请通过它去.. – Deepesh