- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想实现这种类型的 ListView 。问题是当我滚动列表时, View 得到刷新。任务是默认显示最多 3 个 child 的组,当单击“+”(加号)按钮时,该组的子项将展开,新按钮将显示在该组下方,用于将该组折叠为默认布局表示用加号('+')按钮显示 3 个子项目。当任何组的子项目超过 3 个时显示加号按钮,如果子项目小于 3 或等于 3,则所有子项目将显示没有加号按钮,但如果子项目大于 3,则将显示加号按钮。这里 'DIAPERS' 和 'LAUNDRY DETERGENT' 是组名。
当前场景:- 如果 child-position > 3,则将 TextView 可见性设置为“GONE”,将按钮可见性设置为“VISIBLE”。但问题是,如果子项超过 4 个并且我单击加号按钮展开组,则只会显示 4 个子项 5 或不显示下一个子项。
如果你想要这个代码,请在评论中询问,我会提供代码。
最佳答案
首先,您需要为可扩展 ListView 的 subview 设置一个最小限制。大约有 2 或 3 个 child 第一次从您的数据库或网络服务中下载或获取。然后在该限制变量上,您可以将可扩展 ListView 限制为仅显示前 2 个和第 3 个子项。
然后对于子限制变量,您还需要一个标志变量,其中包含诸如“如果列表中有超过 3 个 child 则值为 1,如果列表中有 3 个或少于三个 child 则为 0”之类的信息。
在flag变量的值上你可以设置plus button在android中隐藏和可见的值。
对于加号按钮,我认为下面给出的代码会有所帮助。单击时只需再次调用数据库并获取所有子项并显示它们并刷新可扩展 ListView 。
public class ProductListingExpandableAdapter extends BaseExpandableListAdapter {
public String TAG = ProductListingExpandableAdapter.class.getSimpleName();
private Context _context;int clickedPosition;
private List<String> _listDataHeader; // header titles child data in format of header title, child title
private HashMap<String, ArrayList<String>> _listDataChild;
ArrayList<String> CategoryId;
String stateId,countryID;
ArrayList<ProductDataBean> ProductList; ArrayList<ProductListingDisplayCheck> checkArrayList;
int _ListSize;String user_id;
ProductDataBean bean;
/* Variable to do lazy loading of images */
Handler handler;
Runnable runnable;
/* array list to hold data */
ArrayList<String> BrandList;
ImageLoader imageLoader;
private DisplayImageOptions options;
Activity a; String RetailerImageUrl,BrandImageUrl;
public ProductListingExpandableAdapter(Context context, List<String> listDataHeader, HashMap<String, ArrayList<String>> listChildData,
int size,ArrayList<ProductDataBean> ProductList,ArrayList<ProductListingDisplayCheck> checkArrayList,ArrayList<String> CategoryId, String user_id,String stateId,String countryID)
{
this._context = context;
this._listDataHeader = listDataHeader;
this._listDataChild = listChildData;
this.CategoryId = CategoryId;
this.checkArrayList = checkArrayList;
this._ListSize = size;
this.ProductList = ProductList;
this.checkArrayList = checkArrayList;
this.user_id = user_id;
this.countryID = countryID;
this.stateId = stateId;
options = new DisplayImageOptions.Builder()
.showImageForEmptyUrl(R.drawable.thumb_demo).cacheInMemory()
.cacheOnDisc().build();
imageLoader = ImageLoader.getInstance();
Log.d("....return the the event image loader class...==", ""+imageLoader.getClass());
}
@Override
public Object getChild(int groupPosition, int childPosititon)
{
//Log.i("Object getChild",String.valueOf(this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosititon)));
return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosititon);
}
@Override
public long getChildId(int groupPosition, int childPosition)
{
return childPosition;
}
@Override
public View getChildView(final int groupPosition, final int childPosition,boolean isLastChild, View convertView, ViewGroup parent)
{
final String childText = (String) getChild(groupPosition, childPosition);
if (convertView == null)
{
LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.custom_brand_retailer_layout_new, null);
}
RelativeLayout ParentLayout= (RelativeLayout) convertView.findViewById(R.id.parentLayout);
/* Retailer Image*/
ImageView retailerImage = (ImageView) convertView.findViewById(R.id.retailerImage);
/* Brand Image */
ImageView brandImage = (ImageView) convertView.findViewById(R.id.brandImage);
/* Product PricePerUnit */
TextView pricePerUnit = (TextView) convertView.findViewById(R.id.pricePerItem);
/* Product PricePerUnit */
TextView packetPrice = (TextView) convertView.findViewById(R.id.pricePerPacket);
/* Product Name */
TextView productName = (TextView) convertView.findViewById(R.id.ProductName);
/* Group close Images */
RelativeLayout addMore = (RelativeLayout) convertView.findViewById(R.id.addMore);
/* Minus Button Image */
ImageView minusItems = (ImageView) convertView.findViewById(R.id.minusItems);
/* Minus Button Image */
ImageView plusItems = (ImageView) convertView.findViewById(R.id.plusItems);
try {
JSONObject jObject = new JSONObject(childText); // Log.i("jObject",String.valueOf(jObject));
pricePerUnit.setText ("$"+jObject.getString("pricePerItem"));
packetPrice .setText ("$"+jObject.getString("product_price"));
String itemNameString = "";
String title = jObject.getString("product_name");
if (title.length() > 44)
{
itemNameString = title.substring(0, 45)+"...";
}
else
{ itemNameString = title;
}
productName.setText(itemNameString);
RetailerImageUrl = jObject.getString("retailer_image_url_small");
BrandImageUrl = jObject.getString("brand_image_url");
// String RetailerImageUrl = jObject.getString("pricePerItem");
} catch (JSONException e)
{
e.printStackTrace();
}
//=========================================================================================
// Log.e("Pagination ArrayList size", String.valueOf(Constants.PaginationPosition.size()));
String PaginationPos = Constants.PaginationPosition.get(groupPosition);
Log.e ("PaginationPos", String.valueOf(PaginationPos));
// Log.e("is last child", String.valueOf(isLastChild));
/* Hide or Show Group Close option */
Log.e("Pagination ArrayList size", String.valueOf(Constants.PaginationPosition.size()));
if(PaginationPos.equals("1") && childPosition == 2 && isLastChild == true )
{
addMore.setVisibility(View.VISIBLE); minusItems.setVisibility(View.GONE ); plusItems.setVisibility(View.VISIBLE);
}
else if(PaginationPos.equals("0") && childPosition > 2 && isLastChild == true )
{
addMore.setVisibility(View.GONE);
}
else if(PaginationPos.equals("2") && childPosition > 2 && isLastChild == true )
{
plusItems.setVisibility(View.GONE);
addMore.setVisibility (View.VISIBLE);
minusItems.setVisibility(View.VISIBLE);
minusItems.setVisibility(View.VISIBLE);
minusItems.setImageResource(R.drawable.minus);
}
else
{
addMore.setVisibility(View.GONE);
}
//==================================================================================
minusItems.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Constants.listDataHeader.get(groupPosition)", Constants.listDataHeader.get(groupPosition));
String keyword = Constants.listDataHeader.get(groupPosition);
String alternate = ProductListingExpandableListViewActivity.demoJsonObjectTesting;
// check whether the list for keyword is present
ArrayList<String> alternateList = _listDataChild.get(keyword);
if(alternateList == null)
{
Log.i(TAG, "list is null");
/* alternateList = new ArrayList<String>();
_listDataChild.put(keyword, alternateList); */
}
else
{
Constants.PaginationPosition.set(groupPosition, "1");
ArrayList<String> newList = new ArrayList<String>();
int size = alternateList.size();
Log.e("alternateList size", String.valueOf( alternateList.size()));
for(int i=0;i<3;i++)
{
newList.add(alternateList.get(i));
}
alternateList.clear();
for(int i=0;i<3;i++)
{
alternateList.add(newList.get(i));
}
Log.i("alternate list size",String.valueOf( alternateList.size()));
ProductListingExpandableAdapter.this.notifyDataSetChanged();
//ProductListingExpandableAdapter.this.notifyDataSetInvalidated();
/*Intent showSearchResult = new Intent(_context,ProductListingExpandableListViewActivity.class);
showSearchResult.putExtra("ShowSeachResult", "2");
_context.startActivity(showSearchResult);
((Activity)_context).finish();
Apply our splash exit (fade out) and main entry (fade in) animation transitions.
((Activity)_context). overridePendingTransition(R.anim.mainfadein, R.anim.splashfadeout);*/
}
}
});
addMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("addMore images list clicked", "addMore image clicked");
//Clicked postion of group
clickedPosition = groupPosition;
String keyword = Constants.listDataHeader.get(groupPosition);
Log.i("keyword", keyword);
for( int ii = 0;ii<Constants.listDataHeader.size();ii ++)
{
String currentKeyword = Constants.listDataHeader.get(ii);
if(currentKeyword.equals(keyword)==false)
{
// check whether the list for keyword is present
ArrayList<String> alternateList = _listDataChild.get(currentKeyword);
if(alternateList == null)
{
Log.i(TAG,Constants.listDataHeader.get(groupPosition)+ " List is null");
/*alternateList = new ArrayList<String>();
_listDataChild.put(keyword, alternateList); */
}
else
{
if(alternateList.size()>2)
{
Constants.PaginationPosition.set(ii, "1");
Log.i(TAG,Constants.listDataHeader.get(groupPosition)+ "inside else");
ArrayList<String> newList = new ArrayList<String>();
int size = alternateList.size();
Log.e("alternateList size", String.valueOf( alternateList.size()));
for (int i=0; i<3;i++)
{
newList.add(alternateList.get(i));
}
alternateList.clear();
for (int j=0; j<3; j++)
{
alternateList.add(newList.get(j));
}
Log.i("alternate list size",String.valueOf( alternateList.size()));
}}
}
}
/* Calling json webservices */
new LoadProductData(_context,groupPosition).execute();
}
});
/* Lazy loading class method for loading Retailer images */
imageLoader.init(ImageLoaderConfiguration.createDefault(_context));
if(RetailerImageUrl.equals("no image"))
{
retailerImage.setBackgroundResource(R.drawable.no_img);
}
else
{
imageLoader.displayImage(RetailerImageUrl,retailerImage,
options, new ImageLoadingListener() {
@Override
public void onLoadingComplete() {}
@Override
public void onLoadingFailed() {}
@Override
public void onLoadingStarted() {}
});
}
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT>=16)
{
if(BrandImageUrl.equals("no image")==false)
{
Drawable Branddrawable= Loadimage(BrandImageUrl);
brandImage.setBackground(Branddrawable);
}
}
else
{
if(BrandImageUrl.equals("no image")==false)
{
Drawable Branddrawable= Loadimage(BrandImageUrl);
brandImage.setBackgroundDrawable(Branddrawable);
}
}
return convertView;
}
@Override
public int getChildrenCount(int groupPosition)
{
return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
}
@Override
public Object getGroup(int groupPosition)
{
return this._listDataHeader.get(groupPosition);
}
@Override
public int getGroupCount()
{
return this._listDataHeader.size();
}
@Override
public long getGroupId(int groupPosition)
{
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent)
{
String headerTitle = (String) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate (R.layout.list_group, null);
}
TextView lblListHeader = (TextView) convertView.findViewById(R.id.lblListHeader);
lblListHeader.setTypeface (null, Typeface.BOLD);
lblListHeader.setText (headerTitle);
ExpandableListView mExpandableListView = (ExpandableListView) parent;
mExpandableListView.expandGroup(groupPosition);
return convertView;
}
@Override
public boolean hasStableIds()
{
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
// Background async task
/* State/Province list background thread */
class LoadProductData extends AsyncTask<Void, Void, Void> {
private ProgressDialog dialog;String response;
Context context;int GroupPos;
private JSONArray jsonarray, stateJsonArray;
public LoadProductData(Context context,int GroupPos) {
super();
this.GroupPos = GroupPos;
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = ProgressDialog.show(context, "","Please wait...", true, true);dialog.show();
Log.e("Adapter pre execute ", "in the pre-execute loop");
}
@Override
protected Void doInBackground(Void... params) {
try {
//Constants.listDataChild.clear();Constants.listDataHeader.clear();Constants.productListing.clear();
Log.e(TAG , "in the background-execute loop");
UserFunctions userFunctions = new UserFunctions();
String CategoryID = String.valueOf(Constants.CategoryId.get(GroupPos)); Log.e("CategoryId" , Constants.CategoryId.get(GroupPos));
JSONObject CategoryJson = userFunctions.SingleCategoryListRequest(CategoryID,user_id,stateId,countryID); // Log.i("Product Lisiting Json Array",String.valueOf(CategoryJson));
String result = CategoryJson.getString("result");
Log.i("result",result);
if(result.equals("no records found"))
{
response = "no records found";
}
else
{
response = "record found";
// SearchResult refers to the current element in the array
// "search_result"
JSONObject questionMark = CategoryJson.getJSONObject("result");
Iterator keys = questionMark.keys();
ProductListingDisplayCheck addCheck;
int i = 0;
while (keys.hasNext()) {
// Loop to get the dynamic key
String currentDynamicKey = (String) keys.next(); // Log.i("current Dynamic key",
// String.valueOf(currentDynamicKey));
ArrayList<String> BrandList = new ArrayList<String>();
// Get the value of the dynamic key
JSONObject currentDynamicValue = questionMark.getJSONObject(currentDynamicKey); // Log.i("current Dynamic Value"+String.valueOf(i),
String product_list = currentDynamicValue.getString("product_listing"); // Log.i("product_listing",String.valueOf(product_list));
addCheck = new ProductListingDisplayCheck();
addCheck.setCheckStatus(0);
checkArrayList . add(addCheck);
Log.i("checkArrayList size",String.valueOf(checkArrayList.size()));
JSONArray product_listing = currentDynamicValue.getJSONArray ("product_listing");
BrandList = Constants.listDataChild.get(currentDynamicKey); Log.i("BrandList size", String.valueOf(BrandList.size()));
BrandList.clear();
for (int ii = 0; ii < product_listing.length(); ii++)
{
JSONObject jsonobject = product_listing.getJSONObject(ii);
String JsonObjectString = String.valueOf(jsonobject);
if ( BrandList == null )
{
BrandList = new ArrayList<String>();
Constants.listDataChild.put(currentDynamicKey, BrandList);
}
BrandList.add(JsonObjectString);
}
//HashMap<String, ArrayList<String>> _listDataChild = null;
/* String keyword = "Wipes";
String alternate = ProductListingExpandableListViewActivity.demoJsonObjectTesting;
// check whether the list for keyword is present
ArrayList<String> alternateList = _listDataChild.get(keyword);
if(alternateList == null) {
alternateList = new ArrayList<String>();
_listDataChild.put(keyword, alternateList);
}
alternateList.add(ProductListingExpandableListViewActivity.demoJsonObjectTesting);
*/
Constants.PaginationPosition.set(GroupPos, "2");
Constants.listDataChild.put(Constants.listDataHeader.get(clickedPosition), BrandList);
Log.i("hash map size", String.valueOf(Constants.listDataChild.size()));
/* Update the value of position */
i++;
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
dialog.dismiss();
if(response.equals("no records found"))
{
Toast.makeText(_context, "No Record Found.", 500).show();
}
else
{
ProductListingExpandableAdapter.this.notifyDataSetChanged();
/*Intent showSearchResult = new Intent(_context,ProductListingExpandableListViewActivity.class);
showSearchResult.putExtra("ShowSeachResult", "2");
_context.startActivity(showSearchResult);
((Activity)context).finish();
Apply our splash exit (fade out) and main entry (fade in) animation transitions.
((Activity)context). overridePendingTransition(R.anim.mainfadein, R.anim.splashfadeout);*/
}
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
}
private Drawable Loadimage(String url)
{
try
{
InputStream is = (InputStream) new URL(url).getContent();
Drawable d = Drawable.createFromStream(is, "src name");
return d;
}
catch (Exception e) {
// tv.setText("Exc="+e);
return null;
}
}
}
关于android - 自定义 ExpandableListview,其中包含子项中的另一个展开按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803347/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!