【问题标题】:Getting a specific item for a row in a ListView获取 ListView 中一行的特定项目
【发布时间】:2018-05-27 01:15:23
【问题描述】:

我制作了一个ListView,其中有一些行。在ItemClickListener我想访问该行的哪个项目被点击了

lstcontact.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            String v=lstcontact.getItemAtPosition(position).toString();
            if(view.getId()==R.id.btncall) {
                Toast.makeText(MainActivity.this, "Make A Call at " + position, Toast.LENGTH_SHORT).show();
            }else if(view.getId()==R.id.btnmess) {
                Toast.makeText(MainActivity.this, "Make A Message at " + position, Toast.LENGTH_SHORT).show();
            } 
        }


    });

我想在用户点击消息或通话按钮时显示祝酒词

【问题讨论】:

标签: android listview onitemclick


【解决方案1】:

您没有为该行中的项目调用 onclick。为此,您需要为您的适配器实现侦听器。

public interface CustomListener{
    void onSomeItemClick(View view);
}

在您的适配器构造函数中,您需要初始化此侦听器;

public YourAdapter(Context context, CustomListener listener, List<YourClass> list){
    this.context = context;
    this.listener = listener;
    this.list = list;
 }

在您创建此适配器的活动中,您需要实现侦听器

adapter = new YourAdapter(this,this,list);

之后你需要重写onSomeItemClick方法

@Override 
public void someItemClick(View view){
    if(view.getId()==R.id.btncall) {
        Toast.makeText(MainActivity.this, "MAke A Call at "+position, Toast.LENGTH_SHORT).show();
    }else if(view.getId()==R.id.btnmess) {
        Toast.makeText(MainActivity.this, "MAke A Message at "+position, Toast.LENGTH_SHORT).show();
    } 
}

在您的适配器的getView() 中,您需要实现onClickListener 您希望在哪个视图中被点击。

view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(listener!=null{
            listener.onSomeItemClick(v);
        }       
    }
});

【讨论】:

    【解决方案2】:

    onItemClick 中的 view 参数是整个 ListView 行(包含所有按钮和所有内容),因此 view.getId() == R.id.btncall 没有意义。

    您最好在自定义适配器中按钮的 onClickListener 中设置 Toast。很高兴看到您的布局/适配器代码,但一个基本的自定义适配器(使用 ViewHolder 模式,以提高效率)可能看起来像这样:

    public class MyListAdapter extends ArrayAdapter<YourItemType> {
    
    static class ViewHolder {
        private Button callButton;
        private Button messageButton;
        // declare any other views you want to control here
    }
    
    
    public MyListAdapter(Context context, List<YourItemType> items) {
        super(context,0,items);
    }
    
    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.your_listview_layout, null);
            holder = new ViewHolder();
            holder.callButton = (Button) convertView.findViewById(R.id.btncall);
            holder.messageButton = (Button) convertView.findViewById(R.id.btnmess);
            // find views for any other views in your ViewHolder / Listview layout
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        YourItemType item = getItem(position);
        holder.callButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // simple say what position is
                Toast.makeText(getContext(), "Make A Call at "+String.valueOf(position), Toast.LENGTH_SHORT).show();
                // do something with the item itself
                Toast.makeText(getContext(), "This toast is for info on the item, which is  "+ item.toString(), Toast.LENGTH_SHORT).show();
    
            }
        });
        holder.messageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // simple say what position is
                Toast.makeText(getContext(), "Make A Call at "+String.valueOf(position), Toast.LENGTH_SHORT).show();
                // do something with the item itself
                Toast.makeText(getContext(), "This toast is for info on the item, which is  "+ item.toString(), Toast.LENGTH_SHORT).show();
            }
        });
        return convertView;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      相关资源
      最近更新 更多