2017-08-15 43 views
0

我是新來的android編程。我一直在試圖製作需要時間,日期和描述作爲輸入的提醒應用程序。如何動態更改CardView中的內容

我想添加一個刷卡動作。最初,卡片顯示時間和日期,但是當用戶在卡片上滑動時,卡片中的內容必須更改,它應該完全顯示一個新的佈局,其中包含一個包含Description的TextView。

我到處搜索過,但他們都給出了在RecyclerView中移除或移動卡。

我想要的是,如何使用滑動動作動態更改卡片中的內容(或佈局)?

這是我的名片佈局card_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout `enter code here`xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="170dp"> 

<android.support.v7.widget.CardView 
    android:layout_height="150dp" 
    android:layout_width="320dp" 
    android:id="@+id/card_view" 
    card_view:cardCornerRadius="16dp" 
    card_view:cardElevation="2dp" 
    > 


    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="match_parent" 
     android:padding="10dp" 
     android:orientation="vertical" 
     android:background="@color/blue_color"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="00:00" 
      android:fontFamily="sans-serif-light" 
      android:id="@+id/cardTime" 
      android:textSize="@dimen/textview_fontsize" 
      android:textColor="@color/textview_color" 
      /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="DESCRIPTION" 
      android:fontFamily="sans-serif-light" 
      android:id="@+id/description" 
      android:textSize="@dimen/textview_fontsize" 
      android:textColor="@color/textview_color" 
      android:visibility="gone" 
      /> 

     <TextView 
      android:text="" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_toEndOf="@+id/cardTime" 
      android:layout_marginStart="12dp" 
      android:layout_marginTop="17dp" 
      android:id="@+id/cardPeriod" 
      android:textColor="@color/textview_color" 
      android:fontFamily="sans-serif-light"/> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:background="@color/textview_color" 
      android:layout_alignBottom="@+id/cardTime" 
      android:id="@+id/time_line" /> 


     <TextView 
      android:text="09/01/1997" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentStart="true" 
      android:layout_marginStart="20dp" 
      android:id="@+id/cardDate" 
      android:textColor="@color/textview_color" 
      android:fontFamily="sans-serif-light" 
      android:textSize="@dimen/date_fontsize"/> 


    </RelativeLayout> 


</android.support.v7.widget.CardView> 

MainActivity.java

public class MainActivity extends AppCompatActivity implements AlarmDialog.AlarmDialogListener { 

ArrayList<CardGen> cardsList = new ArrayList<CardGen>(); 
RecyclerView recyclerView; 
CardAdapter cardAdapter = new CardAdapter(cardsList); 
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 




@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    recyclerView = (RecyclerView) findViewById(R.id.cardList); 
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(linearLayoutManager); 
    recyclerView.setAdapter(cardAdapter); 




    ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { 

     @Override 
     public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
      return false; 
     } 

     @Override 
     public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
      int position = viewHolder.getAdapterPosition(); 
      CardAdapter.CardViewHolder holder = (CardAdapter.CardViewHolder) viewHolder; 

      if (direction == ItemTouchHelper.LEFT){ 

        holder.timeView.setVisibility(View.GONE); 
        holder.description.setVisibility(View.VISIBLE); 

      } else { 

      } 
     } 

     @Override 
     public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 


      if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){ 


      } 
      super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
     } 
    }; 
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
    itemTouchHelper.attachToRecyclerView(recyclerView); 




} 


public void createAlarm(View view){ 

    DialogFragment dialogFragment = new AlarmDialog(); 
    dialogFragment.show(getFragmentManager(), "AlarmDialog"); 
} 


@Override 
public void onDialogPositiveClick(DialogFragment dialog) { 
    Dialog dialog1 = dialog.getDialog(); 
    TimePicker timePicker = (TimePicker) dialog1.findViewById(R.id.timePicker); 
    int hour = timePicker.getHour(); 
    String tempHour = Integer.toString(hour); 
    String minute = Integer.toString(timePicker.getMinute()); 
    if(minute.length()==1){minute = "0" + minute;} 
    Toast.makeText(this, tempHour, Toast.LENGTH_SHORT).show(); 


    System.out.println("this is adapter begin"); 

    CardGen cardGen = new CardGen(); 
    if(hour>12){tempHour = Integer.toString(hour-12);} 
    else if(hour==0){tempHour="12";} 

    if(tempHour.length()==1){tempHour = "0"+tempHour;} 
    cardGen.hour = tempHour+":"+minute; 
    if(hour>=12){cardGen.period="PM";}else{cardGen.period="AM";} 

    cardGen.fragmentManager = getFragmentManager(); 
    cardAdapter.addList(cardGen); 

    System.out.println(Integer.toString(cardsList.size())); 
    System.out.println("this is the middle"); 





    System.out.println("this is the end"); 

} 

