成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Android中怎么實現(xiàn)可拖拽列表和多選功能

Android中怎么實現(xiàn)可拖拽列表和多選功能,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

創(chuàng)新互聯(lián)公司主營馬村網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,手機APP定制開發(fā),馬村h5微信小程序開發(fā)搭建,馬村網(wǎng)站營銷推廣歡迎馬村等地區(qū)企業(yè)咨詢

主窗口JAVA代碼

/** * 編輯狀態(tài)下長按拖動條目 * 1.通過ItemTouchHelper.Callback實現(xiàn)長按拖動 * 2.通過isEditable的值判斷是否編輯狀態(tài),初值是false * 3.切換編輯狀態(tài)要把isEditable的值取反,并改變復選框圖標狀態(tài) * 4.在編輯狀態(tài)下,按返回鍵回到非編輯狀態(tài) * 5.RecyclerView的點擊事件通過RecyclerAdapter.Callback實現(xiàn) */public class ReportListActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "ReportListActivity"; @BindView(R.id.tv_title_middle) TextView title; @BindView(R.id.title_left) ImageView backButton; @BindView(R.id.online_report_listview) RecyclerView mRecyclerView; @BindView(R.id.edit_tv) TextView edit; @BindView(R.id.filter_tv) TextView filter; @BindView(R.id.btn_delete) TextView delete; @BindView(R.id.btn_release) TextView release; @BindView(R.id.btn_close) TextView close; @BindView(R.id.btn_top) TextView top; @BindView(R.id.toolbar) LinearLayout mToolbar; private Context mContext; private boolean isEditable; private RecyclerAdapter mAdapter; private List<ClsOnlineReport> mClsOnlineReportList; private ItemTouchHelper itemTouchHelper; @Override protected void onCreate(@Nullable Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_online_report);  ButterKnife.bind(this);  initView();  initData();  initListener(); } private void initData() {  mContext = this;  mClsOnlineReportList = new ArrayList<>();  mAdapter = new RecyclerAdapter(mClsOnlineReportList);  mRecyclerView.setAdapter(mAdapter);  getOfflineData(20);  //初始狀態(tài)為非編輯模式  setIsEditable(false);  //初始化拖動接口  OnlineReportListCallback callback = new OnlineReportListCallback(mAdapter);  itemTouchHelper = new ItemTouchHelper(callback);  //初始狀態(tài)為不可拖動  setRecyclerViewDraggable(false); } //生成模擬數(shù)據(jù) private void getOfflineData(int num) {  List<ClsOnlineReport> clsOnlineReportList = new ArrayList<>();  for (int i = 0; i < num; i++) {   ClsOnlineReport onlineReport = new ClsOnlineReport();   onlineReport.setActiveDate("activeDate " + i);   onlineReport.setAutoCloseDate("autoCloseDate " + i);   onlineReport.setBulletinID("bulletinID " + i);   onlineReport.setBulletinTime("bulletinTime " + i);   onlineReport.setBulletinTitle("bulletinTitle " + i);   onlineReport.setCreater("creater " + i);   clsOnlineReportList.add(onlineReport);  }  mClsOnlineReportList.addAll(clsOnlineReportList);  mAdapter.notifyDataSetChanged(); } private void initView() {  title.setText("可拖拽列表");  edit.setVisibility(View.VISIBLE);  mToolbar.setVisibility(View.GONE);  //設置RecyclerView的布局  mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext)); } private void initListener() {  filter.setOnClickListener(this);  backButton.setOnClickListener(this);  edit.setOnClickListener(this);  delete.setOnClickListener(this);  release.setOnClickListener(this);  close.setOnClickListener(this);  top.setOnClickListener(this);  mAdapter.setmCallback((v, position) -> {   switch (v.getId()) {    case R.id.view_parent_1:    case R.id.view_parent_2:     ClsOnlineReport clsOnlineReport = mClsOnlineReportList.get(position);     //在編輯模式下,點擊條目切換顯示checkbox,并且判斷選中條目的數(shù)量,     if (getIsEditable()) {      if (clsOnlineReport.getIsCheckBoxVisible()) {       clsOnlineReport.setIsChecked(!clsOnlineReport.getIsChecked());       mAdapter.notifyDataSetChanged();      }      for (int i = 0; i < mClsOnlineReportList.size(); i++) {       //數(shù)量等于0,隱藏工具條,否則顯示工具條       ClsOnlineReport onlineReport = mClsOnlineReportList.get(i);       if (onlineReport.getIsChecked()) {        mToolbar.setVisibility(View.VISIBLE);        break;       }       if (i == mClsOnlineReportList.size() - 1) {        mToolbar.setVisibility(View.GONE);       }      }     } else {      //在非編輯模式下,點擊條目直接跳轉(zhuǎn)詳情頁,并把bulletinID傳過去      Intent intent = new Intent(mContext, ReportDetailActivity.class);      intent.putExtra("bulletinID", clsOnlineReport.getBulletinID());      startActivityForResult(intent, 16371);     }   }  }); } @Override public void onBackPressed() {  //編輯狀態(tài)下,按返回鍵回到非編輯狀態(tài),否則退出  if (getIsEditable()) {   switchEditable();  } else {   finish();  } } @Override public void onClick(View v) {  //編輯狀態(tài)下,按返回鍵回到非編輯狀態(tài),否則退出  if (v.getId() == R.id.title_left) {   if (getIsEditable()) {    switchEditable();   } else {    finish();   }  }  //點擊編輯按鈕切換編輯狀態(tài)  if (v.getId() == R.id.edit_tv) {   switchEditable();  }  //工具條的按鈕對應不同的接口  switch (v.getId()) {   case R.id.btn_top:   case R.id.btn_close:   case R.id.btn_release:   case R.id.btn_delete:    Toast.makeText(mContext, "在此處調(diào)用接口", Toast.LENGTH_SHORT).show();  } } private void switchEditable() {  //將屬性取反  setIsEditable(!getIsEditable());  //遍歷列表并賦值  for (ClsOnlineReport clsOnlineReport : mClsOnlineReportList) {   clsOnlineReport.setIsCheckBoxVisible(getIsEditable());   clsOnlineReport.setIsChecked(false);  }  //通知適配器刷新  mAdapter.notifyDataSetChanged();  //隱藏工具條  mToolbar.setVisibility(View.GONE);  //切換拖動狀態(tài)  setRecyclerViewDraggable(getIsEditable()); } public boolean getIsEditable() {  return isEditable; } public void setIsEditable(boolean isEditable) {  this.isEditable = isEditable; } //設置能否拖動 private void setRecyclerViewDraggable(boolean draggable) {  if (draggable) {   itemTouchHelper.attachToRecyclerView(mRecyclerView);  } else {   itemTouchHelper.attachToRecyclerView(null);  } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {  //當詳情頁的數(shù)據(jù)有變動則刷新列表  if (requestCode == 16371 && resultCode == RESULT_OK) {   refreshData();  }  super.onActivityResult(requestCode, resultCode, data); } private void refreshData() {  Toast.makeText(mContext, "在此處調(diào)用接口", Toast.LENGTH_SHORT).show(); }}

適配器代碼

/** * 可拖拽列表的適配器, * 1.需要實現(xiàn)OnlineReportListCallback.ItemTouchMoveListener * 2.持有一個接口用于傳遞position */public class RecyclerAdapter extends RecyclerView.Adapter implements OnlineReportListCallback.ItemTouchMoveListener, View.OnClickListener { private List<ClsOnlineReport> mList; private Callback mCallback; public RecyclerAdapter(List<ClsOnlineReport> mList) {  this.mList = mList; } public void setmCallback(Callback mCallback) {  this.mCallback = mCallback; } @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {  LayoutInflater inflater = LayoutInflater.from(parent.getContext());  View v = inflater.inflate(R.layout.item_report_list, parent, false);  return new ItemHolder(v); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {  ClsOnlineReport clsOnlineReport = mList.get(position);  ItemHolder itemHolder = (ItemHolder) holder;  if (clsOnlineReport.getIsCheckBoxVisible()) {   itemHolder.checkbox.setVisibility(View.VISIBLE);   itemHolder.drag.setVisibility(View.VISIBLE);  } else {   itemHolder.checkbox.setVisibility(View.GONE);   itemHolder.drag.setVisibility(View.GONE);  }  if (clsOnlineReport.getIsChecked()) {   itemHolder.checkbox.setImageResource(R.drawable.ic_check_box_black_24dp);  } else {   itemHolder.checkbox.setImageResource(R.drawable.ic_check_box_outline_blank_black_24dp);  }  itemHolder.parent1.setTag(position);  itemHolder.parent2.setTag(position);  itemHolder.parent1.setOnClickListener(this);  itemHolder.parent2.setOnClickListener(this);  itemHolder.time.setText(clsOnlineReport.getBulletinTime());  itemHolder.title.setText(clsOnlineReport.getBulletinTitle());  itemHolder.author.setText(clsOnlineReport.getCreater()); } @Override public int getItemCount() {  return mList.size(); } @Override public boolean onItemMove(int fromPosition, int toPosition) {  Collections.swap(mList, fromPosition, toPosition);  notifyItemMoved(fromPosition, toPosition);  return true; } class ItemHolder extends RecyclerView.ViewHolder {  @BindView(R.id.online_report_time)  TextView time;  @BindView(R.id.online_report_title)  TextView title;  @BindView(R.id.online_report_author)  TextView author;  @BindView(R.id.online_report_drag)  ImageView drag;  @BindView(R.id.online_report_checkbox)  ImageView checkbox;  @BindView(R.id.view_parent_1)  LinearLayout parent1;  @BindView(R.id.view_parent_2)  LinearLayout parent2;  ItemHolder(View itemView) {   super(itemView);   ButterKnife.bind(this, itemView);  } } @Override public void onClick(View v) {  mCallback.onClick(v, (int) v.getTag()); } public interface Callback {  void onClick(View v, int position); }}

需要實現(xiàn)的接口

/** * 用來完成RecyclerView長按拖拽的關鍵接口 * 1.getMovementFlags里面表示設置為上下拖動 * 2.onSelectedChanged里面表示拖動狀態(tài)下改變背景色,拖動完成后恢復背景色 * 3.拖動完成的時候viewHolder的值為空?。?!所以要用srcHolder */public class OnlineReportListCallback extends ItemTouchHelper.Callback { private ColorDrawable drawable; private RecyclerView.ViewHolder srcHolder; public interface ItemTouchMoveListener {  boolean onItemMove(int fromPosition, int toPosition); } private ItemTouchMoveListener moveListener; public OnlineReportListCallback(ItemTouchMoveListener moveListener) {  this.moveListener = moveListener;  int rgb = Color.rgb(0xff, 0xff, 0xff);  drawable = new ColorDrawable(rgb); } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {  int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;  return makeMovementFlags(dragFlags, ItemTouchHelper.ACTION_STATE_IDLE); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder srcHolder, RecyclerView.ViewHolder targetHolder) {  this.srcHolder = srcHolder;  return srcHolder.getItemViewType() == targetHolder.getItemViewType() && moveListener.onItemMove(srcHolder.getAdapterPosition(), targetHolder.getAdapterPosition()); } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {  super.onSelectedChanged(viewHolder, actionState);  if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {   viewHolder.itemView.setBackground(null);  }  if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) {   srcHolder.itemView.setBackground(drawable);  } }}

圖片使用Android Studio內(nèi)置的SVG,引入了ButterKnife綁定控件,另外內(nèi)部類使用了lambda表達式折疊了,重點說一下RecyclerAdapter.Callback,這個接口的內(nèi)部方法 void onClick(View v, int position) 是在View.OnClickListener的void onClick(View v)的基礎上多傳了一個參數(shù),這個參數(shù)是放在tag里面的,其他難點注釋里面都有

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

網(wǎng)站標題:Android中怎么實現(xiàn)可拖拽列表和多選功能
網(wǎng)頁鏈接:http://jinyejixie.com/article38/ppeopp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司、、營銷型網(wǎng)站建設外貿(mào)建站、自適應網(wǎng)站、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設
遂昌县| 陵川县| 东兰县| 大余县| 手机| 杭锦后旗| 洛川县| 嫩江县| 岳西县| 洞口县| 大理市| 海南省| 潜江市| 孟津县| 孟津县| 五原县| 清水县| 溆浦县| 卢氏县| 宜兴市| 忻州市| 布拖县| 泰兴市| 元阳县| 六安市| 米脂县| 临沭县| 云龙县| 板桥市| 永泰县| 醴陵市| 金塔县| 伊通| 额济纳旗| 遂宁市| 高陵县| 仪陇县| 孝感市| 庆云县| 望奎县| 永济市|