আইটেমটিউচহেল্পার.সিম্পলক্যালব্যাক ব্যবহার করে রিসাইক্লারভিউতে পজিশনের জন্য সোয়াইপ অক্ষম করুন


92

আমি আমার তালিকার সোয়াইপ-টু-খারিজ বিকল্পটি সক্ষম করতে আমি পুনর্ব্যবহারযোগ্য ২২.২.০ এবং সহায়ক শ্রেণি আইটেম টাচহেল্পার ব্যবহার করছি imp সিম্পলক্যালব্যাক । তবে এতে আমার এক ধরণের শিরোনাম রয়েছে, তাই অ্যাডাপ্টারের প্রথম অবস্থানের জন্য আমাকে সোয়াইপ আচরণটি অক্ষম করতে হবে। হিসাবে RecyclerView.Adapter একটি নেই isEnabled () পদ্ধতি, আমি পদ্ধতিগুলির মাধ্যমে দৃশ্য মিথষ্ক্রিয়া অক্ষম করার চেষ্টা isEnabled () এবং isFocusable () ViewHolder সৃষ্টি নিজেই, কিন্তু কোন সাফল্য ছিল। আমি একটি পূর্ণ মান সোয়াইপ থ্রেশহোল্ড সমন্বয় করার চেষ্টা মত 0f OT 1F SimpleCallback এর পদ্ধতিতে getSwipeThreshold () , কিন্তু কোন সাফল্য খুব।

আমার কোডটির কিছু টুকরো আমাকে সাহায্য করতে আপনাকে সহায়তা করার জন্য।

আমার ক্রিয়াকলাপ:

@Override
protected void onCreate(Bundle bundle) {
    //... initialization
    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 float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
            if (viewHolder instanceof CartAdapter.MyViewHolder) return 1f;
            return super.getSwipeThreshold(viewHolder);
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {

        }
    };

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView);
}

এবং আমার কাছে দুটি ভিউ প্রকারের সাথে একটি সাধারণ অ্যাডাপ্টার রয়েছে । ইন ViewHolder যে আমি অক্ষম স্যুইপিং করতে চাই, আমি:

public static class MyViewHolder extends RecyclerView.ViewHolder {
    public ViewGroup mContainer;

    public MyViewHolder(View v) {
        super(v);
        v.setFocusable(false);
        v.setEnabled(false);
        mContainer = (ViewGroup) v.findViewById(R.id.container);      
    }
}

উত্তর:


204

কিছুটা খেলার পরে, আমি পরিচালনা করেছিলাম যে সিম্পলক্যালব্যাকের getSwipeDirs () নামে একটি পদ্ধতি আছে । যেহেতু আমার কাছে swipable না পজিশনের জন্য একটি নির্দিষ্ট ভিউহোল্ডার রয়েছে তাই আমি সোয়াইপ এড়াতে উদাহরণস্বরূপ ব্যবহার করতে পারি । যদি এটি আপনার ক্ষেত্রে না হয় তবে আপনি অ্যাডাপ্টারে ভিউহোল্ডারের অবস্থান ব্যবহার করে এই নিয়ন্ত্রণটি সম্পাদন করতে পারেন।

জাভা

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder instanceof CartAdapter.MyViewHolder) return 0;
    return super.getSwipeDirs(recyclerView, viewHolder);
}

কোটলিন

override fun getSwipeDirs (recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
    if (viewHolder is CartAdapter.MyViewHolder) return 0
    return super.getSwipeDirs(recyclerView, viewHolder)
}

4
ঠিক আমি খুঁজছেন ছিল কি! বিশেষত যখন এই পদ্ধতিটি সরকারী দস্তাবেজগুলিতে উপস্থিত না হয় ...
ptitvinou


4
উল্লেখযোগ্য: আপনি যদি নির্দিষ্ট আইটেমের জন্য কেবল একটি দিকের অনুমতি দিতে চান তবে ব্যবহার করুন return position == 0 ? ItemTouchHelper.LEFT : super.getSwipeDirs(recyclerView, viewHolder);- এইটি অর্থাৎ কেবল বাম সোয়াইপগুলির জন্য অনুমতি দিন।
জিন d'arme

পারফেক্ট মনোমুগ্ধকর মতো কাজ করা
ম্যাসেজ অফ কিং মাস্স

কিভাবে কাজ করে? আমি উদাহরণস্বরূপ সোয়াইপিং অক্ষম করতে চাইলে আমি কী করব?
এবি

66

যদি কেউ আইটেম টাচ হেল্পার.ক্যালব্যাক ব্যবহার করে । তারপরে আপনি getMovementFlags (..) ফাংশনে সম্পর্কিত যে কোনও পতাকা সরিয়ে ফেলতে পারেন ।

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
    int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
    return makeMovementFlags(dragFlags, swipeFlags);
}

