2016-05-16 2 views
0

一般的なAndroidアプリケーションの機能は、各アイテムをスワイプして次のアイテムまたは前のアイテムに移動することです。AndroidはSQLiteカーソルを使用して次のアイテムまたは前のアイテムを表示します

if (cursor.moveToFirst()) { 
    listThings.setAdapter(new ResourceCursorAdapter(this, R.layout.my_simple_expandable_list_item_2, cursor) { 
     @Override 
     public void bindView(View view, Context context, Cursor cursor) { 
      TextView tvFirst = (TextView)view.findViewById(android.R.id.text1); 
      TextView tvSecond = (TextView)view.findViewById(android.R.id.text2); 

      tvFirst.setText(cursor.getString(1) + " - " + getPctString(cursor.getString(2))); 
      tvSecond.setText(cursor.getString(3)); 
     } 
    }); 
} else { 
.... 

正常に動作します:

データベースカーソルはListActivityののonCreateに表示される項目のリストが含まれています。ビルトインレイアウトリソースR.layout.my_simple_expandable_list_item_2は、カーソルに各項目を単一のテキストビューで表示するようにアダプタに指示します。クリックで、私は、後続の活動の項目の詳細を表示することができるよ:

AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> listView, View v, int position, long id) { 
    Intent intent = new Intent(ThingListActivity.this, ThingActivity.class); 
    intent.putExtra(FollowOnActivity.EXTRA_ID, (int) id); 
    startActivity(intent); 
    } 
}; 

は一度FollowOnActivityに私が詳細を検索し、ビューを移入することができます。私は耳を傾けて耳を傾けることもできます。

問題:私はリストの次の項目と前の項目にアクセスできない。これまでのところ、私は考えていることを考えていません。クリーンな解決策。これは共通の要件であるため、おそらくこれには良いパターンがあります。私はそれが何であるか知りたいです。

screen slide exampleを有効にできましたが、その例のリストは5つの項目に固定されています。これらの項目は、データベース項目ではなくxmlファイルのテキストです。私はScreenSlidePagerActivityに基づいてThingSlideActivityを作成し、ScreenSlidePageAdapterに基づいてを、ScreenSlidePageFragmentに基づいてThingSlideFragmentを作成しました。しかし私はそれを私が来ているリストビューに配線する方法を知らない。それは大きなリストを持っているかもしれません、そして私はで、すべての詳細を取得しようとしていません

私はカーソル(この質問の先頭にあるコードの最初のブロック)が入力されたリストビューに座っています。ユーザーがリスト内のランダムなものをクリックし、onListItemClickが実行されます。前と次のアイテムを左右にスワイプすることができるようにするにはどうすればよいですか?

+0

