2

私は本当に立ち往生し、何をすべきか分かりません。私はstartActivityForResultとコンテンツプロバイダーを調べましたが、私はこのアプリのためにそれらのいずれかを実装する手がかりがありません。CursorAdapterの新しいデータで同じリストビューを更新します

私はデータベースからデータを取得する方法を見ておらず、同じlistviewを使用してdisplayBottomListを更新するので、ユーザーを新しいレイアウト/アクティビティにリダイレクトする必要はありません。私が新しいクエリを呼び出して別のカーソルに設定し、それらの間を切り替えることができるかどうかはわかりません。私はswapCursorを見たことがありますが、同じアダプタを使用するとどのように動作するのですか?

私はListViewを持っています。ユーザーがリスト内の行をクリックしたときに、Webサービス呼び出しから新しいデータを更新したいのですが。私はCursorAdapterを使用しています。私は正しく行のonClickのデータを取得することができます。

ここで私は立ち往生していますが、listViewを更新して、データベース/応答の新しい情報を別のアクティビティに送信せずに再投入する方法を教えてください。私は、ユーザーが同じ画面上にとどまるが、新しいデータでlistViewを更新するだけでよい。

ないonClickアダプタであるが、ListViewMainActivityで作成されているときに、新しいListViewを更新し、移入するアダプタを通知するためのアダプタを取得する方法を確認してください。

アダプターBottomListViewは、行をクリックしたときに更新したいものです。

public class BottomListViewAdapter extends CursorAdapter { 

    private String mEmployeeNumber; 
    private EmployeeDBHandler dbHandler; 

    public BottomListViewAdapter(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) { 
     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 mTitle = cursor.getString(cursor.getColumnIndexOrThrow("Payroll_title")); 
     String mThumbnail = cursor.getString(cursor.getColumnIndexOrThrow("ThumbnailData")); 

     holder.tvFirstName.setText(mFirstName); 
     holder.tvLastName.setText(mLastName); 
     holder.tvTitle.setText(mTitle); 

     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 view) { 
       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); 
       view.getContext().startActivity(mIntent); 
      } 
     }); 

     holder.mCardView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cursor.moveToPosition(position); 
       mEmployeeNumber = cursor.getString(1); 
       Toast.makeText(context, mEmployeeNumber, Toast.LENGTH_SHORT).show(); 
       callNewDirectReport(); 
       notifyDataSetChanged(); 

      } 
     }); 
    } 

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

    private void callNewDirectReport() { 
     String mDirectReportUrl = "mURL"; 

     HttpUrl.Builder urlBuilder = HttpUrl.parse(mDirectReportUrl).newBuilder(); 
     urlBuilder.addQueryParameter("manager_employee_number", mEmployeeNumber); 
     String url = urlBuilder.build().toString(); 


     OkHttpClient client = getUnsafeOkHttpClient(); 
     Request request = new Request.Builder() 
       .url(url) 
       .build(); 

     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       e.printStackTrace(); 
      } 

      @Override 
      public void onResponse(Call call, 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); 
        } 
      } 
     }); 
    } 

    @Override 
    public void notifyDataSetChanged() { 
     super.notifyDataSetChanged(); 
    } 
} 

あなたは活動からのコールバックを受け取るためにstartActivityForResultを使用することができます

public class MainActivity extends AppCompatActivity { 

    private ProgressBar mProgressBar; 
    private BottomListViewAdapter mBottomAdapter; 
    private View mDividerView; 
    EmployeeDBHandler dbHandler; 
    private int mStartingEmployeeID = mStartingID; 
    private String table = "employees"; 
    private static final int LOADER_INTEGER = 1; 
    private Cursor mBottomCursor, mTopCursor; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mProgressBar = (ProgressBar) findViewById(R.id.progressBar); 
     mDividerView = findViewById(R.id.divider); 
     dbHandler = new EmployeeDBHandler(getApplicationContext()); 
     mProgressBar.setVisibility(View.VISIBLE); 
     mDividerView.setVisibility(View.GONE); 
     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); 
         mDividerView.setVisibility(View.VISIBLE); 
         displayTopList(); 
         displayBottomList(); 
        } 
       }); 
      } 
     }); 
    } 

    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 void displayBottomList() { 
     SQLiteDatabase db = dbHandler.getWritableDatabase(); 
     mBottomCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + 
       "Employee_number" + "!=" + mStartingEmployeeID + " AND " + 
       "Manager_employee_number" + "=" + mStartingEmployeeID + " ORDER BY " + 
       "Last_name" + " ASC", null); 

     ListView mBottomListView = (ListView) findViewById(R.id.mDirectReportList); 
     mBottomAdapter = new BottomListViewAdapter(this, mBottomCursor); 
     mBottomListView.setAdapter(mBottomAdapter); 
     mBottomAdapter.notifyDataSetChanged(); 

    } 
} 
+0