এখানে ড্রাগফ্ল্যাগস এবং সোয়াইপ ফ্ল্যাগগুলির পরিবর্তে আপনি সংশ্লিষ্ট বৈশিষ্ট্যটি অক্ষম করতে 0 পাস করতে পারেন।

আইটেমটিচহেলপার.এসটিআর্ট মানে বাম থেকে ডান লোকেলের ক্ষেত্রে (এলটিআর অ্যাপ্লিকেশন সহায়তা), তবে ডান থেকে বামে লোকেলের (আরটিএল অ্যাপ্লিকেশন সহায়তা) অন্যদিকে অন্যদিকে সোয়াইপ করা। আইটেম টাচ হেল্পার.এন্ড মানে এর বিপরীত দিকে সোয়াইপ করা START

যাতে আপনি আপনার প্রয়োজনীয়তা অনুযায়ী যে কোনও পতাকা মুছে ফেলতে পারেন।


ধন্যবাদ! আইটেম টাচহেল্পার.ডাউন; // মুভমেন্টগুলি ড্র্যাগ রিটার্ন মেকফ্ল্যাগ (আইটেম টাচ হেল্পার A অ্যাকশনটিপিজেডডিআরএজি, ড্রাগফ্ল্যাগস); // প্যারামিটার হিসাবে, অ্যাকশন ড্রাগ এবং পতাকাগুলি টেনে আনুন}
Xuan Nguyen

আপনি যদি ItemTouchHelper.Callbackসরাসরি প্রসারিত করেন তবে এটিই পছন্দসই উত্তর OP
tir38

23

এটি করার জন্য এখানে একটি সহজ উপায় যা কেবলমাত্র আইটেমটি সোয়েপ করা হচ্ছে তার অবস্থানের উপর নির্ভর করে:

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder holder) {
    int position = holder.getAdapterPosition();
    int dragFlags = 0; // whatever your dragFlags need to be
    int swipeFlags = createSwipeFlags(position)

    return makeMovementFlags(dragFlags, swipeFlags);
}

private int createSwipeFlags(int position) {
  return position == 0 ? 0 : ItemTouchHelper.START | ItemTouchHelper.END;
}

আপনি যদি ব্যবহার করছেন তবে এটিও কাজ করা উচিত SimpleCallback:

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder holder) {
    int position = holder.getAdapterPosition();
    return createSwipeFlags(position);
}

private int createSwipeFlags(int position) {
  return position == 0 ? 0 : super.getSwipeDirs(recyclerView, viewHolder);
}

আপনি যদি আইটেমের ডেটা অনুসারে শর্তাধীন swiping অক্ষম করতে চান, আইটেমটি সোয়াইপ করা positionজন্য অ্যাডাপ্টারের থেকে তথ্য পেতে মানটি ব্যবহার করুন এবং সেই অনুযায়ী অক্ষম করুন।

আপনার যদি ইতিমধ্যে নির্দিষ্ট ধারক ধরণের থাকে তবে যা সোয়াইপ করার দরকার নেই, স্বীকৃত উত্তরটি কাজ করবে। তবে পজিশনের জন্য প্রক্সি হিসাবে ধারক প্রকারগুলি তৈরি করা কুডেজ এবং এড়ানো উচিত।


6

এটি নিয়ে যাওয়ার কয়েকটি উপায় রয়েছে তবে আপনার যদি কেবলমাত্র একটি ভিউহোল্ডার থাকে তবে একাধিক বিন্যাস আপনি এই পদ্ধতিকে নিতে পারেন।

GetItemViewType ওভাররাইড করুন এবং অবস্থানের বা অবজেক্টের ডেটার ধরণের ভিত্তিতে ভিউ টাইপ নির্ধারণ করার জন্য এটিকে কিছু যুক্তি দিন (আমার অবজেক্টে আমার একটি getType ফাংশন রয়েছে)

@Override
public int getItemViewType(int position) {
    return data.get(position).getType;
}

ভিউটাইপের ভিত্তিতে অনক্রিটভিউতে যথাযথ বিন্যাসটি ফিরিয়ে দিন (ভিউহোল্ডার শ্রেণিতে ভিউয়ের ধরণটি পাস করার বিষয়টি নিশ্চিত করুন।

@Override
public AppListItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    mContext = parent.getContext();

    if (viewType == 0){
        return new AppListItemHolder(LayoutInflater.from(mContext).inflate(R.layout.layout, parent, false), viewType);
    else
        return new AppListItemHolder(LayoutInflater.from(mContext).inflate(R.layout.header, parent, false), viewType);
    }
}

