重複の可能性あり:
Android の水平 ListView ですか?
Android の多くの機能と同様に、これがそれほど難しい問題だとは思わないでしょうが、それは間違いです。また、Android の多くの機能と同様に、API は、十分に拡張可能な開始点さえ提供していません。私が望んでいるのは、それを横向きにすることだけなのに、独自の ListView を作成するなんて、とんでもないことです。\rant
さて、怒りが収まったので、問題そのものについて話しましょう。私が必要としているのは、基本的に とまったく同じものですGallery
が、センターロック機能はありません。ListView
の listSelector は実際には必要ではありませんが、あれば便利です。LinearLayout
の内部で を使ってやりたいことはほとんどできますScrollView
が、子ビューは から取得する必要がありListAdapter
、ビューリサイクラーが本当に欲しいです。そして、本当にレイアウトコードを書きたくありません。
これらのクラスのいくつかのソース コードを覗いてみました...
ギャラリー:'onXyz' メソッドのほとんどをオーバーライドし、そのソース コードをすべてコピーして、 の呼び出しを控えれば、ギャラリーを使用できるように見えますscrollIntoSlots()
。ただし、そうすると、アクセスできないメンバー フィールドやその他の予期しない結果が発生することは間違いありません。
腹筋スピナー:mRecycler
フィールドはパッケージプライベートなので、このクラスを拡張できるかどうかは疑問です。
アブスリストビュー:このクラスは垂直スクロール専用であるようなので、ここでは役に立ちません。
アダプタビュー:このクラスを直接拡張する必要は一度もありませんでした。簡単に実行でき、独自の を簡単に作成できると言われたらRecycleBin
、私は非常に懐疑的になりますが、試してみるつもりです。
おそらくコピーできるだろう両方 AbsSpinner
そして、Gallery
私が望むものを得るために... それらのクラスが、私がアクセスできないパッケージプライベート変数を使用していないことを願っています。 皆さんはそれが良い方法だと思いますか? 誰か、私を正しい方向に導いてくれるようなチュートリアルやサードパーティのソリューションを持っていますか?
アップデート:
これまで私が見つけた唯一の解決策は、すべて自分で行うことです。この質問をしてから、私はAdapterView
独自の「HorizontalListView」を最初からオーバーライドして実装しました。ギャラリーの中央ロック機能を完全にオーバーライドする唯一の方法はscrollIntoSlots
、プライベート メソッドをオーバーライドすることですが、これには実行時にサブクラスを生成する必要があると思います。それをする勇気があるなら、それは間違いなく最善の解決策ですが、変更される可能性のあるドキュメント化されていないメソッドに頼りたくはありません。
Gallery
下のSwathi EPは、 anを与えてOnTouchListener
スクロール機能をオーバーライドすることを提案しました。リストにフリングサポートがなくても構わない場合、またはフリングアニメーションの最後にビューが中央にスナップしても問題ない場合は、これを使用します。意思うまくいきます! しかし、結局のところ、フリングのサポートを削除せずにセンターロック機能を削除することは不可能であることが判明しました。 では、どのようなリストがフリングしないのでしょうか?
残念ながら、これは私にはうまくいきませんでした。:-( しかし、このアプローチに興味がある場合は、読み進めてください...
目的を達成するために、Swathi のコードにいくつか追加する必要がありました。 ではGestureListener.onTouch
、ジェスチャ検出器に委任するだけでなく、イベントACTION_UP
とACTION_CANCEL
イベントに対して true を返す必要もありました。これにより、センターロック機能は無効になりましたが、フリングも無効になりました。独自の GestureListener を Gallery のメソッドに委任することで、フリングを再度有効にすることができましたonFling
。試してみる場合は、ApiDemos サンプル コードに移動し、Gallery1.java クラスを次のコードに置き換えてください。
import com.example.android.apis.R;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
public class Gallery1 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gallery_1);
// Reference the Gallery view
final Gallery g = (Gallery) findViewById(R.id.gallery);
// Set the adapter to our custom adapter (below)
g.setAdapter(new ImageAdapter(this));
// Set a item click listener, and just Toast the clicked position
g.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position, long id) {
Toast.makeText(Gallery1.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
// Gesture detection
final GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector(g));
OnTouchListener gestureListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean retVal = gestureDetector.onTouchEvent(event);
int action = event.getAction();
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
retVal = true;
onUp();
}
return retVal;
}
public void onUp() {
// Here I am merely copying the Gallery's onUp() method.
for (int i = g.getChildCount() - 1; i >= 0; i--) {
g.getChildAt(i).setPressed(false);
}
g.setPressed(false);
}
};
g.setOnTouchListener(gestureListener);
// We also want to show context menu for longpressed items in the gallery
registerForContextMenu(g);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.add(R.string.gallery_2_text);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Toast.makeText(this, "Longpress: " + info.position, Toast.LENGTH_SHORT).show();
return true;
}
public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
public ImageAdapter(Context c) {
mContext = c;
// See res/values/attrs.xml for the <declare-styleable> that defines
// Gallery1.
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
mGalleryItemBackground = a.getResourceId(
R.styleable.Gallery1_android_galleryItemBackground, 0);
a.recycle();
}
public int getCount() {
return mImageIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
i.setImageResource(mImageIds[position]);
i.setScaleType(ImageView.ScaleType.FIT_XY);
i.setLayoutParams(new Gallery.LayoutParams(136, 88));
// The preferred Gallery item background
i.setBackgroundResource(mGalleryItemBackground);
return i;
}
private Context mContext;
private Integer[] mImageIds = {
R.drawable.gallery_photo_1,
R.drawable.gallery_photo_2,
R.drawable.gallery_photo_3,
R.drawable.gallery_photo_4,
R.drawable.gallery_photo_5,
R.drawable.gallery_photo_6,
R.drawable.gallery_photo_7,
R.drawable.gallery_photo_8
};
}
public class MyGestureDetector extends SimpleOnGestureListener {
private Gallery gallery;
public MyGestureDetector(Gallery gallery) {
this.gallery = gallery;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return gallery.onFling(e1, e2, velocityX, velocityY);
}
}
}
ベストアンサー1
この投稿を読んだ後、私は独自の水平を実装しましたListView
。ここで見つけることができます:http://dev-smart.com/horizontal-listview/これが役に立つかどうか教えてください。