标签: android-recyclerview

RecyclerView | 最快的smoothScrollToPosition动画

问题是基于真实场景,我简化了用例:

假设我们有一个带有0到999之间值的微调器和循环视图.另外,对于常规的回收者滑动选项,用户也可以从微调器中选择一个数字,并且回收器将滚动到索引.

问题:当当前页面和新的微调器值之间的差值很大时,滚动视图需要花费大量时间(例如,我们在位置0,现在用户从微调器400中选择).

下面是代码(项目布局仅包含textview):

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    Spinner spinner;
    List<Integer> items = new ArrayList<>();
    ItemAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // init "database"
        for (int i = 0; i < 1000; i++)
            items.add(i);

        // Spinner
        spinner = (Spinner) findViewById(R.id.spinner);
        final ArrayAdapter<Integer> spinnerAdapter = new ArrayAdapter<Integer>(this, R.layout.support_simple_spinner_dropdown_item, items);
        spinner.setAdapter(spinnerAdapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                recyclerView.smoothScrollToPosition(i);
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) …
Run Code Online (Sandbox Code Playgroud)

android android-animation recycler-adapter android-recyclerview

0
推荐指数
1
解决办法
3975
查看次数

RecyclerView保证金

我正在开发家庭安全应用程序.必须实现的功能之一是能够查看连接的设备(用于发送通知,阻止访问等).到目前为止,我已经能够创建设备的RecyclerView列表,一切都很完美(对我来说),除了这个列表中的卡片之间没有间距.


它现在看起来如何

在此输入图像描述


device_data_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cardview="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_margin="8dp">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="80dp">

<ImageView
    android:id="@+id/deviceIcon"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:scaleType="centerCrop"
    android:layout_marginLeft="8dp" />

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="80dp"
    android:layout_alignBottom="@+id/deviceIcon"
    android:layout_toEndOf="@+id/deviceIcon">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Username"
        android:id="@+id/deviceUsername"
        android:layout_gravity="center_vertical"
        android:textColor="#000000"
        android:layout_marginLeft="5dp" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_gravity="center_vertical"
        android:gravity="center_vertical|center_horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="25dp"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:text="Device Model"
            android:gravity="center_vertical|right"
            android:textColor="#000000"
            android:id="@+id/deviceModel"
            android:layout_marginLeft="5dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="25dp"
            android:textColor="#000000"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:text="Device Version"
            android:gravity="center_vertical|right"
            android:id="@+id/deviceVersion"
            android:layout_marginLeft="5dp" />
    </LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)


devices_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/activity_vertical_margin">

    <view
        android:id="@+id/connectedDevicesList" …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview recyclerview-layout

0
推荐指数
1
解决办法
871
查看次数

Recyclerview在更新时移至底部

嗨,iam创建了一个聊天应用程序。应用程序工作正常。但是,无论何时(通过后台服务)接收到新消息(例如通过更新recylerview),用户都必须向下滚动才能看到新消息。

我想做的是,每当收到新消息时,我都想更新recyclerview并滚动到底部。因此用户无需滚动即可看到最后收到的消息。

聊天活动

public class Chatting extends AppCompatActivity {


    private DrawerLayout drawerLayout;
    private ApplicationEnvironmentURL applicationEnvironment;
    private Toolbar toolbar;
    private SelectVisitorService mService = new SelectVisitorService();
    private boolean mBound = false;
    public static Context baseContext;

    private static String  uniqueID;
    public static ChattingAdapter mAdapter ;
    public static List<ChattingItomObject> messageItems = new ArrayList<ChattingItomObject>();
    private RecyclerView recyclerView;

    public String ProfileId;
    public String profileToken;
    public String CompanyID;
    public String DisplayName;

    public String visitor_id;
    public String visitor_name;

    private EditText chat_message;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); …
Run Code Online (Sandbox Code Playgroud)

java xml android android-recyclerview

0
推荐指数
1
解决办法
952
查看次数

如何在recyclerview中添加聊天日期?

我试图弄清楚要在聊天中创建日期列表项的方式,以显示消息所属的日期。

该列表如下所示:

--- 1 week ago ---
msg
msg
msg
msg
msg
----- today -----
msg 
msg 
msg
msg
Run Code Online (Sandbox Code Playgroud)

我可以做到的一种方法是创建日期时间列表项,然后使用某种逻辑来确定日期时间列表项应位于哪个位置。

我以为可能可以创建一个自定义列表分隔符来显示日期,但是我不确定是否可行。

你们将如何处理?

java android android-recyclerview

0
推荐指数
1
解决办法
1151
查看次数

为什么我的StaggeredGrid RecyclerView布局每个项目,而不仅仅是可见的?

我有一个包含370个项目的交错网格,带有图像.

我想确保快速回收物品以注意内存,但是创建ViewHolder然后绑定到适配器中的每个项目,并且不关注子项是否可见

我尝试了以下内容

StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
rv.setLayoutManager(lm);

rv.setItemViewCacheSize(20); //Has no effect

RecyclerView.RecycledViewPool pool = new RecyclerView.RecycledViewPool();
pool.setMaxRecycledViews(0, 20);
rv.setRecycledViewPool(pool); //also has no effect
Run Code Online (Sandbox Code Playgroud)