あなたのリストビューを新しい情報で再作成する最良の方法の1つ! – Shobhit

+0

これが起こっていることを示すリンクがありますか?私のネットワーク通話を切り替えるだけで、これがどのように行われているか把握しようとしています。 –

+0

http://www.androidhive.info/2014/05/android-working-with-volley-library-1/ – Shobhit

答えて

1

私のコメントで述べたように、callNewDirectReport()のあなたのコードは、apiリクエストを作成し、その結果をデータベースに格納します。これにより、アダプタを更新して新しいアイテムを表示するのではなく、データベースを再クエリーして新しいCursorを取得する必要があります。以下は、あなたがそれを行う方法の例です:

public class BottomListViewAdapter extends CursorAdapter { 

private String mEmployeeNumber; 
private EmployeeDBHandler dbHandler; 
private Activity activityRef; 

public BottomListViewAdapter(Context context, Cursor cursor) { 
    super(context, cursor, 0); 
    // keep a reference to the activity 
    activityRef = (Activity) context; 
} 

//... 

private void callNewDirectReport() { 
    //... 
    client.newCall(request).enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 
      e.printStackTrace(); 
     } 

     @Override 
     public void onResponse(Call call, 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); 
       } 
       // the new items are in the database so requery the database to get a new fresher Cursor: 
       SQLiteDatabase db = dbHandler.getWritableDatabase(); 
       Cursor fresherCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + 
        "Employee_number" + "!=" + mStartingEmployeeID + " AND " + 
        "Manager_employee_number" + "=" + mStartingEmployeeID + " ORDER BY " + 
        "Last_name" + " ASC", null); 
       //change the adapter's Cursor 
       activityRef.runOnUiThread(new Runnable() { 
        public void run() { 
         swapCursor(freshedCursor);    
        } 
       });      
     } 
    }); 
} 
} 
+0

ありがとうございます、私はあなたの答えを受け入れています。私が賞金を授与できるようになるとすぐに、私はそうするでしょう。 –

1

アダプタを呼び出している私のMainActivityは、ここにあなたがそれを使用する方法を説明するチュートリアルがありますhttps://developer.android.com/training/basics/intents/result.html

onActivityResultでコールバックを受け取ると、データを更新してnotifyDatasetChangedを呼び出すことができます。

アクティビティがアンドロイドによって処理されるため、アクティビティのコードを別のアクティビティから呼び出すことはできません。 Androidはあなたが呼び出そうとしているアクティビティを殺してしまい、必要なときにそれを再作成します。

+0

したがって、mCardView.setOnClickListenerを新しいアクティビティに送信し、リストビューを作成してMainActivityに渡す必要がありますか? –

+0

いいえ、startActivityを呼び出す以外に、startActivityForResult渡しとIDを呼び出します。 startActivityForResultを呼び出したアクティビティは、onActivityResultに戻り値を受け取ります。レスポンスで添付したリンクを読んでください。 – jonathanrz

+0

MainActivityのlistViewを更新するために、CursorAdapterのOnClickListenerでstartActivityForResultを渡す方法が混乱しています。 mCardView.setOnClickListenerでレスポンスを取得し、startActivityforResultで新しいアクティビティに移動してから、そのアクティビティでもう一度mainAcitivtyに渡して、onclickの新しいデータでリストビューを更新する必要があるようですか? –

関連する問題