ভিউ টাইপ পাবলিক স্ট্যাটিক ক্লাস অ্যাপলিস্টিমেটহোল্ডার রিসাইক্লার ভিউ.ভিউহোল্ডার প্রসারিত উপর ভিত্তি করে বিভিন্ন বিন্যাসের সামগ্রীর দর্শন পান Get

    public AppListItemHolder (View v, int viewType) {
        super(v);

        if (viewType == 0)
            ... get your views contents
        else
            ... get other views contents
        }
    }
}

এবং তারপরে আপনার আইটেম টাচহেল্পারে ভিউটাইপের ভিত্তিতে ক্রিয়াগুলি পরিবর্তন করুন। আমার জন্য এটি একটি পুনর্ব্যবহারযোগ্য বিভাগের শিরোনাম স্যুইপিং অক্ষম করে

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder.getItemViewType() == 1) return 0;
        return super.getSwipeDirs(recyclerView, viewHolder);
    }
}

চমৎকার ধারণা কিন্তু getItemViewType চূড়ান্ত
টিম

3

অনক্রিটভিউহোল্ডার পদ্ধতিতে রিসাইক্লারভিউতে প্রথমে প্রতিটি ভিউহোল্ডার প্রকারের জন্য ট্যাগ সেট করুন যেমন নীচের কোড:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    if(ITEM_TYPE_NORMAL == viewType) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.deposite_card_view, viewGroup, false);
        ItemViewHolder holder = new ItemViewHolder(context, v);
        holder.itemView.setTag("normal");
        return holder;
    } else {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_header, viewGroup, false);
        HeaderViewHolder holder = new HeaderViewHolder(context, v);
        holder.itemView.setTag("header");
        return holder;
    }
} 

তারপরে আইটেম টাচহেলপার.ক্যালব্যাক বাস্তবায়ন, নীচের মত getMovementFlags পদ্ধতি আপডেট করুন:

public class SwipeController extends ItemTouchHelper.Callback {

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if("normal".equalsIgnoreCase((String) viewHolder.itemView.getTag())) {
        return makeMovementFlags(0, LEFT | RIGHT);
    } else {
        return 0;
    }
}

শেষে রিসাইক্লার ভিউতে সংযুক্ত করুন:

final SwipeController swipeController = new SwipeController();

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(swipeController);
    itemTouchHelper.attachToRecyclerView(recyclerView);

2

@ রাফায়েল টলেডো উত্তর ছাড়াও, আপনি যদি অ্যাডাপ্টারে অবজেক্টে অবস্থান বা ডেটার ধরণের উপর ভিত্তি করে নির্দিষ্ট সোয়াইপ অঙ্গভঙ্গি যেমন লেফটি সোয়াইপ বা ডানদিকে সোয়াইপ মুছে ফেলতে চান তবে আপনি এটি করতে পারেন।

@Override
  public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
       {
          int position = viewHolder.getAdapterPosition();
          ConversationDataModel conversationModel = null;
          conversationModel = mHomeAdapter.getItems().get(position);
          boolean activeChat = true;
          if(conversationModel!=null && !conversationModel.isActive())
           {
             activeChat = false;
           }
  return activeChat ? super.getSwipeDirs(recyclerView, viewHolder): ItemTouchHelper.RIGHT;
        }

এখানে আমার ক্ষেত্রে, আমার পুনর্ব্যবহারযোগ্য দৃশ্যে আমি চ্যাট কথোপকথনগুলি লোড করছি এবং এটিতে প্রতিটি আইটেমের উপর অধিকার (আর্কাইভের জন্য) এবং বামদিকের (বাহির জন্য) সোয়াইপ অঙ্গভঙ্গি রয়েছে। তবে যদি কথোপকথনটি সক্রিয় না হয় তবে আমাকে পুনর্ব্যবহারকারী দৃশ্যে নির্দিষ্ট আইটেমটির জন্য ডানদিকে সোয়াইপ অক্ষম করতে হবে।

তাই আমি অনুসন্ধান করছি activeChatএবং সেই অনুযায়ী এবং ডানদিকে সোয়াইপ অক্ষম করেছি।


2

এটি ব্যবহার করে অক্ষম করা যেতে পারে ItemTouchHelper.ACTION_STATE_IDLE

ItemTouchHelper.SimpleCallback(
    ItemTouchHelper.UP or ItemTouchHelper.DOWN, //drag directions
    ItemTouchHelper.ACTION_STATE_IDLE //swipe directions
)
val touchHelperCallback = object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.ACTION_STATE_IDLE) {
    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
        (recyclerView.adapter as MyAdapter).onItemMove(viewHolder.adapterPosition, target.adapterPosition)
        return true
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        return
    }

}
val touchHelper = ItemTouchHelper(touchHelperCallback)
touchHelper.attachToRecyclerView(recyclerViewX)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.