首页 > recyclerview的setadapter方法不起作用

recyclerview的setadapter方法不起作用

本意是通过点击事件更新嵌套在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却不行。。。

【热门文章】
【热门文章】