この回答はお役に立ちます。私はグリッドレイアウトマネージャーを備えたrecyclerviewを使ってこのタスクを実行する方がよいと思います。リサイクルビューからは、ビューをスワイプして、それらを交換することができます。
すべての最初のビルドのGradleにリサイクルビューとカードビューの依存関係を追加
compile 'com.android.support:recyclerview-v7:25+'
compile 'com.android.support:cardview-v7:25+'
私は+
をadded25持つように、プロジェクトのSDKのバージョンに応じて、私は25を持っている依存関係を追加します。今アクティビティを作成します。
public class MainActivity extends AppCompatActivity { プライベートコンテキストmContext;
RelativeLayout mRelativeLayout;
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get the application context
mContext = getApplicationContext();
// Get the widgets reference from XML layout
mRelativeLayout = (RelativeLayout) findViewById(R.id.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
// Initialize a new String array
String[] animals = {
"Aardvark",
"Albatross",
"Alligator",
"Alpaca",
"Ant",
"Anteater",
"Antelope",
"Ape",
"Armadillo",
"Donkey",
"Baboon",
"Badger",
"Barracuda",
"Bear",
"Beaver",
"Bee"
};
/*
GridLayoutManager
A RecyclerView.LayoutManager implementations that lays out items in a grid.
By default, each item occupies 1 span. You can change it by providing a custom
GridLayoutManager.SpanSizeLookup instance via setSpanSizeLookup(SpanSizeLookup).
*/
/*
public GridLayoutManager (Context context, int spanCount)
Creates a vertical GridLayoutManager
Parameters
context : Current context, will be used to access resources.
spanCount : The number of columns in the grid
*/
// Define a layout for RecyclerView
mLayoutManager = new GridLayoutManager(mContext,3);
mRecyclerView.setLayoutManager(mLayoutManager);
// Initialize a new instance of RecyclerView Adapter instance
mAdapter = new AnimalsAdapter(mContext,animals);
// Set the adapter for RecyclerView
mRecyclerView.setAdapter(mAdapter);
setUpItemTouchHelper(); // this method is use to swipe views
}
クラスのレイアウトを作成します。そして、グリッドのアイテムとして、グリッドcustom_view.xmlためにこのカードビューの行為をカービューの追加メインレイアウト
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
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"
tools:context="com.example.crowderia.myapplication.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
>
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
にrecyclerviewを追加します。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp"
card_view:cardMaxElevation="4dp"
card_view:cardElevation="2dp"
card_view:contentPadding="5dp"
>
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="3dp"
>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#000"
android:textSize="25dp"
android:textStyle="bold"
android:layout_margin="2dp"
android:padding="10dp"
android:layout_gravity="center"
android:gravity="center"
/>
</LinearLayout>
</android.support.v7.widget.CardView>
gridlayout用のアダプタを作成します。
public class AnimalsAdapter extends RecyclerView.Adapter<AnimalsAdapter.ViewHolder>{
private String[] mDataSet;
private Context mContext;
private Random mRandom = new Random();
public AnimalsAdapter(Context context, String[] DataSet){
mDataSet = DataSet;
mContext = context;
}
@Override
public AnimalsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
// Create a new View
View v = LayoutInflater.from(mContext).inflate(R.layout.custom_view,parent,false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position){
holder.mTextView.setText(mDataSet[position]);
//ランダム色 INT色= getRandomHSVColor()を生成します。
// Set a random color for TextView background
holder.mTextView.setBackgroundColor(getLighterColor(color));
// Set a text color for TextView
holder.mTextView.setTextColor(getReverseColor(color));
// Set a gradient background for LinearLayout
holder.mLinearLayout.setBackground(getGradientDrawable());
// Emboss the TextView text
applyEmbossMaskFilter(holder.mTextView);
}
@Override
public int getItemCount(){
return mDataSet.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
public TextView mTextView;
public LinearLayout mLinearLayout;
public ViewHolder(View v){
super(v);
mTextView = (TextView) v.findViewById(R.id.tv);
mLinearLayout = (LinearLayout) v.findViewById(R.id.ll);
}
}
// Custom method to apply emboss mask filter to TextView
protected void applyEmbossMaskFilter(TextView tv){
EmbossMaskFilter embossFilter = new EmbossMaskFilter(
new float[]{1f, 5f, 1f}, // direction of the light source
0.8f, // ambient light between 0 to 1
8, // specular highlights
7f // blur before applying lighting
);
tv.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
tv.getPaint().setMaskFilter(embossFilter);
}
// Custom method to generate random HSV color
protected int getRandomHSVColor(){
// Generate a random hue value between 0 to 360
int hue = mRandom.nextInt(361);
// We make the color depth full
float saturation = 1.0f;
// We make a full bright color
float value = 1.0f;
// We avoid color transparency
int alpha = 255;
// Finally, generate the color
int color = Color.HSVToColor(alpha, new float[]{hue, saturation, value});
// Return the color
return color;
}
// Custom method to create a GradientDrawable object
protected GradientDrawable getGradientDrawable(){
GradientDrawable gradient = new GradientDrawable();
gradient.setGradientType(GradientDrawable.SWEEP_GRADIENT);
gradient.setColors(new int[]{getRandomHSVColor(), getRandomHSVColor(),getRandomHSVColor()});
return gradient;
}
// Custom method to get a darker color
protected int getDarkerColor(int color){
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] = 0.8f *hsv[2];
return Color.HSVToColor(hsv);
}
// Custom method to get a lighter color
protected int getLighterColor(int color){
float[] hsv = new float[3];
Color.colorToHSV(color,hsv);
hsv[2] = 0.2f + 0.8f * hsv[2];
return Color.HSVToColor(hsv);
}
// Custom method to get reverse color
protected int getReverseColor(int color){
float[] hsv = new float[3];
Color.RGBToHSV(
Color.red(color), // Red value
Color.green(color), // Green value
Color.blue(color), // Blue value
hsv
);
hsv[0] = (hsv[0] + 180) % 360;
return Color.HSVToColor(hsv);
}
そして最も重要な部分は、OnItemTouchHelperメソッドです。メインアクティビティにメソッドを作成し、このコードをコピーします。
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT|ItemTouchHelper.UP|ItemTouchHelper.DOWN) {
// not important, we don't want drag & drop
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int position = viewHolder.getAdapterPosition();
AnimalsAdapter mAdapter = (AnimalsAdapter) recyclerView.getAdapter();
return super.getSwipeDirs(recyclerView, viewHolder);
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
int swipedPosition = viewHolder.getAdapterPosition();
AnimalsAdapter mAdapter = (AnimalsAdapter) mRecyclerView.getAdapter();
if (swipeDir == ItemTouchHelper.LEFT){
// mAdapter.pendingRemoval(swipedPosition);
} else if (swipeDir == ItemTouchHelper.UP){
// mAdapter.pendingAccept(swipedPosition);
}
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
View itemView = viewHolder.itemView;
// not sure why, but this method get's called for viewholder that are already swiped away
if (viewHolder.getAdapterPosition() == -1) {
// not interested in those
return;
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
};
ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
mItemTouchHelper.attachToRecyclerView(mRecyclerView);
あなたはonSwiped方法でスワイプアクションをキャッチし、アクションを実行し、そこカービューの位置を変更するためにコードを書くことができ、あなたはそのpostition上のアダプタおよびアダプタカードを変更、使用を通知するために呼び出すことができます。..方法へアダプタをリフレッシュします。詳細については、RecylerViewのドキュメントとRecylerView adaptorのドキュメントを参照してください。
乾杯!
あなたの予想される出力を共有してください –
水平スライドに[View Pager'](https://developer.android.com/reference/android/support/v4/view/ViewPager.html)を使用してみませんか? –