受け入れられた答え[ここ](http://stackoverflow.com/questions/7269830/how-to-get-the-previous-item-of-clicked-listviewitem)を見てください。 – Cheticamp

+0

その答えはむしろ不気味です。理解できません。これは、 "指定された位置のリストアイテムを返すアダプタのgetItem(int position)メソッドを使用する"と言いますが、FollowOnActivityのOnTouchListenerでは、以前のListViewのアダプタを取得する方法はわかりません。 – Dale

答えて

0

これは、最終的な作業です。それはの代わりにThingSlideActivity.getItem()ThingSlideFragment.newInstance(pos)を使用して、screen-slide exampleのパターン(developer.android.com/training)を使用しています。また、最初にListActivityが入力されたCursorを利用できるようにstatic Cursor getCursor()を追加しました。これにより、リスト内の位置からデータベースキーに変換することができました。このパターンに何か不具合がある場合は、アドバイスをしてください。

public class ThingListActivity extends ListActivity { 
    private SQLiteDatabase db; 
    private static Cursor cursor; 

    static Cursor getCursor() { 
     return cursor; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ListView listThings = getListView(); 
     int position = getIntent().getIntExtra("POSITION", 0); 

     try { 
      SQLiteOpenHelper tableDatabaseHelper = new TableDatabaseHelper(this); 
      db = tableDatabaseHelper.getReadableDatabase(); 
      cursor = db.query("TABLE", pullFields, selectionFields, selectionArgs, null, null, null); // you define your own query 

      if (cursor.moveToFirst()) { 
       listThings.setAdapter(new ResourceCursorAdapter(this, R.layout.my_simple_expandable_list_item_2, cursor) { //built-in layout 
        @Override 
        public void bindView(View view, Context context, Cursor cursor) { 
         TextView tvFirst = (TextView)view.findViewById(android.R.id.text1); 
         TextView tvSecond = (TextView)view.findViewById(android.R.id.text2); 
         tvFirst.setText(cursor.getString(1) + " - " + getPctString(cursor.getString(2))); 
         tvSecond.setText(cursor.getString(3)); 
        } 
       }); 
      } else { 
       Toast toast = Toast.makeText(this, "The list was empty.", Toast.LENGTH_SHORT); 
       toast.show(); 
      } 
     } catch (SQLiteException e) { 
      Toast toast = Toast.makeText(this, "Database Unavailable", Toast.LENGTH_SHORT); 
      toast.show(); 
     } finally { 
      //Not closing cursor. Will do in onDestroy() 
     } 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     if (cursor != null) cursor.close(); 
     if (db != null) db.close(); 
    } 

    @Override 
    protected void onListItemClick(ListView listView, View view, int position, long id) { 
     Intent intent = new Intent(ThingListActivity.this, ThingSlideActivity.class); 
     intent.putExtra(ThingSlideActivity.EXTRA_POSITION, (int) position); 
     startActivity(intent); 
    } 
} 

後続FragmentActivity

初期活性このアクティビティは、データベースからリストとリストはを破壊されるまで開いたままカーソルを有します。このアクティビティの内部クラスはThingSlidePageAdapterです。 setCurrentItemという通知は、あなたをリスト内の適切な場所に配置します。

public class ThingSlideActivity extends FragmentActivity{ 

    public static final String EXTRA_POSITION = "extra_position"; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_screen_slide); 
     ViewPager mPager = (ViewPager)findViewById(R.id.pager); 
     PagerAdapter mPagerAdapter = new ThingSlidePageAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(mPagerAdapter); 
     mPager.setCurrentItem((Integer)getIntent().getExtras().get(EXTRA_POSITION)); 
    } 

    private static class ThingSlidePageAdapter extends FragmentStatePagerAdapter { 

     int count; 

     public ThingSlidePageAdapter(FragmentManager fm){ 
      super(fm); 
      this.count = ThingListActivity.getCursor().getCount(); 
     } 

     @Override 
     public int getCount() { 
      return this.count; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return ThingSlideFragment.newInstance(position); // onCreate() doesn't work well. 
     } 
    } 
} 

**我々は通じページングされているFragment。ここでは、データベースのキー(_id)を取得するために、元のListViewCursorを使用します。次に、1つの項目についてのみ詳細を取得して、新しいクエリが実行されます。しかし、カバーの下で、前後のアイテムも引っ張られます。

public class ThingSlideFragment extends Fragment { 

    private static final String ARG_POSITION = "position"; 

    public static ThingSlideFragment create(int position) { 
     ThingSlideFragment fragment = new ThingSlideFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_POSITION, position); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public static ThingSlideFragment newInstance(int position) { 
     ThingSlideFragment fragment = new ThingSlideFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_POSITION, position); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public ThingSlideFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.activity_thing, container, false); 
     TextView tv = (TextView)rootView.findViewById(R.id.thingname); 
     Cursor mCursor = ThingListActivity.getCursor(); 
     if (mCursor != null) { 
      mCursor.moveToPosition(getArguments().getInt(ARG_POSITION)); 
      int id = Integer.parseInt(mCursor.getString(0)); 
      populateView(id, rootView); 
     } 
     return rootView; 
    } 

    private void populateView(int id, View rootView) { 
     Cursor cursor = null; 
     SQLiteDatabase db = null; 
     try { 
      SQLiteOpenHelper tableDatabaseHelper = new TableDatabaseHelper(this.getContext()) ; 
      db = tableDatabaseHelper.getReadableDatabase(); 
      cursor = db.query("TABLE", new String[] {"NAME", "DESCRIPTION", "DETAIL1", "DETAIL2", "DETAIL3", "DETAIL4"}, "_id = ?", new String[] {Integer.toString(id)}, null, null, null); 

      //Move to first record in the cursor (should be just one since our query used database key "CREATE TABLE TABLE (_id INTEGER PRIMARY KEY AUTOINCREMENT, ...." 
      if (cursor.moveToFirst()) { 
       // Get thing details from the cursor 
       String nameText = cursor.getString(0); 
       String descriptionText = cursor.getString(1); 
       // ........ continue with other fields 

       // Populate TextView items 
       ((TextView)rootView.findViewById(R.id.thingname)).setText(nameText); 
       ((TextView)rootView.findViewById(R.id.description)).setText(descriptionText); 
       // ........ continue with other fields 
      } 
     } catch (SQLiteException e) { 
      Toast toast = Toast.makeText(this.getContext(), "Database unavailable. "+ e.getMessage(), Toast.LENGTH_LONG) ; 
     } finally { 
      try {cursor.close();} catch (Throwable t) {} 
      try {db.close();} catch (Throwable t) {} 
     } 
    } 
} 

