Java 如何使用自定义行从ArrayAdapter启动onClick方法中的活动

Java 如何使用自定义行从ArrayAdapter启动onClick方法中的活动,java,android,android-arrayadapter,onclicklistener,Java,Android,Android Arrayadapter,Onclicklistener,因此,我编写了一个自定义的ArrayAdapter,用自定义行数据填充ListView,并将OnClickListener设置到每一行。我在这里面临两个主要问题: 指定的活动(InvoiceActivity)不会在单击时启动 当我只输出日志消息(并评论意图和startActivity部分)时,点击的反应时间非常慢 目前,ListView中只有3行伪数据。 我将非常感谢这里的任何帮助,谢谢 public class InvoiceListAdapter extends ArrayAdapter&l

因此,我编写了一个自定义的
ArrayAdapter
,用自定义行数据填充
ListView
,并将
OnClickListener
设置到每一行。我在这里面临两个主要问题:

  • 指定的活动(
    InvoiceActivity
    )不会在单击时启动
  • 当我只输出日志消息(并评论意图和startActivity部分)时,点击的反应时间非常慢
  • 目前,ListView中只有3行伪数据。 我将非常感谢这里的任何帮助,谢谢

    public class InvoiceListAdapter extends ArrayAdapter<InvoiceShort> {
    
    public InvoiceListAdapter(Context context, ArrayList<InvoiceShort> invoices) {
        super(context, R.layout.list_elem, invoices);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final InvoiceShort invoice = getItem(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_elem, parent, false);
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View parent) {
    
                    Log.d("item click", "invoice id: " + invoice.getId());
                    Intent intent = new Intent(getContext(), InvoiceActivity.class);
                    intent.putExtra("id", invoice.getId());
                    getContext().startActivity(intent);
                }
            });
        }
    
        // Lookup view for data population
        TextView date = (TextView) convertView.findViewById(R.id.textDate);
        TextView total = (TextView) convertView.findViewById(R.id.textTotal);
        CheckBox paid = (CheckBox) convertView.findViewById(R.id.checkBoxPaid);
    
        // populate data
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        date.setText(formatter.format(invoice.getDate()));
        total.setText("€ " + new Long(invoice.getTotal()).toString());
        paid.setChecked(invoice.isPaid());
    
        return convertView;
        }
    }
    
    公共类InvoiceListAdapter扩展了ArrayAdapter{
    公共发票列表适配器(上下文上下文,ArrayList发票){
    超级(上下文、右布局、列表元素、发票);
    }
    @凌驾
    公共视图getView(int位置、视图转换视图、视图组父视图){
    最终发票短发票=getItem(位置);
    if(convertView==null){
    convertView=LayoutInflater.from(getContext()).flate(R.layout.list_elem,parent,false);
    convertView.setOnClickListener(新视图.OnClickListener(){
    @凌驾
    公共void onClick(最终视图父视图){
    Log.d(“项目单击”,“发票id:+invoice.getId());
    Intent Intent=新的Intent(getContext(),InvoiceActivity.class);
    intent.putExtra(“id”,invoice.getId());
    getContext().startActivity(意图);
    }
    });
    }
    //数据填充的查找视图
    TextView日期=(TextView)convertView.findViewById(R.id.textDate);
    TextView总计=(TextView)convertView.findViewById(R.id.textTotal);
    复选框paid=(复选框)convertView.findViewById(R.id.checkBoxPaid);
    //填充数据
    DateFormat格式化程序=新的SimpleDataFormat(“yyyy-MM-dd”);
    date.setText(formatter.format(invoice.getDate());
    total.setText(“€”+新长(invoice.getTotal()).toString());
    paid.setChecked(invoice.isPaid());
    返回视图;
    }
    }
    
    编辑:这是一行的xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_centerHorizontal="false"
        android:orientation="horizontal">
    
        <CheckBox
            android:id="@+id/checkBoxPaid"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:checked="true"
            android:elevation="0dp"
            android:inputType="none" />
    
        <EditText
            android:id="@+id/textDate"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="5"
            android:background="@null"
            android:ems="10"
            android:focusable="false"
            android:inputType="none"
            android:text="2017-12-30" />
    
        <EditText
            android:id="@+id/textTotal"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:background="@null"
            android:ems="10"
            android:focusable="false"
            android:inputType="none"
            android:text="10€"
            android:textAlignment="viewStart" />
    
    </LinearLayout>
    

    尝试如下修改您的构造函数:-

    Context mContext;
        public InvoiceListAdapter(Context context, ArrayList<InvoiceShort>    
         invoices) {
        super(context, R.layout.list_elem, invoices);
        mContext = context;
       }
    
    尝试在

    否则


    尝试如下修改您的构造函数:-

    Context mContext;
        public InvoiceListAdapter(Context context, ArrayList<InvoiceShort>    
         invoices) {
        super(context, R.layout.list_elem, invoices);
        mContext = context;
       }
    
    尝试在

    否则


    使用视图上下文启动活动

    Intent intent = new Intent(convertView.getContext(), InvoiceActivity.class);
    intent.putExtra("id", invoice.getId());
    convertView.getContext().startActivity(intent);
    

    使用视图上下文启动活动

    Intent intent = new Intent(convertView.getContext(), InvoiceActivity.class);
    intent.putExtra("id", invoice.getId());
    convertView.getContext().startActivity(intent);
    

    在设置适配器并显示ListView的活动类中实现OnClickListener。

    在设置适配器并显示ListView的活动类中实现OnClickListener。

    因此我终于找到了,简而言之,它将此侦听器设置为ListView一行内的所有视图:

        /** A definition of a listener that does nothing but to let the click be handled by the parent **/
        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position, 0);
            }
        };
    
        date.setOnClickListener(listener);
        total.setOnClickListener(listener);
        paid.setOnClickListener(listener);
    
    为了在MainActivity中为ListView实现
    OnItemClickedListener
    ,我最终找到了,简而言之,它将此listener设置为ListView一行中的所有视图:

        /** A definition of a listener that does nothing but to let the click be handled by the parent **/
        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position, 0);
            }
        };
    
        date.setOnClickListener(listener);
        total.setOnClickListener(listener);
        paid.setOnClickListener(listener);
    

    另外,为了在MainActivity中为ListView实现
    OnItemClickedListener
    ,我找到了解决方案,这里的问题是您的xml中有edittext,但您将其作为Textview获取,您可以将Textview更改为列表元素布局中的edittext单击listener即可。否则,您可以在customAdapter中将textview更改为edittext,并按如下所示设置edittext的双击侦听器以使其正常工作

    date.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    View parent = (View) v.getParent();
                    parent.performClick();
                }
            });
            total.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    View parent = (View) v.getParent();
                    parent.performClick();
                }
            });
    

    我已经找到了解决方案,这里的问题是您的xml中有edittext,但您将其作为Textview获取,您可以将Textview更改为列表元素布局中的edittext单击侦听器将正常工作。否则,您可以在customAdapter中将textview更改为edittext,并按如下所示设置edittext的双击侦听器以使其正常工作

    date.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    View parent = (View) v.getParent();
                    parent.performClick();
                }
            });
            total.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    View parent = (View) v.getParent();
                    parent.performClick();
                }
            });
    


    您可以添加布局xml以进行进一步调查吗@Ferozsiddiqui您可以检查listview.setOnItemClickListener(新建OnItemClickListener(){@Override public void onItemClick(AdapterView父视图,视图视图,int位置,长id){//TODO自动生成的方法存根});是否在主活动中工作否否,我从以这种方式实现它转移到为每一行设置侦听器,因为在此之前,我无法单击行,而只能单击其中的视图。(即使我将其设置为不可聚焦且输入类型为none)这里的问题是编辑文本的焦点越来越集中,或者您的convertview单击焦点越来越低。请将此添加到listview标记android:DegenantFocusability=“AfterDegenders”您是否可以添加布局xml以进行进一步调查这里是@Ferozsiddiqui您可以检查listview.setOnItemClickListener(新建OnItemClickListener()){@Override public void onItemClick(AdapterView父对象、视图、int位置、长id){//TODO自动生成的方法存根});是否在主活动中正常工作否,我从以这种方式实现改为为为每行设置侦听器,因为在此之前,我无法单击行,而只能单击其中的视图。(即使我将其设置为不可聚焦且输入类型为none)这里的问题是编辑文本正在聚焦某些视图或视图单击焦点过低的原因。请将此添加到listview标记android:DegenantFocusability=“AfterDegenders”请尝试将onclick侦听器代码置于if-else循环之外。仍然存在同样的问题@Nikhil Jadhavplease从onclick方法中删除final您是否能够看到任何数据请尝试将onclick侦听器代码置于if-else循环之外。仍然存在同样的问题@Nikhil Jadhavplease从onclick方法中删除final您是否能够看到任何数据他的
    OnClickListener
    不是针对
    ListView
    ,而是针对每一行。当我以类似的方式实现它时,但作为
    适配器的
    oniceclicklistener
    ,我没有得到想要的结果。这是
    OnClickListener
    I