【问题标题】:Change selected item's layout in ListView (Custom Adapter)在 ListView 中更改所选项目的布局(自定义适配器)
【发布时间】:2018-05-31 14:59:48
【问题描述】:

是否可以更改 ListView 中所选项目的布局?

我使用自定义适配器使用 ListView 制作了简单的应用程序。它工作得很好,但我想将所选项目的布局更改为不同的布局。 在实践中,被点击的项目会扩大它的高度并且会出现一些新的按钮。一旦用户取消选择项目,它将返回经典布局。

这是我的自定义适配器代码

public class ListAdapter extends ArrayAdapter<Polozka> {

// context mem variable
private Context mContext;


// Konstruktory
public ListAdapter(Context context,int textViewResourceId){
    super(context,textViewResourceId);
}
public ListAdapter(Context context, int resource, List<Polozka> items){
    super(context,resource,items);
    this.mContext=context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
    View v = convertView;


    if (v == null){
        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.polozkanakupniseznam,null);
    }

    final Polozka p = getItem(position);
    if (p != null){
        final TextView tt1 = (TextView) v.findViewById(R.id.seznam_nazevPolozky);
        TextView tt2 = (TextView) v.findViewById(R.id.seznam_pocetPolozky);
        CheckBox cb1 = (CheckBox) v.findViewById(R.id.checkBox_koupeno);
        Button btnPridat = (Button) v.findViewById(R.id.buttonPridat);
        Button btnOdebrat = (Button) v.findViewById(R.id.buttonOdebrat);

        if (tt1 != null){
            tt1.setText(p.getNazev());
        }

        if (tt2 != null){
            tt2.setText(Integer.toString(p.getPocet()));
        }

    return v;
}}

这就是我将适配器设置为列表视图的方式

        lv = (ListView) findViewById(R.id.lv);
    adapter = new ListAdapter(this,R.layout.polozkaseznam,list);
    lv.setAdapter(adapter);

我想出了如何通过创建新的自定义适配器并将其分配给 ListView 来更改每个项目的布局,但遗憾的是这不是我需要的。

非常感谢!

【问题讨论】:

  • 是的,这是可能的。但最好使用 RecyclerView。显然,您永远找不到与您的代码完全相同的代码。因此,您必须了解其他人的代码才能应用自己的更改。
  • 我来看看 RecyclerView。我已经发现一些文章在不同的帖子中提到了如何使用 RecyclerView 来做到这一点,但我想问一下是否有一些简单的方法也可以使用 ListView 来做到这一点。 :) 感谢您的回复。

标签: java android listview


【解决方案1】:

适配器的getView() 方法用于创建原始视图。在那里,您可以使用视图的 setOnTouchListener() 方法添加 View.OnTouchListener 实现。该类的onTouch() 处理程序接收选定的视图。

添加到 OnTouchListener 实现的有用成员是 GestureDetector;这是使用 OnGestureListener 实现创建的,您可以将在 OnTouchListener 的 onTouch() 回调中收到的 MotionEvent 传递给该实现。然后使用此侦听器来区分各种事件(单击、双击等); GestureDetector.SimpleOnGestureListener 是一个很好的实现,可以与许多处理此类事件的回调一起使用,您可以覆盖。

在某些时候(例如,在 SimpleGestureListener 的 onDown() 回调中,当第一次触摸项目时触发),您可以修改传递给 OnTouchListener 的视图布局。要将其更改回来,您可以使用处理程序来处理手势的“启动”阶段,或者,如果您希望项目保持原样直到选择其他内容,请保留对最后选择的视图的引用并更改它当另一个被选中时。

如果最后一点不清楚,想法是 SimpleGestureListener 是视图的 OnTouchListener 实例的成员对象,因此它可以访问属于封闭 OnTouchListener 的视图。

【讨论】:

  • 为什么不使用AdapterView.OnItemClickListener
  • 感谢您的回复,我会努力解决的。
  • OnItemClickListener() 会更简单,如果您只想响应某人点击该元素,而不是当触摸(手指向下)发生并释放(手指向上)时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多