@Override 
public void onDialogNegativeClick(DialogFragment dialog) { 

} 

}

RecyclerAdapter(CardAdapter.java)

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CardViewHolder> { 

private ArrayList<CardGen> cardsList; 

public CardAdapter(ArrayList<CardGen> cardsList){ 
    this.cardsList = cardsList; 


} 

@Override 
public int getItemCount() { 
    return cardsList.size(); 
} 



@Override 
public void onBindViewHolder(final CardViewHolder holder, int position) { 

    final CardGen cardGen = cardsList.get(position); 
    holder.timeView.setText(cardGen.hour); 

    holder.periodView.setText(cardGen.period); 
    final TextView temp = holder.dateView; 
    holder.dateView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DateSelection newFragment = new DateSelection(); 
      newFragment.setElements(temp); 


      newFragment.show(cardGen.fragmentManager, "datePicker"); 
     } 
    }); 



} 




@Override 
public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.cards, parent, false); 
    return new CardViewHolder(itemView); 
} 


public void addList(CardGen card){ 
    cardsList.add(card); 
    notifyItemInserted(cardsList.size()); 
} 

public void removeList(int position){ 
    cardsList.remove(position); 
    notifyItemRemoved(position); 
    notifyItemRangeChanged(position, cardsList.size()); 
} 

public class CardViewHolder extends RecyclerView.ViewHolder{ 

    TextView timeView,periodView,dateView,description; 
    Button transfer; 

    public CardViewHolder(View v){ 
     super(v); 

     timeView = (TextView) v.findViewById(R.id.cardTime); 
     periodView = (TextView) v.findViewById(R.id.cardPeriod); 
     dateView = (TextView) v.findViewById(R.id.cardDate); 
     description = (TextView) v.findViewById(R.id.description); 
     transfer = (Button) v.findViewById(R.id.transfer); 

    } 
} 

}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 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.bharath.organiserexample.MainActivity"> 

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/cardList"> 


</android.support.v7.widget.RecyclerView> 

<ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="62dp" 
    android:background="@null" 
    android:src="@mipmap/add_button" 
    android:layout_gravity="bottom|right" 
    android:onClick="createAlarm" /> 


</FrameLayout> 
+0

你想要什麼類型的動畫?您需要使用recyclerview的itemTouchListener,然後實現所需的功能。 – Ritesh

回答

0

有幾個選項。最簡單的方法是讓你的卡片視圖包含你的描述,但最初將可見性設置爲「通過」,然後當滑動事件發生時,將初始狀態轉換爲「通過」並將描述轉換爲可見。我會創建一個輔助方法來做到這一點。至於捕捉輕掃手勢,看看這個答案。

Swipe to Dismiss for RecyclerView

您將需要使用recyclerview,但如果你把你的反轉視圖邏輯在onSwiped方法應該工作

編輯 爲了得到cardview,從使用ViewHolder recyclerview

@Override 
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
     MyCustomViewHolder vh = (MyCustomViewHolder) viewHolder; 
     if(vh.isDescriptionShown()){ 
      vh.showDetails() 
     }else { 
      vh.showDescription() 
     } 
    } 
+0

亞..我用過了ItemTouchHelper。但我不知道如何動態設置卡片的可見度。我有這個想法,但放棄了,因爲我不知道它。如何動態設置可見性? –

+0

我已經更新了我的答案,使用ViewHolder訪問卡視圖。你需要實現你自己的ViewHolder來實現你想要的功能。看看MyAdapter類,並注意文檔https://developer.android.com/training/material/lists-cards.html –

+0

中嵌套的MyAdapter.ViewHolder類謝謝..這工作...但我有還有一個問題。每次刷卡都離開活動。有什麼方法可以讓我的卡留在活動中並進行更新(顯示說明)? –

0

也許你應該使用一個數據庫,然後添加一個刷卡聽衆或(姿態探測器)。無論何時刷卡,都會從卡中移除當前項目,然後從數據庫或列表中獲取新項目。但我認爲這將是最好的清單,以便您可以跟蹤當前項目。並且還能夠輕鬆移除滑動的物品。當用戶添加一個項目時,它將從數據庫添加到您的列表中。這樣你就不用擔心下一個項目的位置。

+0

亞..但我有一個問題。刷卡時,該卡正在離開視圖,但我想要的是將卡留在那裏並接受刷卡並更改其內容。有什麼方法可以將卡片添加到卡片上,而不是將其添加到RecyclerView中? –

+0

您可以使用圖書館的可滑動卡例如卡堆棧或刷卡 –

+0

我想我的卡完全像Instagram卡中有多張照片。當Instagram中有多張照片的卡片被刷卡時,卡片會顯示下一張照片。我想讓我的卡片就像那樣......那麼我應該使用哪些圖書館? –