日志显示onCreateViewHolder和onBindViewHolder每次调用185次.然后在恢复对onCreateViewHolder的调用之前调用onViewRecycled 185次,直到我们达到完整的370.

这对我来说可能是一个理解问题,但我认为RecyclerView应该只绑定那些可见的视图,或者仅仅支持20个视图,或者20个池中的20个,但是很多适合屏幕.如何使用StaggeredGridLayoutManager实现此目的?

如果我听滚动更改并使用findFirstCompletelyVisibleItemPositions和findLastCompletelyVisibleItemPositions,这仍然跨越适配器中的每一项,而不仅仅是适合屏幕的6项

我的适配器代码

class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

    static final int NUM_COLS = 3;
    private final LayoutInflater mInflater;
    private final List<GridItem> mEntries;
    private int mLastExpanded; //stores where the last expanded item was
    private OnCardClickListener mOnItemClick;

    MyAdapter(Context context) {
        super();
        mEntries = new ArrayList<>();
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    void setOnTileClickListener(@Nullable OnCardClickListener listener) …
Run Code Online (Sandbox Code Playgroud)

android layout-manager staggeredgridlayout android-recyclerview

0
推荐指数
1
解决办法
982
查看次数

使用搜索视图搜索后,adapter.notifyDataSetChanged不起作用

我有一个搜索视图,可以过滤回收者视图项目;它可以正确过滤项目,但是当我关闭搜索视图时notifyDataSetChanged,例如,如果我将新项目添加到回收站视图中,直到我关闭该应用程序并再次打开它,我的适配器将无法工作。这是我用于过滤项目的代码。

public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {
    if (TextUtils.isEmpty(newText)){
        adapter.resetList(userData.GetAllWords(user.getId()));
    } else {
        final ArrayList<Word> filteredModelList = filter(wordlist, newText);
        adapter.setfilter(filteredModelList);
    }
    return false;
}

private ArrayList<Word> filter(ArrayList<Word> wordlistt, String query) {
    query = query.toLowerCase();
    final ArrayList<Word> filteredModelList = new ArrayList<>();
    for (Word myword : wordlistt) {
        if (myword.getWord().contains(query) || myword.getTranslation().contains(query)) {
            filteredModelList.add(myword);
        }
    }
    return filteredModelList;
}
Run Code Online (Sandbox Code Playgroud)

这是我在适配器中的代码

public void setfilter(ArrayList<Word> filteredwordlist) {
    wordlist = new ArrayList<>();
    wordlist.addAll(filteredwordlist);
    notifyDataSetChanged();
} …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview

0
推荐指数
1
解决办法
1084
查看次数

在Recyclerview(GridLayoutManager)末尾显示更多类别按钮,如grofers app

Grofers应用程序图像

在此输入图像描述

我想在6个项目之后添加一个显示更多类别按钮recyclerview,onclick其中显示剩余项目和底部显示隐藏按钮

android android-recyclerview

0
推荐指数
1
解决办法
1354
查看次数

如何更新recyclerview中的单个项目?

我正在尝试使用以下代码段更新recyclerview项目.

public void setItemToPostion(WatchListEpisodeBean watchListBean, int itemPosition) {
    this.watchListBean.add(itemPosition, watchListBean);
    notifyItemChanged(itemPosition);
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.该位置的项目使用新数据更新.但问题是项目克隆到下一个位置(出现在下一个位置).我没有发现我的代码有什么问题.

这是appcompat和支持设计lib版本:

compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题.提前致谢.

android android-recyclerview

0
推荐指数
1
解决办法
6027
查看次数

RecyclerView Cardview项目背景颜色更改单击其项目时

我点击RecylerView项目时,我试图更改RecyclerView CardView背景的颜色(绿色),当我点击RecyclerView的下一个项目时,之前的项目必须更改/来到其原始颜色(粉红色),并选择项目颜色将变化,那就是绿色.有人能为我提供适当的解决方案.

Plss看到图像

我的课-:

public class RecylerAdapter extends  RecyclerView.Adapter<RecylerAdapter.ViewHolder>
{   private boolean isSelected;
    private final static int FADE_DURATION = 500;// milliseconds
    private int lastPosition = -1;
    Context cont;
  private  String[] strname;
    private int[] icon;
    public RecylerAdapter(Context con, String[] androidNames, int[] androidIcon)
    {   cont=con;
        strname=androidNames;
        icon=androidIcon;
    }
    class ViewHolder extends RecyclerView.ViewHolder
    {   private ImageView imgView;
        private TextView txtView;
        private CardView cardView;
        private SparseBooleanArray selectedItems = new SparseBooleanArray();

        public ViewHolder(final View itemView)
        {
            super(itemView);

            imgView = (ImageView) itemView.findViewById(R.id.imageView);
            txtView = (TextView) itemView.findViewById(R.id.txt); …
Run Code Online (Sandbox Code Playgroud)

android android-cardview android-recyclerview

0
推荐指数
1
解决办法
4487
查看次数

从Activity中显示/隐藏RecyclerView适配器中的按钮

我有一些RecyclerView带隐形按钮的项目,我想更改活动中的所有按钮可见性.像这样:

之前

单击

请帮我.

android android-adapter android-recyclerview

0
推荐指数
1
解决办法
2331
查看次数