2017-02-07 112 views
1

我遇到拖放問題。Android在堆棧卡上拖放片段

這裏我的場景是,我有一個片段,其中包含一組卡,我的一張卡片包含拖放元素,即textview accourding的優先級。

Here the tutotrial for the drag and drop

This the youtube video for the same

的例子,當我introduses另一個活動工作正常。但是當我在碎片刷卡中做這件事情時會引起問題。

錯誤日誌

02-07 12:09:49.271 17876-17876/com.panenviron E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.panenviron, PID: 17876 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getChildCount()' on a null object reference 
                       at com.panenviron.fragments.TaskCardListShow.onCreateView(TaskCardListShow.java:61) 

TaskCardListShow.java片段這是包含堆疊卡,這工作正常,當我想在這裏實現拖放概念是導致應用程序崩潰

以下是密碼

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Toast; 

import com.jmedeisis.draglinearlayout.DragLinearLayout; 
import com.panenviron.R; 

import java.util.ArrayList; 
import java.util.List; 

import link.fls.swipestack.SwipeStack; 

public class TaskCardListShow extends Fragment implements SwipeStack.SwipeStackListener, View.OnClickListener { 
    private ArrayList<String> mData; 
    private ArrayList<String> LayOutData; 
    private SwipeStack mSwipeStack; 
    private SwipeStackAdapter mAdapter; 
    public int cardCounter; 
    public TaskCardListShow() { 
    } 
    public static TaskCardListShow newInstance() { 

     TaskCardListShow _TaskCardListShow = new TaskCardListShow(); 

     return _TaskCardListShow; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.task_card_list_show, container, false); 
     Log.e("im on","TaskCardListShow"); 
     mSwipeStack = (SwipeStack) view.findViewById(R.id.swipeStack); 
     mData = new ArrayList<>(); 
     LayOutData = new ArrayList<>(); 
     mAdapter = new SwipeStackAdapter(mData,LayOutData); 
     mSwipeStack.setAdapter(mAdapter); 
     mSwipeStack.setListener(this); 

     cardCounter=4;// write function for getting card count. 
     fillStackCard(); 

     DragLinearLayout dragDropAndroidLinearLayout = (DragLinearLayout) view.findViewById(R.id.drag_drop_layout); 
     for (int i = 0; i < dragDropAndroidLinearLayout.getChildCount(); i++) { 
      View child = dragDropAndroidLinearLayout.getChildAt(i); 
      dragDropAndroidLinearLayout.setViewDraggable(child, child); 
     } 
     return view; 
    } 

    private void fillStackCard() { 
     for (int x = 0; x <cardCounter; x++) { 
      mData.add(getString(R.string.dummy_text) + " " + (x + 1)); 
      LayOutData.add(getString(R.string.str_card)+ (x + 1)); 
     } 
    } 


    @Override 
    public void onClick(View v) { 

    } 
    @Override 
    public void onViewSwipedToRight(int position) { 
     String swipedElement = mAdapter.getItem(position); 
    } 

    @Override 
    public void onViewSwipedToLeft(int position) { 
     String swipedElement = mAdapter.getItem(position); 
    } 

    @Override 
    public void onStackEmpty() { 

     removeTaskCardFragment(); 
    } 
    public void removeTaskCardFragment(){ 
     FragmentManager manager = getActivity().getSupportFragmentManager(); 
     FragmentTransaction mFragmentTransaction = manager.beginTransaction(); 
     TaskCardListShow _TaskCardListShowFragment = new TaskCardListShow(); 
     mFragmentTransaction.remove(_TaskCardListShowFragment); 
     mFragmentTransaction.commit(); 
     manager.popBackStack(); 
    } 

    public class SwipeStackAdapter extends BaseAdapter { 

     private List<String> mData; 
     private List<String> LayOutData; 

     public SwipeStackAdapter(List<String> data,List<String> Ldata) { 
      this.mData = data; 
      this.LayOutData = Ldata; 
     } 

     @Override 
     public int getCount() { 
      return mData.size(); 
     } 

     @Override 
     public String getItem(int position) { 
      return mData.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      String LName=LayOutData.get(position); 

      int id = getActivity().getApplicationContext().getResources(). 
        getIdentifier(LName, "layout", getActivity().getPackageName()); 
      convertView = getActivity().getLayoutInflater().inflate(id, parent, false); 

      Log.e("position=", String.valueOf(position)); 


      return convertView; 
     } 
    } 

} 

Card_3.xml

<?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:layout_height="match_parent" 
    android:layout_width="match_parent" 
    card_view:cardCornerRadius="@dimen/card_corner_radius" 
    card_view:cardElevation="@dimen/elevation_large" 
    > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 
     <com.jmedeisis.draglinearlayout.DragLinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/drag_drop_layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <TextView 
       android:id="@+id/drag_drop_textview1" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="5dp" 
       android:background="#fff" 
       android:elevation="3dp" 
       android:gravity="center" 
       android:padding="30dp" 
       android:text="P - 3" 
       android:textStyle="bold" /> 

      <TextView 
       android:id="@+id/drag_drop_textview" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="5dp" 
       android:background="#fff" 
       android:elevation="3dp" 
       android:gravity="center" 
       android:padding="30dp" 
       android:text="P - 2" 
       android:textStyle="bold" /> 

      <TextView 
       android:id="@+id/drag_drop_textview2" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="5dp" 
       android:background="#fff" 
       android:elevation="3dp" 
       android:gravity="center" 
       android:padding="30dp" 
       android:text="P - 4" 
       android:textStyle="bold" /> 

      <TextView 
       android:id="@+id/drag_drop_textview3" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="5dp" 
       android:background="#fff" 
       android:elevation="3dp" 
       android:gravity="center" 
       android:padding="30dp" 
       android:text="P - 5" 
       android:textStyle="bold" /> 

     </com.jmedeisis.draglinearlayout.DragLinearLayout> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 

gradle這個

compile 'com.jmedeisis:draglinearlayout:1.1.0' 

回答

2

我的錯誤是IM tryiong訪問錯誤的方式佈局。即未來我的拖放佈局IM試圖訪問那裏的領域,所以我只是改變

if(position==2){ // drag and layou card will come at this condition. 
        DragLinearLayout dragDropAndroidLinearLayout = 
          (DragLinearLayout) findViewById(R.id.drag_drop_layout); 
        for (int i = 0; i < 3; i++) { 
         View child = dragDropAndroidLinearLayout.getChildAt(i); 
         dragDropAndroidLinearLayout.setViewDraggable(child, child); 
        } 
       } 

現在我能夠看到拖放LIS,但這裏也是我還有一個問題,

如果之前我拖放textview不能放下位置。它又回到了以前的位置。我有人嗎?你能幫我解決嗎?