如何结束Android自定义微调器的下拉模式

如何结束Android自定义微调器的下拉模式,android,Android,我正在创建一个微调器实例,绑定到自己的自定义适配器类(从BaseAdapter派生)。在其中,我创建了一组自定义的“单元”线性布局派生实例,这些实例从xml中膨胀出来,用于微调器中的每个项目 一切正常,但只要单击“下拉”模式下的项目,下拉对话框就不会被取消 我可以在我的cell类中捕获单击通知,但是我需要什么魔法来告诉微调器某个项目被选中,并且它应该关闭下拉列表 My cell类由以下xml扩展而来: 谢谢! 猪我会删除整个数据单元类,因为它对您没有好处。如果我不得不猜测的话,微调器的99.9

我正在创建一个微调器实例,绑定到自己的自定义适配器类(从BaseAdapter派生)。在其中,我创建了一组自定义的“单元”线性布局派生实例,这些实例从xml中膨胀出来,用于微调器中的每个项目

一切正常,但只要单击“下拉”模式下的项目,下拉对话框就不会被取消

我可以在我的cell类中捕获单击通知,但是我需要什么魔法来告诉微调器某个项目被选中,并且它应该关闭下拉列表

My cell类由以下xml扩展而来:

谢谢!

我会删除整个
数据单元
类,因为它对您没有好处。如果我不得不猜测的话,
微调器的99.9%的使用并不涉及创建自己的
线性布局的子类


如果这个类有比您选择显示的更多的内容,足以让它变得有价值,那么您不应该截取和使用click事件<代码>微调器
自动处理该操作。如果非要我猜的话,99.999%的
微调器的使用与点击事件中的下拉列表内容无关。

所以你说的单元格窃取点击是对的。但有一个非常简单的解决方案,只是不太明显。我所要做的就是让我的数据单元中的文本视图不响应点击

因此,我完全删除了m_labelName.onClickListener()调用,并在该位置输入以下代码:

m_labelName.setClickable(false);
m_labelName.setFocusable(false);
m_labelName.setFocusableInTouchMode(false);

它应该自动关闭。感觉
微调器没有获取事件。“单元格”中有什么?如何控制微调器中项目的格式?我的cell类的全部要点是允许以后进行扩展,比如在微调器下拉列表中为每个项目添加图标等。这是一种常见的方法(组件化)。如果你知道更好的方法,我洗耳恭听。谢谢。@SwineFaster:“您还可以如何控制微调器内项目的格式?”——只需将适当的XML布局ID(例如,
R.ID.spinner\u项目
)传递给
SpinnerAdapter即可。“这是一种常见的方法(组件化)。”——除非有实质性的业务逻辑,否则在Java中不会“组件化”。Android中的GUI合成是通过布局XML资源处理的。是的,我使用自己的适配器,因为它需要连接到从后端子系统填充的自定义数据模型。
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View.OnClickListener;

// This class is responsible for rendering the data in the model.

public class DataCell extends LinearLayout implements OnClickListener
{
  private final String TAG = getClass().getSimpleName();

    public DataCell(Context context)
    {
        super(context);
        m_context = context;

        final boolean attachToRoot = true;
        LayoutInflater.from(context).inflate(R.layout.data_cell, 
                this, attachToRoot);

    m_labelName = (TextView) findViewById(R.id.STATIC_LEAF_NAME);
    m_labelName.setOnClickListener(this);
    }

    // Update the views with the data corresponding to selection index.
    // If dropDown is true, this view is to be displayed in a dropped down
    // list.
    public void display(int index, ViewGroup parent, Data data, boolean dropDown)
    {
      m_data = data;
        m_labelName.setText(data.getFriendlyName());

        setFocusable(true);
    }

  @Override
  public void onClick(View view)
  {
    ViewParent parent = getParent();
    if(parent instanceof Spinner)
    {
      //((Spinner)parent).setSelection(2);// TODO something here?
    }
  }

  private TextView m_labelName = null;

  @SuppressWarnings("unused")
  private Context m_context = null;

  @SuppressWarnings("unused")
  private Data m_data = null;
}
m_labelName.setClickable(false);
m_labelName.setFocusable(false);
m_labelName.setFocusableInTouchMode(false);