ここでは、サポートされているxmlファイルの内容を示しています。

<!-- R.layout.activity_screen_slide.xml containing R.id.pager --> 

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<!-- R.layout.activity_thing.xml containing R.id.thingname and R.id.description --> 

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     android:id="@+id/thingRelativeLayout" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     tools:context="com.someones.package.ThingActivity" 
     tools:showIn="@layout/activity_thing"> 

     <TextView 
      android:id="@+id/thingname" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentLeft="true" 
      android:paddingTop="40dp" 
      android:textSize="40dp" 
      android:gravity="center" 
      tools:text="Name Of Thing" 
      /> 
     <TextView 
      android:id="@+id/description" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:textSize="20dp" 
      android:layout_below="@id/thingname" 
      android:paddingTop="10dp" 
      tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris et magna ut erat elementum cursus in quis ipsum. Nam faucibus ultrices eros, vel tempor leo semper sit amet." 
      /> 
    </RelativeLayout> 
</ScrollView> 

私はこれがあなたのために働く希望と私は満足に働くそれを得たまで、私はこれで周りいじる数日を過ごしたので、多くの人が、それを見つけると、そこから利益を得ることができます願っています。可能であればは簡単なものですここでは経験が豊富ですが、特定のレベルの経験者には役立ちます。

1

ListActivityのクエリを実行し、Cursorを取得しました。あなたのリストを表示しているCursorAdapterCursorを添付しました。

ユーザーは3番目の項目(項目2)を選択した場合、その後、あなたのOnItemClickListenerで、positionパラメータが2

だろう、あなたの活動のフォローに、走っに位置(2)を通過したのであればどのような同じクエリがそこにあり、カーソル行2で開始しましたか?カーソルを使うと、前と次のことを知ることができます。リスト内のすべてのデータが得られます。

大きな詳細ビューを表示して左右にスワイプする方法は、ViewPagerというウィジェットを使用することです。 ViewPagerPagerAdapterによって駆動されますが、いくつかの類似点はありますが、確かにListAdapterと同じではありません。

Cursorを持つPagerAdapterを作成すると、ページを作成するときにCursorのデータを与えることができます。アダプターにページ3が要求されたら、詳細ビューを作成し、カーソルから3番目のレコードを読み取り、そのデータを詳細ビューに配置します。

これは本当に簡単です。 ResourceCursorAdapterはこれをカバーしています。アダプタが3番目のアイテムのビューを要求されると、ビューが作成/リサイクルされ、カーソルが3番目のレコードに配置され、最後にbindViewメソッドが呼び出されてビューにデータが配置されます。ここで

PagerAdapterのラフなサンプルです:

public class CursorPagerAdapter extends PagerAdapter { 

    /** Note that this class does not handle closing the cursor. */ 
    private Cursor mCursor; 

    public CursorPagerAdapter(Cursor mCursor) { 
     this.mCursor = mCursor; 
    } 

    @Override 
    public int getCount() { 
     return mCursor == null ? 0 : mCursor.getCount(); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 

     mCursor.moveToPosition(position); 
     String data1 = mCursor.getString(1); 
     String data2 = mCursor.getString(2); 
     String data3 = mCursor.getString(3); 

     View view = LayoutInflater.from(container.getContext()).inflate(R.layout.detail_view, container, false); 

     // TODO fill in the view with the cursor data 

     container.addView(view); 
     return view; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 
} 

ViewPagerはトリッキー少し時間を浪費ですが、それはここでそれらの操作方法を学び始めるのが良いですので、Androidの開発者として、あなたは、遅かれ早かれ、それが必要になります。 ViewPagerのチュートリアルをお楽しみになることをお勧めします。

+0

ViewPagerは、おそらく私が探している "いいパターン"です! – Dale

+0

スワイプビューのチュートリアルの多くはタブを変更していますが、これはもちろん私が探しているものではありません。 "viewpager cursor swipe"を検索しました。http://stackoverflow.com/questions/22162589/viewpager-cursor-and-fragmentが見つかりました。 – Dale

関連する問題