【问题标题】:Hide/unhide layout in list item在列表项中隐藏/取消隐藏布局
【发布时间】:2014-02-02 09:22:10
【问题描述】:

我有一个列表项的布局,它由两个LinearLayouts 组成。我想要实现的是:单击项目时,第二个LinearLayout 应该变得可见/消失,具体取决于当前的可见性。

我正在试验这段代码:

    getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            view.getViewById(R.id.id_of_the_second_linear_layout).setVisibility(View.GONE);
        }
    });

但是,当单击项目时,其他几个线性布局(在不同的项目中)变得可见/隐藏。为什么?

更新:

适配器:

public class ExpensesCursorAdapter extends SimpleCursorAdapter implements SimpleCursorAdapter.ViewBinder { 

public ExpensesCursorAdapter(Context context, Cursor cursor) {

        super(context, R.layout.single_expense, cursor,
            new String[]{
                ExpenseContract._AMOUNT,
                CategoryContract._NAME,
                ExpenseContract._DATE
            },
            new int[]{
                R.id.expense_amount,
                R.id.expense_category,
                R.id.expense_date
            },
            CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

        setViewBinder(this);
    }

    public View getView(int position, View convertView, ViewGroup viewGroup) {
        View v = super.getView(position, convertView, viewGroup);

        final View expandablePanel = v.findViewById(R.id.expandable_panel);
        expandablePanel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                expandablePanel.setVisibility(view.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
            }
        });
        return v;
    }

    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        if (columnIndex == cursor.getColumnIndex(ExpenseContract._AMOUNT)) {
            return handleAmountView((TextView) view, cursor);
        }
        else ...

        return false;
    }

    private boolean handleAmountView(TextView view, Cursor cursor) {
        TextView textView = (TextView) view;

        Double amount = ExpenseDbHelper.getAmount(cursor);
        String formattedAmount = new DecimalFormat("##.00").format(amount);

        textView.setText(formattedAmount);

        return true;
    }
}

每个项目都已在 XML 中添加了 LinearLayout,如果可能,我想切换可见性标志。

【问题讨论】:

    标签: android layout view visibility


    【解决方案1】:

    你在错误的地方写你的逻辑。您想收听 listitem 中的视图点击次数。在 Adapter 的 getView 方法中写下你的逻辑。在你的getView 逻辑可以是这样的

    ll1.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    ll2.setVisibility(View.GONE);
    
                }
            });
    
    ll2.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    ll1.setVisibility(View.GONE);
    
                }
            });
    

    类似的东西。

    【讨论】:

    • 当我将此代码添加到适配器时,会更新几项,然后单击一项: public View getView(int position, View convertView, ViewGroup viewGroup) { View v = super.getView(position, convertView , 视图组); v.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { View expandablePanel = view.findViewById(R.id.expandable_panel); toggleVisibility(expandablePanel); ); } });返回 v; }
    • 可以在您的问题中显示此代码吗?我还看到您没有在 getView() 中夸大任何布局?
    【解决方案2】:

    当您滚动列表项时,某些布局会隐藏和取消隐藏,在这种情况下,如果您的目标是一次只显示一个视图(即一次只考虑一个单元格),那么由于您使用的是cursorAdapter,因此您可以保持所单击项目的位置或 id。否则,如果您正在考虑多个单元格,请维护一个列表,其中存储已被点击的单元格的每个 id。

    将列表或单个位置值传递给adpater,并在getview中比较id或位置,然后执行可见性代码。

    希望这个提示有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多