本意是通过点击事件更新嵌套在bottom sheet中recyclerview的itemText。但是setadapter方法却不能正常刷新,反而显示一片空白。。。试过很多办法,比如重新调用setLayoutManager、void run()等等都不行。Demo在BottomSheetSample的基础上略微修改
MainActivity.java
package com.nkdroid.bottomsheetsample; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomSheetBehavior; import android.support.design.widget.BottomSheetDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Button; import java.util.ArrayList; import java.util.List; import java.util.Random; public class MainActivity extends AppCompatActivity implements ItemAdapter.ItemListener { private Button btnView, btnDialog; BottomSheetBehavior behavior; private BottomSheetDialog mBottomSheetDialog; private ItemAdapter mAdapter; RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnView = (Button) findViewById(R.id.btnView); btnDialog = (Button) findViewById(R.id.btnDialog); btnView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mAdapter = new ItemAdapter(createItems()); recyclerView.setAdapter(mAdapter); behavior.setState(BottomSheetBehavior.STATE_EXPANDED); } }); btnDialog.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showBottomSheetDialog(); } }); View bottomSheet = findViewById(R.id.bottom_sheet); behavior = BottomSheetBehavior.from(bottomSheet); behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { // React to state change } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { // React to dragging events } }); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); mAdapter = new ItemAdapter(createItems(), this); recyclerView.setAdapter(mAdapter); } private void showBottomSheetDialog() { if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } mBottomSheetDialog = new BottomSheetDialog(this); View view = getLayoutInflater().inflate(R.layout.sheet, null); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(new ItemAdapter(createItems(), new ItemAdapter.ItemListener() { @Override public void onItemClick(Item item) { if (mBottomSheetDialog != null) { mBottomSheetDialog.dismiss(); } } })); mBottomSheetDialog.setContentView(view); mBottomSheetDialog.show(); mBottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { mBottomSheetDialog = null; } }); } @Override protected void onDestroy() { super.onDestroy(); mAdapter.setListener(null); } public List<Item> createItems() { Random r = new Random(); ArrayList<Item> items = new ArrayList<>(); items.add(new Item(R.mipmap.ic_launcher, "Item 1"+ r.nextInt(100))); items.add(new Item(R.mipmap.ic_launcher, "Item 2")); items.add(new Item(R.mipmap.ic_launcher, "Item 3")); items.add(new Item(R.mipmap.ic_launcher, "Item 4")); return items; } @Override public void onItemClick(Item item) { behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } }
ItemAdapter.java
package com.nkdroid.bottomsheetsample; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import java.util.List; public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> { private List<Item> mItems; private ItemListener mListener; public ItemAdapter(List<Item> items, ItemListener listener) { mItems = items; mListener = listener; } public ItemAdapter(List<Item> items) { mItems = items; } public void setListener(ItemListener listener) { mListener = listener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()) .inflate(R.layout.adapter, parent, false)); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.setData(mItems.get(position)); } @Override public int getItemCount() { return mItems.size(); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public ImageView imageView; public TextView textView; public Item item; public ViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(this); imageView = (ImageView) itemView.findViewById(R.id.imageView); textView = (TextView) itemView.findViewById(R.id.textView); } public void setData(Item item) { this.item = item; imageView.setImageResource(item.getDrawableResource()); textView.setText(item.getTitle()); } @Override public void onClick(View v) { if (mListener != null) { mListener.onItemClick(item); } } } public interface ItemListener { void onItemClick(Item item); } }
下图是第一次点击和第二次点击show view的截图
BottomSheetDialog能正常更新,常规的BottomSheet却不行。。。
付费偷看金额在0.1-10元之间
一周热门 更多>