问题是基于真实场景,我简化了用例:
假设我们有一个带有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
我正在开发家庭安全应用程序.必须实现的功能之一是能够查看连接的设备(用于发送通知,阻止访问等).到目前为止,我已经能够创建设备的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) 嗨,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) 我试图弄清楚要在聊天中创建日期列表项的方式,以显示消息所属的日期。
该列表如下所示:
--- 1 week ago ---
msg
msg
msg
msg
msg
----- today -----
msg
msg
msg
msg
Run Code Online (Sandbox Code Playgroud)
我可以做到的一种方法是创建日期时间列表项,然后使用某种逻辑来确定日期时间列表项应位于哪个位置。
我以为可能可以创建一个自定义列表分隔符来显示日期,但是我不确定是否可行。
你们将如何处理?
我有一个包含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
我有一个搜索视图,可以过滤回收者视图项目;它可以正确过滤项目,但是当我关闭搜索视图时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) 我正在尝试使用以下代码段更新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)
请帮我解决这个问题.提前致谢.
我点击RecylerView项目时,我试图更改RecyclerView CardView背景的颜色(绿色),当我点击RecyclerView的下一个项目时,之前的项目必须更改/来到其原始颜色(粉红色),并选择项目颜色将变化,那就是绿色.有人能为我提供适当的解决方案.
我的课-:
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) 我有一些RecyclerView带隐形按钮的项目,我想更改活动中的所有按钮可见性.像这样:


请帮我.