- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
出于某种原因,Item C CardView
是唯一一个动画的 - 即使 Item B 或 Item单击 CardView
。 法语元音 CardView
不适用,因为它工作正常。有谁知道如何解决这个问题以便正确的 CardView 动画?
GridView 的 GridView 自定义类
public class GridViewCustom extends GridView {
public GridViewCustom(Context context) {
super(context);
}
public GridViewCustom(Context context, AttributeSet attrs) {
super(context, attrs);
}
public GridViewCustom(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightSpec;
if (getLayoutParams().height == AbsListView.LayoutParams.WRAP_CONTENT) {
heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
}
else {
//Any other height should be respected as is.
heightSpec = heightMeasureSpec;
}
super.onMeasure(widthMeasureSpec, heightSpec);
}
}
fragment 类
public class MyFragmentRV extends android.support.v4.app.Fragment {
private Boolean mCurrentValue;
public int mGridViewHeight;
public int txtSubtitleHeight;
private static final int ITEM_TYPE = 100;
private static final int HEADER_TYPE = 101;
private static final int HEADER_TYPE_2 = 102;
private static final int GRID_TYPE = 103;
ValueAnimator mAnimatorGV, mAnimatorTV;
TextView txtArrowGV, txtTitle;
static final String[] frenchVowels = new String[]{
"a", "e", "i", "o", "u", "y"
};
public MyFragmentRV.MyAdapter adapterGV;
public MyFragmentRV() {}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_rv, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
View v = getView();
assert v != null;
recyclerView = v.findViewById(R.id.my_recyclerview);
// set the linear layout manager
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
// SpannableStrings
int[] attrS = {R.attr.spannablestringtextColor};
TypedArray ta = getActivity().getTheme().obtainStyledAttributes(attrS);
int colorSS = ta.getColor(0, Color.BLACK); //Color.BLACK - default value (colour will change automatically depending on chosen theme)
Log.d(TAG, "clickMethod 1) " + Integer.toHexString(colorSS));
ta.recycle();
// SpannableString (start)
SpannableStringBuilder ssb = new SpannableStringBuilder();
SpannableString str1 = new SpannableString(" Item A ");
str1.setSpan(new BackgroundColorSpan(Color.BLACK), 0, str1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str1.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.yellow)), 0, str1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.append(str1);
SpannableString str2 = new SpannableString(" Hello World");
str2.setSpan(new ForegroundColorSpan(colorSS), 0, str2.length(), 0);
ssb.append(str2);
// SpannableString (end)
// init data
data = new ArrayList<>();
data.add(ssb);
data.add("Item B");
data.add("Item C");
subdata = new ArrayList<>();
subdata.add("\u2022 a");
subdata.add("\u2022 b\n\u2022 bb");
subdata.add("\u2022 c\n\u2022 cc\n\u2022 ccc");
adapter = createAdapter();
recyclerView.setAdapter(adapter);
super.onActivityCreated(savedInstanceState);
}
RecyclerView recyclerView;
ArrayList<CharSequence> data;
ArrayList<String> subdata;
RecyclerView.Adapter<ViewHolder> adapter;
// creates the adapter
private RecyclerView.Adapter<ViewHolder> createAdapter() {
return new RecyclerView.Adapter<ViewHolder>() {
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int type) {
switch (type) {
case HEADER_TYPE:
return new ViewHolder(inflateHelper(R.layout.header, parent));
case HEADER_TYPE_2:
return new ViewHolder(inflateHelper(R.layout.header, parent));
case ITEM_TYPE:
return new ViewHolder(inflateHelper(R.layout.recyclerview_item_tv, parent));
case GRID_TYPE:
return new ViewHolder(inflateHelper(R.layout.recyclerview_item_gv, parent));
default:
return new ViewHolder(inflateHelper(R.layout.recyclerview_item_tv, parent));
}
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
final Typeface iconFont = FontManager.getTypeface(getContext(), FontManager.FONTAWESOME);
switch (getItemViewType(position)) {
case HEADER_TYPE:
Button expandButton = viewHolder.itemView.findViewById(R.id.button);
expandButton.setText("Expand all");
break;
case HEADER_TYPE_2:
Button collapseButton = viewHolder.itemView.findViewById(R.id.button);
collapseButton.setText("Collapse all");
break;
case ITEM_TYPE:
// get the current item
CharSequence itemA = data.get(position - 3);
String itemB = subdata.get(position - 3);
//
txtTitle = viewHolder.itemView.findViewById(R.id.tv_tv_A);
txtTitle.setText(itemA);
final TextView txtSubtitle = viewHolder.itemView.findViewById(R.id.tv_tv_B);
txtSubtitle.setText(itemB);
txtSubtitle.setVisibility(View.GONE);
//Add onPreDrawListener
txtSubtitle.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
txtSubtitle.getViewTreeObserver().removeOnPreDrawListener(this);
txtSubtitle.setVisibility(View.GONE);
final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
txtSubtitle.measure(widthSpec, heightSpec);
txtSubtitleHeight = txtSubtitle.getMeasuredHeight();
return true;
}
});
final TextView txtArrowTV = viewHolder.itemView.findViewById(R.id.tv_tv_expandcollapse);
txtArrowTV.setText(R.string.fa_icon_chevron_down);
txtArrowTV.setTypeface(iconFont);
//
CardView cardView = viewHolder.itemView.findViewById(R.id.cv_tv);
LinearLayout mLinearLayoutTV = viewHolder.itemView.findViewById(R.id.cardview_tv_titlerow);
//
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(txtSubtitle.getVisibility() == View.GONE){
expandTV(txtSubtitle, txtArrowTV);
} else {
collapseTV(txtSubtitle, txtArrowTV);
}
}
});
mLinearLayoutTV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(txtSubtitle.getVisibility() == View.GONE){
expandTV(txtSubtitle, txtArrowTV);
} else {
collapseTV(txtSubtitle, txtArrowTV);
}
}
});
txtArrowTV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(txtSubtitle.getVisibility() == View.GONE){
expandTV(txtSubtitle, txtArrowTV);
} else {
collapseTV(txtSubtitle, txtArrowTV);
}
}
});
break;
case GRID_TYPE:
TextView titleG = viewHolder.itemView.findViewById(R.id.tv_gv_A);
titleG.setText("French vowels");
txtArrowGV = viewHolder.itemView.findViewById(R.id.tv_gv_expandcollapse);
txtArrowGV.setText(R.string.fa_icon_chevron_down);
txtArrowGV.setTypeface(iconFont);
final GridView mGridViewA = viewHolder.itemView.findViewById(R.id.gv);
mGridViewA.setVisibility(View.GONE);
mGridViewA.setEnabled(false);
mGridViewA.setVerticalScrollBarEnabled(false);
adapterGV = new MyFragmentRV.MyAdapter(getActivity().getApplicationContext(), 0);
mGridViewA.setAdapter(adapterGV);
for (String fVowel : fVowels) {
adapterGV.addAdapterItem(new MyFragmentRV.AdapterItem(fVowel));
}
//Add onPreDrawListener
mGridViewA.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mGridViewA.getViewTreeObserver().removeOnPreDrawListener(this);
mGridViewA.setVisibility(View.GONE);
final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
mGridViewA.measure(widthSpec, heightSpec);
mGridViewHeight = mGridViewA.getMeasuredHeight();
return true;
}
});
CardView cardViewG = viewHolder.itemView.findViewById(R.id.cv_gv);
LinearLayout mLinearLayoutGV = viewHolder.itemView.findViewById(R.id.cardview_gv_titlerow);
cardViewG.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mGridViewA.getVisibility() == View.GONE){
expandGV(mGridViewA);
} else {
collapseGV(mGridViewA);
}
}
});
mLinearLayoutGV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mGridViewA.getVisibility() == View.GONE){
expandGV(mGridViewA);
} else {
collapseGV(mGridViewA);
}
}
});
txtArrowGV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mGridViewA.getVisibility() == View.GONE){
expandGV(mGridViewA);
} else {
collapseGV(mGridViewA);
}
}
});
break;
}
}
@Override
public int getItemCount() {
return data.size() + 3;
}
@Override
public int getItemViewType(int position) {
switch (position) {
case 0:
return HEADER_TYPE;
case 1:
return HEADER_TYPE_2;
case 2:
return GRID_TYPE;
default: return ITEM_TYPE;
}
}
};
}
private View inflateHelper(int resId, ViewGroup parent) {
return LayoutInflater.from(getActivity()).inflate(resId, parent, false);
}
class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
}
public void expandGV() {
mGridViewA.setVisibility(View.VISIBLE);
txtArrowGV.setText(R.string.fa_icon_chevron_up);
ValueAnimator mAnimatorGV = slideAnimator(0, mGridViewHeight);
mAnimatorGV.start();
}
public void collapseGV() {
txtArrowGV.setText(R.string.fa_icon_chevron_down);
int finalGVHeight = mGridViewA.getHeight();
mAnimatorGV = slideAnimator(finalGVHeight, 0);
mAnimatorGV.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationEnd(Animator animator) {
mGridViewA.setVisibility(View.GONE);
}
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
mAnimatorGV.start();
}
public void expandTV() {
txtSubtitle.setVisibility(View.VISIBLE);
txtArrowTV.setText(R.string.fa_icon_chevron_up);
mAnimatorTV = slideAnimator(0, txtSubtitleHeight);
mAnimatorTV.start();
}
public void collapseTV() {
txtArrowTV.setText(R.string.fa_icon_chevron_down);
int finalTVHeight = txtSubtitle.getHeight();
mAnimatorTV = slideAnimator(finalTVHeight, 0);
mAnimatorTV.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationEnd(Animator animator) {
txtSubtitle.setVisibility(View.GONE);
}
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
mAnimatorTV.start();
}
public ValueAnimator slideAnimator(int start, int end, final View txtSubtitle) {
final ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
// update height
int value = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParamsTV = txtSubtitle.getLayoutParams();
layoutParamsTV.height = value;
txtSubtitle.setLayoutParams(layoutParamsTV);
}
});
return animator;
}
/// Adapter for GridView
private class MyAdapter extends ArrayAdapter<MyFragmentRV.AdapterItem> {
private List<MyFragmentRV.AdapterItem> items = new ArrayList<>();
MyAdapter(Context context, int textviewid) {
super(context, textviewid);
}
void addAdapterItem(MyFragmentRV.AdapterItem item) {
items.add(item);
}
@Override
public int getCount() {
return items.size();
}
@Override
public MyFragmentRV.AdapterItem getItem(int position) {
return ((null != items) ? items.get(position) : null);
}
@Override
public long getItemId(int position) {
return position;
}
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull final ViewGroup parent) {
View rowView;
if (convertView == null) {
rowView = getActivity().getLayoutInflater().inflate(R.layout.gridview_item, parent, false);
} else {
rowView = convertView;
}
TextView tv = rowView.findViewById(R.id.item_gridview);
tv.setText(items.get(position).first);
return rowView;
}
}
public class AdapterItem {
String first;
//add more items
AdapterItem(String first) {
this.first = first;
}
}
}
基于 Nikhil 的建议
最佳答案
这里的问题是您将 txtSubtitle
存储为 Fragment 的成员变量。因此,当 GridView
完成网格项的初始化后,txtSubtitle
将具有最后分配的 TextView,在您的情况下为 Item C。因此,当您执行动画时,它始终会应用于项目 C。这里的解决方案是使 txtSubtitle
成为 local Final
变量。从 MyFragmentRV 中删除 TextView txtArrowGV、txtArrowTV、txtTitle、txtSubtitle;
。如果ITEM_TYPE
:
final TextView txtSubtitle = viewHolder.itemView.findViewById(R.id.tv_tv_B);
....
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(txtSubtitle.getVisibility() == View.GONE){
expandTV(txtSubtitle);
} else {
collapseTV(txtSubtitle);
}
}
});
将 txtSubtitle
传递到 expandTV
、collapseTV
和 expandTV
中:
public void expandTV(TextView txtSubtitle) {
txtSubtitle.setVisibility(View.VISIBLE);
txtArrowTV.setText(R.string.fa_icon_chevron_up);
mAnimatorTV = slideAnimator(0, txtSubtitleHeight);
mAnimatorTV.start();
}
编辑:将幻灯片动画器功能更改为:
public ValueAnimator slideAnimator(int start, int end,TextView txtSubtitle) {
final ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
// update height
int value = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParamsTV = txtSubtitle.getLayoutParams();
layoutParamsTV.height = value;
txtSubtitle.setLayoutParams(layoutParamsTV);
}
});
return animator;
}
并这样调用它:
mAnimatorTV = slideAnimator(0, txtSubtitleHeight,txtSubtitle);
mAnimatorTV.start();
关于java - 单击时 CardView 展开/折叠不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52412450/
我在选项卡中有我的网络应用程序的选项。 aaa bbb ccc ddd eee 当用户单击任何选项卡(在同一窗口中)时,我会使用此代码获得淡出效果,然后自动
如何获得一个简单的调用单击来实现如下功能:http://jsfiddle.net/ftwPS/6/我显然错过了一些基本的东西,因为当您单击“CLICK”时这不起作用。 $('tr').click(fu
我有一个列表,在左侧显示一个插入符号图标,单击它时应该更改图标。每当我单击一个图标时,所有图标都会更改。 detailedInfo = []; subordinateInfo; openSu
我有一个 div,我想对其进行设置,以便当我单击其他内容时,它会隐藏该 div。 我也是这样 $('body').click(function(){ if(loginOpened) {
我有很多装有不同内容的盒子。 如果单击第一个框,您可以看到一个包含更多详细信息的弹出框。如果单击第二个、第三个等框,您必须查看这些框的详细信息。 我的问题:如果我点击框号。 2 我看到了盒子号的详细信
当我点击 .add-btn 时,我将 .add-btn 的样式更改为 background:#cccccc 并将 val() 更改为“-”。 现在当我用 tr td .list 删除添加的文本时,它是
感谢 SO 的出色贡献者!当您开始了解 jQuery 时,它会变得更酷。 :) 所以我有一个 LI,单击时会显示/隐藏子 UL。我想做的是能够单击 LI 内的链接,打开一个空白窗口,但也不会关闭子 U
我有这份文档,它使我能够获得一份带有点击进度的多项选择选择调查问卷。 如何用图像代替此处的文字? (并且仍然有这样的机制,一旦单击[图像],就会提出下一个问题) 我已经尝试使用 UL/H1 设置背景图
我想在 JQGrid 的刷新按钮单击上编写代码。有什么事件吗? 最佳答案 如果您需要在开始刷新之前执行一些操作,您应该使用 beforeRefresh打回来: $("#grid_id").jqGrid
问题是将对象或多个参数从模板传递到组件,并使用它们将数据添加到 API。 任务.service.ts addTasks(task: Task): Observable{ let headers =
我有一个像这样的primefaces选项卡 View : This tab has static content. this t
我在 jquery 中有一个有效的 a.click() 函数...但是如果我单击一个 anchor ,我会打开一个新窗口...但是我怎样才能阻止浏览器本身打开一个新窗口? 示例: $('a')
有没有简单的方法来创建代码:如果 URL 更改或单击链接显示 div(例如加载 gif 3 秒),则显示页面?有点像空白的白色页面,加载 gif 旋转 3 秒然后显示页面? 谢谢! 最佳答案 给定 G
我需要知道此时按钮的状态是否被点击? 谢谢 最佳答案 if (myButton.state & UIControlStateHighlighted) { // Do your stuff the
我正在 NSImageView 上绘制一条 NSBezierPath 线。我正在创建 NSBezierPath 对象,设置 moveToPoint,设置 lineToPoint,设置 setLineW
我的 Selenium 代码存在问题,无法正确执行按键 + 单击操作。 测试应打开 jqueryui.com 链接并选择页面上的前 2 个 li 元素。 我正在使用 Selenium 2.23 和 F
单击时我将更改字符串一部分的样式。例如“TEXT”,然后单击“T”,之后它会将样式从黑色更改为红色,仅 T在我的代码中,当我单击文本时,我拆分文本并保留在“split”数组中,它将调用handleCl
我在网站上有一个 anchor 。当有人点击它时,我在 jquery 中执行一些操作并更改名称,但是当再次单击它时,事件被触发,尽管我已经更改了它的名称。代码在这里: $(".like_cont a[
我有一个下载链接Download我希望每次当有人点击“下载”时,我都可以将其插入数据库total_downloads+1。为了插入数据库,我通常使用 然后 if (isset($_POST['d
我是一名优秀的程序员,十分优秀!