[英]How to handle large amount of data in list view?
我正在尝试实现一个列表视图来从数据库中获取记录。 如果记录较少,那么加载没有问题。 但是如果有 300 条记录,加载需要更多时间,如果用户执行一些操作,如滚动等,它会崩溃。 现在我希望我的列表视图首先获取 10 条记录。成功获取 10 条记录后,下 10 条记录应该在滚动时加载。这样所有记录都应该被加载而不会挂起。 怎么做?
public class CustomAdapterWishlist extends BaseAdapter {
private List<Model> filteredData = null;
private LayoutInflater mInflater;
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private Activity i;
public CustomAdapterWishlist(Context context, List<Model> data, Activity i) {
this.filteredData = data ;
mInflater = LayoutInflater.from(context);
this.i=i;
}
@Override
public int getCount() {
int i;
if(filteredData == null) {
i = 0;
}
else {
i = filteredData.size();
}
return i;
}
@Override
public Object getItem(int i) {
return filteredData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
class ViewHolder {
TextView name;
//TextView date;
TextView price;
TextView quantity;
TextView barcode;
TextView description;
TextView image_path;
ImageView image;
Button btn;
LinearLayout layout;
TextView productId,pricerange;
}
ViewHolder holder;
@SuppressLint({"ViewHolder", "InflateParams"})
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
holder= new ViewHolder();
//===================initializing identitifiers===============//
convertView = mInflater.inflate(R.layout.row_search_iteam_wishlist, null);
holder = new ViewHolder();
holder.name = convertView.findViewById(R.id.name);
holder.price = convertView.findViewById(R.id.price);
holder.quantity = convertView.findViewById(R.id.quantity);
holder.barcode = convertView.findViewById(R.id.barcode);
holder.image_path = convertView.findViewById(R.id.image_path);
holder.image = convertView.findViewById(R.id.image);
holder.description = convertView.findViewById(R.id.description);
holder.btn = convertView.findViewById(R.id.btn);
holder.layout = convertView.findViewById(R.id.layout);
holder.productId = convertView.findViewById(R.id.productId);
holder.pricerange = convertView.findViewById(R.id.pricerange);
convertView.setTag(holder);
//======================== setting values for listview cell====================//
holder.name.setText(filteredData.get(position).getName());
holder.price.setText(filteredData.get(position).getPrice());
holder.description.setText(filteredData.get(position).getDescription());
holder.productId.setText(filteredData.get(position).getProductId());
holder.quantity.setText(filteredData.get(position).getQuantity());
holder.barcode.setText(filteredData.get(position).getBarcode());
holder.image_path.setText(filteredData.get(position).getImage_path());
holder.pricerange.setText(filteredData.get(position).getminmax());
final String user_id;
FirebaseAuth mAuth = FirebaseAuth.getInstance();
user_id = mAuth.getUid();
final String flag = "2";
//========================for deleting a product in whishlist=================
holder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final Animation myAnim = AnimationUtils.loadAnimation(i, R.anim.bounce);
holder.btn.startAnimation(myAnim);
db.collection("Wishlist").document(user_id).collection("ProductList")
.document(filteredData.get(position).getProductId()).delete()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(i,"item deleted", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(i,whishlist.class);
i.startActivity(intent);
}
});
}
});
// onclicks for layouts
holder.layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(i,Details.class);
intent.putExtra("productId",filteredData.get(position).getProductId());
intent.putExtra("Flag",flag);
((Global)i.getApplication()).setProductId(filteredData.get(position).getProductId());
i.startActivity(intent);
}
});
// downloading image //
//Glide.with(this.i).load(filteredData.get(position).getImage_path()).into(holder.image);
try{
Picasso.with(this.i) //Context
.load(filteredData.get(position).getImage_path()) //URL/FILE
.fit()
.into(holder.image);//an ImageView Object to show the loaded image;
}
catch (Exception ignored){
}
return convertView;
}
}
1) 创建 search_menu.xml 文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_launcher_background"
android:title="Поиск"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"/>
</menu>
2) 在 Activity 覆盖方法 onCreateOptionsMenu 中
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search_menu, menu);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
searchView.setOnQueryTextListener(this);
return true;
}
3) 在您的活动中实现接口 SearchView.OnQueryTextListener
public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
}
要使用 Circular Reveal 实现 WhatsApp Material SearchView,您可以通过两种方式实现:
首先创建一个具有 SearchView 设计的 xml。
搜索文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar android:id="@+id/searchtoolbar"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
app:collapseIcon="@drawable/ic_arrow_back"
app:titleTextColor="@color/colorPrimary"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorTextPrimary"/>
接下来,另一个用于工具栏设计的 xml。
工具栏.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
app:titleTextColor="@color/colorTextPrimary"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"/>
使用以下方法将它们都包含在您的活动中:
<include layout="@layout/toolbar"/>
<include layout="@layout/search"
android:visibility="gone"/>
Java代码:
public class SearchViewActivity extends AppCompatActivity {
Toolbar toolbar, searchtollbar;
Menu search_menu;
MenuItem item_search;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setSearchtollbar();
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu_home, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_status:
Toast.makeText(this, "Something", Toast.LENGTH_SHORT).show();
return true;
case R.id.action_search:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
circleReveal(R.id.searchtoolbar,1,true,true);
else
searchtollbar.setVisibility(View.VISIBLE);
item_search.expandActionView();
return true;
case R.id.action_settings:
Toast.makeText(this, "Home Settings Click", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void setSearchtollbar()
{
searchtollbar = (Toolbar) findViewById(R.id.searchtoolbar);
if (searchtollbar != null) {
searchtollbar.inflateMenu(R.menu.menu_search);
search_menu=searchtollbar.getMenu();
searchtollbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
circleReveal(R.id.searchtoolbar,1,true,false);
else
searchtollbar.setVisibility(View.GONE);
}
});
item_search = search_menu.findItem(R.id.action_filter_search);
MenuItemCompat.setOnActionExpandListener(item_search, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
circleReveal(R.id.searchtoolbar,1,true,false);
}
else
searchtollbar.setVisibility(View.GONE);
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true;
}
});
initSearchView();
} else
Log.d("toolbar", "setSearchtollbar: NULL");
}
public void initSearchView()
{
final SearchView searchView =
(SearchView) search_menu.findItem(R.id.action_filter_search).getActionView();
// Enable/Disable Submit button in the keyboard
searchView.setSubmitButtonEnabled(false);
// Change search close button image
ImageView closeButton = (ImageView) searchView.findViewById(R.id.search_close_btn);
closeButton.setImageResource(R.drawable.ic_close);
// set hint and the text colors
EditText txtSearch = ((EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text));
txtSearch.setHint("Search..");
txtSearch.setHintTextColor(Color.DKGRAY);
txtSearch.setTextColor(getResources().getColor(R.color.colorPrimary));
// set the cursor
AutoCompleteTextView searchTextView = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
try {
Field mCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
mCursorDrawableRes.setAccessible(true);
mCursorDrawableRes.set(searchTextView, R.drawable.search_cursor);
} catch (Exception e) {
e.printStackTrace();
}
}
// This sets the Circular Reveal Animation in the Search Bar
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void circleReveal(int viewID, int posFromRight, boolean containsOverflow, final boolean isShow)
{
final View myView = findViewById(viewID);
int width=myView.getWidth();
if(posFromRight>0)
width-=(posFromRight*getResources().getDimensionPixelSize(R.dimen.abc_action_button_min_width_material))-(getResources().getDimensionPixelSize(R.dimen.abc_action_button_min_width_material)/ 2);
if(containsOverflow)
width-=getResources().getDimensionPixelSize(R.dimen.abc_action_button_min_width_overflow_material);
int cx=width;
int cy=myView.getHeight()/2;
Animator anim;
if(isShow)
anim = ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0,(float)width);
else
anim = ViewAnimationUtils.createCircularReveal(myView, cx, cy, (float)width, 0);
anim.setDuration((long)220);
// make the view invisible when the animation is done
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if(!isShow)
{
super.onAnimationEnd(animation);
myView.setVisibility(View.INVISIBLE);
}
}
});
// make the view visible and start the animation
if(isShow)
myView.setVisibility(View.VISIBLE);
// start the animation
anim.start();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.